问题是这样的
我有一个RenderForm
的组件用于生成对应的表单
其中他需要接收一些参数,比如config
、onChange
其中config
是一个数组,用于告诉组件该生成什么组件(输入框、复选框);onChange
是一个函数,是检测用户输入变化的回调
我在编写代码中希望通过useMemo
来减少RenderForm
组件的渲染开销
const FormRender = ({ config, onChange })=>{
return React.useMemo(()=>{
/* some code ...*/
return (
<>
{ config.map((item,index)=>(<Com key={index} {...item.childprops} onChanged={ onChange } />)}
</>
)
},
[config,onChange]
)}
我期望的是有且仅当 Config 出现变化的时候,RenderForm
才会重新渲染, 但是因为ESlint
的缘故我也将 onChange
函数放入了依赖项中
当依赖项存在 onChange
时,RenderForm
组件并不会因为useMemo
而减少了开销,而是依赖父组件的变化而再次渲染(config
没有发生变化)
我认为这是因为 ()=>{} !== ()=>{}
的检测机制导致useMemo
无法按我预期的去缓存渲染结果
去掉onChange
之后,又会有ESlint警告
React Hook React.useMemo has a missing dependency: 'onChange'. Either include it or remove the dependency array. If 'onChange' changes too often, find the parent component that defines it and wrap that definition in useCallback
这里想了解遇到这种情况时该如何去处理?,提示提到说用 useCallBack
去做相应处理我不知道怎么去写
我的尝试是
const handlerOnChange = useCallBack(onChange,[])
useMemo(()=>{ /* more code */ },[ config, handlerOnChange ])
但这样也同样会因为缺少依赖性触发ESlint
警告 react-hooks/exhaustive-deps
Tips
非内联函数
的解决方案及影响父组件编码方式
的方案( 参考文章)我对此不感兴趣,当然如果只有这种方案的话那另说。- 关闭
ESlint
检测,如果上述提到的ESlint
规则在我的场景中不适用的也可以提出