reactjs - 使用 react 钩子(Hook)操作数组

标签 reactjs react-hooks

假设我有一个获取数组的组件,我想做一些逻辑:

const MyComponent = ({ myArray = [] }) => {
  console.log("infinite rendering");
  const [prop, setProp] = useState([])
  useEffect(() => {
    setProp(myArray.map(x => x + 1))
  }, [myArray])

  return <div />
}

https://codesandbox.io/s/x3kq907r5z

问题是我得到了一个无限循环。

我可以通过删除默认值 ({ myArray }) 并检查数组 if (Array.isArray(myArray)) setProp(...) 来修复错误>

但我很难理解: 使用钩子(Hook)对 Prop (数组/对象/等)进行任何类型的操作的最佳方法是什么?

最佳答案

按照您当前编写代码的方式,myArray 是每次渲染时空数组的不同实例。这意味着效果总是会运行,因为依赖关系总是在变化!

这可能看起来很奇怪,但请考虑以下代码:

const a = [];
const b = [];
console.log(a === b); // false

最简单的解决方法是将回退逻辑移到效果中:

const MyComponent = ({ myArray }) => {
  console.log("infinite rendering");
  const [prop, setProp] = useState([]);
  useEffect(
    () => {
      setProp(myArray ? myArray.map(x => x + 1) : []);
    },
    [myArray]
  );

  return <div />;
};

或者确保始终使用相同的空数组作为默认值:

const empty = [];
const MyComponent = ({ myArray = empty }) => {
  console.log("infinite rendering");
  const [prop, setProp] = useState([]);
  useEffect(
    () => {
      setProp(myArray.map(x => x + 1));
    },
    [myArray]
  );

  return <div />;
};

关于reactjs - 使用 react 钩子(Hook)操作数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55340854/

相关文章:

reactjs - 以非交互模式运行 CRA Jest

reactjs - 如何找出哪个 React 组件抛出空 props 错误

javascript - 在 react 中结合两个对象,到目前为止没有成功

reactjs - React hooks : are they useful for shared state management, 例如终极版?

reactjs - 如何修复 jsx 结束标签 : "unclosed regular expression"? 上的 linting 错误

javascript - 在 react 组件中动画淡出元素

reactjs - 给函数组件提供引用以使用内部函数

javascript - React Hook - 我总是从 useState 获取陈旧的值,因为子组件永远不会更新

javascript - 无法读取未定义的 React Hooks 的属性

javascript - React useState/useEffect 钩子(Hook)未正确返回信息