const Example = () => {
const [counter, setCounter] = useState(0);
const increment = () => setCounter(counter => counter + 1);
return (
<div>
<Button onClick={increment} />
<div>{counter}</div>
</div>
);
}
当我将onclick
处理程序作为箭头函数传递时,我的eslint
抛出一个警告:
error JSX props should not use arrow functions react/jsx-no-bind
我从这篇文章中读到的答案是:https://stackoverflow.com/questions/36677733/why-shouldnt-jsx-props-use-arrow-functions-or-bind#:~:text=why%20you%20shownt%20use,previous%20function%20is%20garbam%20collected。
简短的回答是因为arrow函数每次都被重新创建,这会损害性能。本文提出的一个解决方案是用空数组包装在useCallback钩子中。当我改为这个时,eslint警告真的消失了。
const Example = () => {
const [counter, setCounter] = useState(0);
const increment = useCallback(() => setCounter(counter => counter + 1), []);
return (
<div>
<Button onClick={increment} />
<div>{counter}</div>
</div>
);
}
这让我真的很困惑?所以对于函数组件,在处理内联函数处理程序时,我应该只写箭头函数(忽略eslint)还是总是将其包装在useCallback中???
简短的回答是因为arrow函数每次都被重新创建,这会损害性能。
这是一个常见的误解。无论哪种方式,箭头函数每次都会重新创建(尽管对于Usecallback
,后续函数可能会立即丢弃)。useCallback
所做的是,如果子组件被memoted,则可以不重新呈现使用回调的子组件。
我们先来看看误解。考虑usecallback
调用:
const increment = useCallback(() => setCounter(counter => counter + 1), []);
与不使用Usecallback
时所拥有的进行比较:
const increment = () => setCounter(counter => counter + 1);
这要简单得多:创建函数。然后它就不必做上面的#2和#3了。
让我们继续讨论usecallback
实际上做了什么,这很有用。让我们看看回调的用法:
<Button onClick={increment} />
const { useState, useCallback } = React;
const Button = React.memo(function Button({onClick, children}) {
console.log("Button called");
return <button onClick={onClick}>{children}</button>;
});
function ComponentA() {
console.log("ComponentA called");
const [count, setCount] = useState(0);
// Note: Safe to use the closed-over `count` here if `count `updates are
// triggered by clicks or similar events that definitely render, since
// the `count` that `increment` closes over won't be stale.
const increment = () => setCount(count + 1);
return (
<div>
{count}
<Button onClick={increment}>+</Button>
</div>
);
}
function ComponentB() {
console.log("ComponentB called");
const [count, setCount] = useState(0);
// Note: Can't use `count` in `increment`, need the callback form because
// the `count` the first `increment` closes over *will* be slate after
// the next render
const increment = useCallback(
() => setCount(count => count + 1),
[]
);
return (
<div>
{count}
<Button onClick={increment}>+</Button>
</div>
);
}
ReactDOM.render(
<div>
A:
<ComponentA />
B:
<ComponentB />
</div>,
document.getElementById("root")
);
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.0/umd/react-dom.production.min.js"></script>
我试图在一个功能组件中进行API调用,它是一个react-hook,并基于结果,重新呈现组件的内容。代码如下: 调用API的组件- 下面是函数: 我试图获取州的数据,并根据这些数据重新呈现我的组件。这里在调用外部API的动作中。 正在调用操作并成功获取数据,但我不确定为什么状态会更新--我得到了以下错误-
下面的代码出现了最奇怪的错误。 /src/components/competitions/TheVault表单。js第5行:在函数“contactform”中调用React钩子“useForm”,该函数既不是React函数组件,也不是定制的React钩子函数React钩子/钩子规则 搜索关键字以了解有关每个错误的更多信息。 我刚刚安装了react hook表单并运行了演示代码。
我不熟悉react钩子和功能组件,我正在尝试在我的功能组件中使用useState,它会向我显示前面提到的错误 使用React、ant设计 参考以下输入链接描述在这里 错误: 在函数“deviceStatus”中调用React钩子“useState”,该函数既不是React函数组件,也不是自定义React钩子函数React钩子/钩子规则
问题:在函数“selectmenu”中调用了React钩子“React.useEffect”,该函数既不是React函数组件,也不是自定义React钩子函数 目标:我只想在单击按钮时挂载组件('Component DidMount/WillUnmount)(使用useffect()),而不是在加载文件(或整个组件)时挂载 实际目标:我想在单击时选择(或突出显示)一个文件(自定义)。但是,当用户在文
我试图在一个功能组件中调用一个API,它是一个反应挂钩,并基于结果,重新呈现组件的内容。下面是代码: 调用API的组件- 以下是功能: 我正在尝试获取状态数据,并根据数据重新渲染组件。这里处于调用外部API的操作中。 正在调用操作并成功获取数据,但我不确定为什么状态正在更新-我得到了以下错误- 在函数“setResults”中调用React钩子“useState”,该函数既不是React函数组件,