Comments (6)
This should not be the expected behavior, see this example.
import { useMemo, useLayoutEffect, useEffect } from 'react'
let count = 0
export default function App() {
const obj = useMemo(() => ({ id: count++ }), [])
console.log(`render ${obj.id}`)
useLayoutEffect(() => {
console.log(`useLayoutEffect ${obj.id}`)
return () => console.log(`useLayoutEffect(cleanup) ${obj.id}`)
}, [obj])
useEffect(() => {
console.log(`useEffect ${obj.id}`)
return () => console.log(`useEffect(cleanup) ${obj.id}`)
}, [obj])
return <></>
}
The current behavior:
render 0
render 1
useLayoutEffect 1
useEffect 1
useLayoutEffect(cleanup) 1
useEffect(cleanup) 1
useLayoutEffect 1
useEffect 1
The expected behavior:
render 0
render 1
useLayoutEffect 0
useEffect 0
useLayoutEffect(cleanup) 0
useEffect(cleanup) 0
useLayoutEffect 1
useEffect 1
This is very bad.
If your useMemo
returns an AbortController
whose cleanup function is controller.abort()
,
then your controller.signal
will be aborted at the beginning because it actually performs the cleanup function on the second controller.
from react.
@MaciejNiklasinski I think you could add these block inside the useEffect
function and it will work as you expect:
if (ref.current === null) {
const id = map.size; //Symbol();
const handle = { id };
console.log(`Adding Symbol ${id} to map`);
map.set(id, handle);
ref.current = handle;
}
I also noticed that in the component before first mount the mentioned code gets triggered twice. And both time ref.current
is null
and map add two elements. Actually, the same behavior as you mentioned. Yeah, and only in the Strict Mode
from react.
@Werter12 Thank you for your suggestion, unfortunately in my real use case it won't work.
I need the handle object to be created and added to the map before the function returns the first time.
export const useSubscribction = () => {
const ref = useRef(null);
if (ref.current === null) {
const id = Symbol();
const handle = { id };
map.set(id, handle);
ref.current = handle;
}
useEffect(() => () => { map.delete(ref.current.id); }, [] );
// At this point before the function returns the first time I need a handle object to already exist.
// If it is moved to the useEffect (componentDidMount equivalent part) that will not be the case.
};
from react.
I've also encountered this bug: in strict mode, this
inside a class component will point to the second instance in both cases of componentDidMount()
/ componentWIllUnmount()
.
- Component instance A is created
- Component instance B is created
componentDidMount()
is called withthis
beingB
componentWillUnmount()
is called withthis
beingB
componentDidMount()
is called withthis
beingB
Because of that, clean-up is not possible and various "stale props" bugs occur because componentWillUnmount()
performs a clean-up of the instance B
which is the one that React keeps while the instance A
is what React disposes of but that instance A
remains "uncleaned" and its event listeners still operate.
I've submitted a separate bug report: #26467
from react.
@MaciejNiklasinski Have a look at my bug report: #26467
Is it the same issue? If yes then I guess the "weird" behavior is an intentional one to reveal the components that rely on doing stuff during render ("side effects").
from react.
I have same problem, described it in different issue #25284 (comment).
from react.
Related Issues (20)
- Feature: Release ReactCurrentDispatcher as a consumable API to be used in conjunction with useExternalSyncStore
- Bug: dynamic import component which use useMemo internaly failed HOT 2
- Bug: Add LinkedIn Tab to website HOT 9
- Bug: HTML element <col> cannot be used as a direct descendant of <table> HOT 1
- Bug: Error in the react web page. (Go full-stack with a framework) HOT 17
- [DevTools Bug] Cannot add node "295" because a node with that id is already in the Store. HOT 1
- Lightweight React 19.x [Feature request/Suggestion] HOT 1
- Bug: test HOT 1
- Bug: useEffect runs with newer scope than the one that triggered the effect HOT 4
- [DevTools Bug] Could not find node with id "155" in commit tree HOT 1
- [DevTools Bug]: _jsxDEV is not a function HOT 3
- Bug: Runtime Error App.js: (0 , _reactDom.useFormStatus) is not a function (5:22) HOT 3
- Bug: Server renders inconsistent attribute values HOT 6
- Questions and Help: useMemo vs Normal Object HOT 1
- Components and Profiler don't appear in DevTools HOT 3
- Bug: Should have an queue. This is likely to bug in react. Please file an issue HOT 6
- Bug: Tab focus does not move to the correct element in Firefox when unmounting on key down HOT 1
- NYT: Scripts executing in `dangerouslySetInnerHTML` interfere with `hydrateRoot`, causing a client-side re-render HOT 12
- [DevTools Bug]: React instrumentation encountered an error: TypeError: e.hasOwnProperty is not a function. HOT 4
- Bug: Different file (/usr/share/nodejs/react-is/index.js ) contents when installing via "apt install" and build from source, install package. HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from react.