A note about not firing side effects in useState(prev => next) ?
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 11.8k
- Forks
- 7.9k
- Avg merge
- 1d 11h
- Merged PRs (30d)
- 11
Description
So I ended up doing this by mistake after a wonky merge:
let Foo = (props) => {
let [bar, setBar] = useState();
let handleClick = () => {
useState(bar => {
let newBar = bar + 1;
props.handleBarChange(newBar); // bad, which isn't surprising
return newBar;
});
};
return <div onClick={handleClick}>click me</div>;
};
If you fire a side effect such as calling something that sets state in a higher component from a useState updater function, you get the error "Cannot update a component from inside the function body of a different component" (but not always! It seems to depend on internal timing). This definitely seems like a bad idea when you look at it, but I couldn't find any mention in the docs that this is bad.
https://reactjs.org/docs/hooks-reference.html#functional-updates
There is the note about side effects generally on useEffect:
Mutations, subscriptions, timers, logging, and other side effects are not allowed inside the main body of a function component (referred to as React’s render phase)
But this is not in the main body of a function component, doesn't feel like a true side effect as it's still just setting state within React, and doesn't feel like it's in the render phase either.
I initially wanted to comment about this here (https://github.com/facebook/react/issues/18178), because the general message of that thread was "don't set state of another component in a render method", and I've managed to get this error message without doing that, but the thread is locked. Thanks.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked Hooks reference page, especially the functional updates section, and compare its guidance with the quoted useEffect side-effect note. Clarify whether side effects inside a useState updater are unsupported and explain the relevant behavior; done means the documentation addresses this example without ambiguity.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, react
- Domain
- documentation
- Issue type
- Documentation
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100