为了账号安全,请及时绑定邮箱和手机立即绑定

将函数作为道具传递时是否应该始终使用 useCallback ?

将函数作为道具传递时是否应该始终使用 useCallback ?

繁星点点滴滴 2022-01-13 17:36:20
我有下面的代码。如果我传递道具onUpdate并且onDelete只是函数 - javascript 中的函数对象 - 由于分析器中的道具更改,子组件总是重新渲染。该功能已重新创建,onUpdate现在onDelete是新道具,对我来说很有意义。但是,如果我添加useCallback,他们不会感知到道具变化,因为这是useCallback. 所以这导致了几个问题。useCallback使用每个传递给孩子的函数有什么缺点?使用没有任何好处,useCallback因为孩子会因为父母渲染而渲染?为什么这不是默认行为?我知道这可能无法回答。<UpdateGroupInput    onUpdate={useCallback(      group => {        const index = groups.findIndex(searchedGroup => searchedGroup.id === group.id);        const newGroups = groups.slice();        newGroups[index] = group;        onChange(items, newGroups);        hideAddItemModal();      },      [groups, items, onChange]    )}    onDelete={useCallback(      id => {        const newGroups = groups.filter(group => group.id !== id);        const newItems = items.filter(item => item.group !== id);        onChange(newItems, newGroups);      },      [groups, items, onChange]    )}    groups={groups}    visible={viewUpdateGroup}  ></UpdateGroupInput>
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

UseCallback 只是一个特殊版本useMemo,仅用于函数。优点是阻止您在每次渲染时重新创建函数,这可能会导致您在组件树中进一步破坏任何其他记忆。

像任何形式的代码优化一样,优点可能不是那么大,它增加了自己的开销,可能超过任何优点,并且还增加了代码的复杂性。

引用 Knuth 的话“过早的优化是万恶之源”

Kent C. Dodds 在他的博客https://kentcdodds.com/blog/usememo-and-usecallback上对此进行了更详细的介绍


查看完整回答
反对 回复 2022-01-13
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信