React中将useState相关值通过Context/Props传递是否会引发后续隐患?
useState 声明对象类型的状态本身是 React 支持的合法用法,不会有语法层面的报错,但从你给出的代码来看,存在几个可预见的业务逻辑、性能层面的隐患:
未赋值的键值会导致异常显示
你给title、label设置的初始值是空对象,如果在对应id的键值还没通过setTitle/setLabel赋值的情况下就渲染BarChart组件,此时传递给子组件的title、label会是undefined,子组件的图表标题、数据集标签会直接显示undefined,影响展示效果。
建议优化方式:取值时增加兜底逻辑,比如title={title?.[id] ?? '默认标题'}、label={label?.[id] ?? '指标'}。更新状态时容易触发不更新的问题
很多开发者更新对象类型状态时会直接修改原对象再赋值,比如:// 错误写法,不会触发组件重渲染 title[id] = '新标题' setTitle(title)因为React对state的更新是浅比较,原对象的引用地址没有变化,React会认为状态没有变更,不会触发重渲染。正确的更新写法应该返回全新的对象:
setTitle(prev => ({ ...prev, [id]: '新标题' }))Context未做缓存会导致多余重渲染
从代码看你是把useState返回的数组直接放到Context的value里传递,如果Provider组件本身有其他状态更新,或者你没有把Context的value用useMemo缓存,会导致所有消费这个SettingContext的组件都触发不必要的重渲染,影响性能。
建议优化方式:给Provider的value加useMemo缓存:const contextValue = useMemo(() => ({ SetTitle: [title, setTitle], SetLabel: [label, setLabel], // 其他Context值 }), [title, label])子组件的图表配置未做缓存会导致多余重绘
BarChart组件里的data、options是直接声明的普通变量,每次组件重渲染都会生成新的对象,会触发react-chartjs-2的Bar组件不必要的重绘。建议把data、options都用useMemo包裹,依赖项设置为传入的title、label以及后续你会加入的labels、数据集数值。
内容的提问来源于stack exchange,提问作者Somi

