【问题标题】:How to memoize custom hooks to improve performance如何记忆自定义钩子以提高性能
【发布时间】:2021-08-12 15:33:08
【问题描述】:

具有以下功能,这是常见的自定义钩子并从多个地方调用。

如何记住这些以提高性能。 (虽然在浏览器上调试然后观察到它被多次调用)。如果fields.forEach 只记住而不是自定义钩子下的所有代码,那也很好

我尝试在钩子中添加一个函数,但是我需要返回 result 对象而不是函数。

export function useListObject(fields)
{
const allData = useGetAll();
const result = {};
fields.foreach((field) =>{
  ...
  ...
  ...
  result[field]= {key, value , parameters, names}
});
return result;
}

///// 组件调用如下

const listData = useListObject(['state','country','categoryTypes','category']); 

//这里可以memoize吗?所以不需要在自定义钩子中记忆。

【问题讨论】:

    标签: reactjs react-hooks usecallback react-usememo


    【解决方案1】:

    你可以使用 React 提供的 useMemo 钩子来记忆你的 forEach 循环的结果:

    const result = useMemo(() => {
      const fieldData = {};
    
      fields.foreach((field) =>{
        ...
        ...
        ...
        fieldData[field] = { key, value , parameters, names }
      })
      
      return fieldData;
    }, [fields]);
    

    这样直到fields 发生变化,result 将被记忆到您在useMemo 调用中返回的任何内容。

    【讨论】:

    • 这里fields是一个数组,它会根据数组项或数组引用比较数组项的值和记忆吗?如果fields 是新的引用数组但数组值相同,那么useMemo 将能够按数组项进行比较?
    • 这是一个很好的观点,如果可能的话,最好的方法是将fields 数组作为父状态的一部分(如果可能的话)。这样,每次重新渲染都将是相同的引用。这是一个沙箱:codesandbox.io/s/silly-sunset-9vpgf?file=/src/App.js 否则您可以执行其他操作,例如对依赖项中的数组进行字符串化以检查相等性
    • 谢谢,使用 useState 看起来不错,就我而言,它已经使用了很多地方,而且在所有地方都很难进行更改。只是检查strigify 是否是一个不错的选择,你的意思是像useMemo(()=>{}),[JSON.Stringify(fields)]) 吗?没有使用过这种方式,但不确定这是否会产生任何掉毛问题。检查这部分。
    • 不会有更长的字段。最多为 15。如果使用 useMemo(()=>{}),[JSON.Stringify(fields)]) 或其他更好的方法来实现,是否存在性能问题?
    • 在这篇文章中有一个关于不同实现的很好的讨论:stackoverflow.com/questions/59467758/… 如果你的数据结构不是很大,stringify 的性能可能可以忽略不计,但还有其他一些策略
    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多