【问题标题】:Should I use useMemo in hooks?我应该在挂钩中使用 useMemo 吗?
【发布时间】:2019-07-07 21:45:34
【问题描述】:

我创建了 useBanner 钩子

const useBanner = (array, yardage) => {
  const [bannArr, setBannArr] = useState(array.slice(0, yardage));
  const [bannListIndex, setBannIndex] = useState(1);

  return {
   ....
  };
};

我在做正确的事吗?道具会在 useState 中抛出。 可以使用useBanner。

const Banner= ({
  array,
  yardage
}) => {
  const { bannForth, bannBeck, bannArr } = useBanner(array, yardage);
  return (
    ...
  );
};

什么时候道具会在这里改变。 将改变 useBanner 中的状态。 还是它被认为是反模式我必须在 useMemo 中写下所有这些

const useBanner = (array, yardage) => {
  const [bannArr, setBannArr] = useState([]);
  const [bannListIndex, setBannIndex] = useState(1);

 useMemo(() => {
    setBannArr(array.slice(0, yardage));
    setBannIndex(1);
  }, [array, yardage]);


  return {
   ....
  };
};

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    是的,在 React 中可以使用自定义钩子。这是讨论custom hooks的单独文档。

    但您的示例可能需要额外的代码,具体取决于您的最终目标。

    1. 如果你只想初始化一次状态,当组件Banner第一次被创建时,你可以像你的第一个示例那样做

      const Banner= ({
          array,
          yardage
      }) => {
          const { bannForth, bannBeck, bannArr } = useBanner(array, yardage);
          return (
            ...
          );
      };
      

      这将完美地工作。但是如果 props arrayyardage 发生变化,这不会反映在组件中。所以props 将只使用一次作为初始值,然后即使更改也不会在useBanner 中使用(无论您是直接使用useBanner 还是useState 都没有关系)。这个答案highlight这个。

    2. 如果您想在每次 props 更改时更新初始值,您可以使用 useEffect,如下所示

      const Banner= ({
          array,
          yardage
      }) => {
          const { bannForth, bannBeck, bannArr, setBannArr } = useBanner(array, yardage);
          useEffect (() => {
              // setBannArr should also be returned from useBanner. Or bannArr should be changed with any other suitable function returned from useBanner.
              setBannArr(array.slice(0, yardage)); 
          }, [array, yardage, setBannArr])
          return (
            ...
          );
      };
      

      在这种情况下Banner组件可以自己控制状态,当父组件更改props时,Banner组件中的状态将重置为新的props

    这是showcase second option的小样本。

    【讨论】:

    • 我理解正确吗..如果您创建钩子,那么它们里面的道具永远不会改变。我的例子是数组,它们永远不会改变码数。这意味着初始值可以简单地投入到状态中。
    • 是的,在useState 中,钩子初始值只应用了一次并且不会改变(不管useState 是直接从组件调用还是包装在useBanner 函数中)。对于其他钩子,例如 useEffect props 将应用于每次重新渲染以及更改它们时。但是,如果您将空数组 ([]) 作为 useEffect 的第二个参数传递,它也只会捕获一次 props
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2019-12-31
    • 1970-01-01
    • 2021-01-27
    • 2021-05-31
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多