【发布时间】:2021-05-14 11:54:29
【问题描述】:
如果我有一个钩子,例如:
const useGetSet = (label: string) => {
const [get, set] = useState(label);
return { get, set };
};
我可以通过数组map 它,例如:
const labels = ['one', 'two'].map(useGetSet);
但如果我将其扩展为 lambda,例如:
const labels = ['one', 'two'].map((l) => useGetSet(l))
然后它导致:
无法在回调中调用 React Hook
"useGetSet"。
必须在 React 函数组件或自定义 React Hook 中调用 React Hooks 功能。 (react-hooks/rules-of-hooks) eslint
为什么会有这种差异,它们不应该是等价的吗?
另外,如果这违反了钩子规则,应该如何这样做?
【问题讨论】:
-
我认为 ESLint 对它可以轻松识别为罚款的内容和被视为违规的内容有一些限制。
-
虽然循环可以与钩子一起使用(假设迭代计数是硬编码的),但它们通常是不合理的。见:Why can't React Hooks be called inside loops or nested function?
-
我很惊讶第一个是允许的。您正在使用
map中的钩子玩危险的领土。只有在这种情况下才可以,因为['one', 'two']是一个固定数组。如果您正在映射一个可以更改长度的数组,那么您将遇到重大问题。 -
我认为我对规则实施的局限性的假设是正确的,请参阅the source code。
-
Re: 应该怎么做,你可能会有不同的意见,但我的是将整个数组传递给一个钩子
useGetSetArray:codesandbox.io/s/map-react-hooks-forked-7ggzv?file=/src/App.tsx
标签: javascript reactjs react-hooks eslint