Article image Handling Events in React

10. Handling Events in React

Page 40 | Listen in audio

Handling events in React is a fundamental concept that enables you to create interactive user interfaces. Just like in traditional JavaScript, React allows you to capture user actions such as clicks, form submissions, and keyboard events. However, React's approach to handling events is different from standard HTML and JavaScript, offering a more streamlined and efficient way to manage user interactions.

In React, events are handled using camelCase syntax rather than lowercase. For example, the HTML onclick event is written as onClick in React. Additionally, instead of passing a string, you pass a function as the event handler. This function is called when the event occurs.

Understanding Synthetic Events

React implements a cross-browser wrapper around the browser's native event system called Synthetic Events. This wrapper ensures that the events behave consistently across all browsers. Synthetic Events are React's way of abstracting away the differences between browsers, providing a single API for event handling.

One of the key benefits of Synthetic Events is that they are pooled for performance reasons. This means that the event object is reused across different events, which reduces the overhead of creating and destroying event objects. However, this also means that you cannot access the event properties asynchronously, as they will be nullified after the event handler has been executed. If you need to access the event properties asynchronously, you should call event.persist() to remove the event from the pool.

Adding Event Handlers

To add an event handler in React, you simply need to pass a function as a prop to the relevant element. Here's a basic example of handling a click event:


import React from 'react';

function App() {
  function handleClick() {
    alert('Button clicked!');
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}

export default App;

In this example, we define a function handleClick that shows an alert when the button is clicked. We then pass this function to the onClick prop of the button element.

Passing Arguments to Event Handlers

Sometimes, you may need to pass arguments to your event handlers. There are several ways to achieve this in React:

  1. Using an Arrow Function: You can use an arrow function to pass additional arguments to the event handler.

import React from 'react';

function App() {
  function handleClick(message) {
    alert(message);
  }

  return (
    <button onClick={() => handleClick('Hello, World!')}>
      Click me
    </button>
  );
}

export default App;

In this example, we use an arrow function to call handleClick with a custom message.

  1. Using the Bind Method: Alternatively, you can use the bind method to pass arguments to the event handler.

import React from 'react';

function App() {
  function handleClick(message) {
    alert(message);
  }

  return (
    <button onClick={handleClick.bind(null, 'Hello, World!')}>
      Click me
    </button>
  );
}

export default App;

Here, we use bind to pass the message argument to handleClick.

Handling Events in Class Components

In class components, event handling is slightly different due to the nature of class methods. You need to bind the event handler methods to the class instance, usually in the constructor:


import React, { Component } from 'react';

class App extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    alert('Button clicked!');
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        Click me
      </button>
    );
  }
}

export default App;

In this example, we bind handleClick to the class instance in the constructor. This ensures that this inside the method refers to the class instance.

Alternatively, you can use public class fields syntax to avoid explicit binding:


import React, { Component } from 'react';

class App extends Component {
  handleClick = () => {
    alert('Button clicked!');
  };

  render() {
    return (
      <button onClick={this.handleClick}>
        Click me
      </button>
    );
  }
}

export default App;

With this approach, handleClick is defined as a class property, which automatically binds it to the class instance.

Preventing Default Behavior

In some cases, you may want to prevent the default behavior of an event, such as preventing a form submission. In React, you can call event.preventDefault() to achieve this:


import React from 'react';

function App() {
  function handleSubmit(event) {
    event.preventDefault();
    alert('Form submitted!');
  }

  return (
    <form onSubmit={handleSubmit}>
      <button type="submit">Submit</button>
    </form>
  );
}

export default App;

In this example, handleSubmit prevents the form from being submitted by calling event.preventDefault(), allowing you to handle the form submission manually.

Event Pooling and Asynchronous Access

As mentioned earlier, Synthetic Events are pooled for performance reasons. This means that you cannot access the event properties asynchronously. If you need to do so, you should call event.persist() to remove the event from the pool:


import React from 'react';

function App() {
  function handleClick(event) {
    event.persist();
    setTimeout(() => {
      alert('Button clicked: ' + event.type);
    }, 1000);
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}

export default App;

In this example, we call event.persist() to allow asynchronous access to the event properties.

Common Event Types

React supports a wide range of event types, similar to those in HTML and JavaScript. Some of the most commonly used event types include:

  • Mouse Events: onClick, onDoubleClick, onMouseEnter, onMouseLeave, etc.
  • Keyboard Events: onKeyDown, onKeyPress, onKeyUp, etc.
  • Form Events: onChange, onSubmit, onFocus, onBlur, etc.
  • Focus Events: onFocus, onBlur.
  • Touch Events: onTouchStart, onTouchMove, onTouchEnd, etc.

Each of these event types can be handled using the same principles discussed above.

Conclusion

Handling events in React is a powerful way to create interactive and dynamic user interfaces. By understanding the nuances of Synthetic Events, event pooling, and the differences between class and functional components, you can effectively manage user interactions in your React applications. Remember to use camelCase for event handlers, bind class methods when necessary, and utilize event.persist() for asynchronous access to event properties. With these tools at your disposal, you can build rich, responsive applications that provide an engaging user experience.

Now answer the exercise about the content:

What is a key difference between handling events in React compared to traditional HTML and JavaScript?

You are right! Congratulations, now go to the next page

You missed! Try again.

Article image Conditional Rendering

Next page of the Free Ebook:

41Conditional Rendering

9 minutes

Earn your Certificate for this Course for Free! by downloading the Cursa app and reading the ebook there. Available on Google Play or App Store!

Get it on Google Play Get it on App Store

+ 6.5 million
students

Free and Valid
Certificate with QR Code

48 thousand free
exercises

4.8/5 rating in
app stores

Free courses in
video, audio and text