React.useState作为prop传递和存为类组件本地属性表现差异疑问
问题1:类组件本地属性不更新的原因
你的猜测完全正确:
- 类组件的
constructor仅在组件首次挂载时执行1次,后续props更新时不会重新触发构造函数 - 你将
props.context赋值给this.gloablThemeContext的操作仅执行了一次,后续Context变化导致props更新时,这个挂载在实例上的本地属性不会自动同步最新值,所以一直保持初始的light状态
这种场景下完全没必要把props存为本地属性,直接在需要用到的地方访问this.props即可,this.props本身会实时同步父组件传入的最新值。如果确实有缓存需求,需要同步更新本地属性,可以用componentDidUpdate生命周期钩子监听props变化后手动更新:
componentDidUpdate(prevProps) { if (prevProps.context !== this.props.context) { this.globalThemeContext = this.props.context; } }
注:你代码里的gloabl为拼写错误,正确写法是global
问题2:为什么需要将useState的返回值传给Provider的value
首先要明确两个API的本质区别:
React.createContext(defaultValue)返回的是一个包含Provider和Consumer两个属性的普通对象,它本身不具备状态管理能力,传入的defaultValue只是兜底默认值:只有当消费Context的组件外层没有匹配到对应Provider时,才会使用这个默认值,它是静态的,没有响应式更新能力。React.useState(initialValue)返回的是[当前状态值, 状态更新函数]的响应式元组:调用更新函数修改状态时,React会触发依赖该状态的组件重渲染,同时传递给Provider的value也会同步更新,所有消费该Context的组件才能拿到最新的状态。
如果你直接写<ThemeContext.Provider value={ThemeContext}>,相当于给所有子组件传递了一个固定的Context对象,既没有响应式的状态值,也没有可用的更新函数,自然无法实现主题切换的功能。
内容的提问来源于stack exchange,提问作者MamorukunBE
相关产品推荐
相关产品推荐

