Recoil原子更新触发重渲染时,是否保证父组件优先执行?
Recoil组件重渲染顺序疑问解答
先看你提供的代码示例:
const fooState = atom<string | null>({ key: 'foo', default: "Hello" }); const A = () => { const foo = useRecoilValue(fooState); if(foo === null) { return null; } return <B /> } const B = () => { const foo = useRecoilValue(fooState); if(foo === null) { throw new Error('This can\'t happen.'); } // ... }
针对你的三个疑问,解答如下:
普通场景下,Recoil是否保证父组件优先重渲染?
不保证。Recoil的组件重渲染触发逻辑基于原子订阅,不会严格遵循React组件的父子层级顺序调度重渲染。你测试时的符合预期只是偶然情况,并非Recoil的约定行为。若不保证,示例逻辑在Recoil中是否不可行?
是的,这个逻辑在Recoil里不可靠。依赖父组件先渲染来卸载子组件以避免报错的逻辑,本质是依赖React原生更新流程(父组件更新先于子组件),React Context遵循该流程所以逻辑可行;但Recoil的重渲染调度独立于React父子层级更新顺序,无法保证父组件先完成渲染并卸载子组件。Recoil原子更新时,触发组件重渲染的顺序是怎样的?
Recoil的重渲染是异步批量调度的:当原子更新时,Recoil会收集所有订阅该原子的组件,再按照内部调度优先级触发重渲染,这个优先级和组件订阅原子的时间、组件渲染复杂度等因素有关,完全不依赖组件的父子层级关系。也就是说,子组件完全可能先于父组件完成重渲染,这种情况下你的示例代码就会触发报错。
内容的提问来源于stack exchange,提问作者12412316
相关产品推荐
相关产品推荐

