为何SolidJS中使用提前返回会导致全局状态失效?
问题原因及解决方案
这是SolidJS和React响应式机制的核心差异导致的——SolidJS的组件函数只执行一次,依赖跟踪是在首次执行时收集那些在渲染输出中被用到的信号,而React是状态变化时组件会重新执行整个函数。
你的代码里,首次执行时因为user()是null,直接走了return null的分支,后面的JSX根本没被解析,所以Solid没有跟踪到user()这个信号的依赖。当其他组件更新user状态后,这个组件因为没有订阅user的变化,不会重新执行判断逻辑,就一直返回null。
而把判断移到唯一返回语句里时,比如:
const Test = () => { const [user, setUser] = useUserContext() return user() ? ( <div> <div>{user()?.username}</div> </div> ) : null }
此时组件首次执行时会解析整个JSX结构,user()的调用会被Solid的响应式系统捕获并建立依赖,当user状态变化时,就会触发对应的更新,重新判断并渲染正确的内容。
另外也可以用Solid自带的Show组件来更规范地处理条件渲染:
import { Show } from 'solid-js' const Test = () => { const [user, setUser] = useUserContext() return ( <Show when={user()}> <div>{user()?.username}</div> </Show> ) }
Show组件会自动帮你跟踪when属性里的信号依赖,确保状态变化时能正确切换渲染内容。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

