react 对于 hooks 的调用顺序是有要求的,要求 hooks 的调用顺序要相同(不能在 if 语句中使用 useState ) ,才能保证 useState 获得正确的 state
但是文档里面只规定了 hooks 要按顺序(我理解的 hooks 是不返回 ui 的逻辑组件),却没有规定使用 useState 的 ui 组件的也要按顺序
那么,通过 if 语句进行条件渲染,渲染使用了 useState 的 ui 组件是否会导致 useState 得到的错误的 state ?
例如组件 Component,里面使用了 useState
const Component = (props) => {
const [state] = useState(props.prop)
console.log(state)
return <h1>{state}</h1>
}
然后根据条件渲染两个这样的组件
function App() {
const [state, setState] = useState(0)
useEffect(
() => {
setTimeout(() => {
setState(1)
}, 1000)
}
)
return (
<div>
{state === 0 ? <Component prop={[1, 2, 2, 3]}/> : null}
<Component prop={'strange'}/>
</div>
);
}
这个代码的逻辑是:一开始渲染了两个 Component,1s 后 state 变为 1,第一个组件被移除,第二个组件 rerender
按照我的理解:useState 的数据在一个链表中,第一个 Component 没有被调用,链表的指针还是指向第一个 Component 的 state,那么第二个 Component 在 useState 的时候应该拿到的是第一个组件的 state
但结果是,第二个 Component 还是拿到了属于它的正确的 state,react 也没有报错,为什么呢?
我查了半天,Google 上全是说 hooks 的调用要按顺序,查不到使用了 useState 的 ui 组件要不要按顺序。如果确实可以不按顺序调用的话,react 是如何做到的?
学了一天多的 react,实在找不到这个问题的资料:((
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.