hooks icon indicating copy to clipboard operation
hooks copied to clipboard

react 18 useEffect 执行两次的问题

Open faner11 opened this issue 2 years ago • 5 comments

在react 18中开启严格模式,useEffect 会被执行两次,同样useMount之类也会执行两次,这是一次破坏性更新,不是bug,但是确实会出问题,ahook是否有计划提供在react18 严格模式优雅的 useEffect 方案

https://github.com/reactwg/react-18/discussions/19

faner11 avatar May 15 '22 07:05 faner11

正在改造中,但是严格模式 useEffect/useMount 执行两次是不可避免的。

brickspert avatar May 15 '22 08:05 brickspert

正在改造中,但是严格模式 useEffect/useMount 执行两次是不可避免的。

useEffect 不能把它当作生命周期来看。

但是 useMount 的定位是把它是等价成 componentDidMount 来做的吧。

const useMount = (fn: VoidFunction) => {
	const didMoment = useRef(false)
	useEffect(() => {
		if (didMoment.current === true) return
		didMoment.current = true
		fn?.()
	}, [])
}

那这样改是不是可以避免两次执行。

RaindropSaber avatar May 25 '22 15:05 RaindropSaber

正在改造中,但是严格模式 useEffect/useMount 执行两次是不可避免的。

useEffect 不能把它当作生命周期来看。

但是 useMount 的定位是把它是等价成 componentDidMount 来做的吧。

const useMount = (fn: VoidFunction) => {
	const didMoment = useRef(false)
	useEffect(() => {
		if (didMoment.current === true) return
		didMoment.current = true
		fn?.()
	}, [])
}

那这样改是不是可以避免两次执行。

这是 react 的规则,我们不应该去破坏。

crazylxr avatar Jun 20 '22 11:06 crazylxr

这是 react 的规则,我们不应该去破坏。

但我理解,useMount就只应该执行一次,这和react的规则无关。 只是要在react的规则下,实现一个useMount。

RaindropSaber avatar Jun 21 '22 07:06 RaindropSaber

这是 react 的规则,我们不应该去破坏。

但我理解,useMount就只应该执行一次,这和react的规则无关。 只是要在react的规则下,实现一个useMount。

为啥 useMount 就应该只执行一次呢,componentDidMount 也会执行两次

crazylxr avatar Jun 29 '22 01:06 crazylxr