Home  >  Article  >  Web Front-end  >  Do React Event Listeners Display Unexpected State Changes within Functional Components?

Do React Event Listeners Display Unexpected State Changes within Functional Components?

DDD
DDDOriginal
2024-10-18 20:17:03415browse

Do React Event Listeners Display Unexpected State Changes within Functional Components?

Wrong React Hooks Behavior with Event Listener

In this inquiry, we encounter an issue while working with React Hooks. When utilizing an event listener to handle a button click, the console log displays an incorrect state.

Problem Description

In the provided CodeSandbox, observe the following steps:

  1. Click the "Add card" button twice to create two cards.
  2. For the first card, click "Button1" and verify in the console that it correctly logs the presence of two cards.
  3. For the first card, click "Button2," which is controlled by an event listener. Observe that the console now shows only one card.

This behavior is unexpected, as "Button2" for the first card should also display the presence of two cards.

Cause of the Issue

This issue stems from differing event handler handling in the CardsProvider and Card components.

  • CardsProvider: Event handlers are recreated each time the component renders, referencing a stale state when defined.
  • Card: Event handlers are registered upon component mount and receive fresh state when passed as props. However, one event handler (handleCardClick) is only registered once and perpetually references stale state.

Solution Approaches

Addressing this problem requires careful consideration of event handling approaches in functional components using the useState hook. Here are several options:

1. Mutable State:

Use useRef instead of useState to introduce a mutable object that holds the current state. While this approach allows for direct state mutation, it goes against the recommended practices for React development.

2. State Updater Function:

Whenever an event listener is registered, pass a state updater function that receives the fresh state instead of the stale state from the enclosing scope. This ensures that the event listener always has access to the most up-to-date state.

3. Manual Event Listener Re-registration:

Reregister the event listener every time the state changes. This ensures that the callback always receives the latest state information.

4. Built-In Event Handling:

For event listeners within the component's scope, utilize React's built-in event handling by defining the event listener directly within the JSX. This eliminates the need for useEffect and ensures that the event listener always receives the current state.

The above is the detailed content of Do React Event Listeners Display Unexpected State Changes within Functional Components?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn