Javascript 使用React'的目的是什么;用回调钩子代替useffect?
我试图理解使用React的钩子代替钩子的用例是什么 它们似乎都充当其输入状态更改的侦听器(示例取自: 但是,Javascript 使用React'的目的是什么;用回调钩子代替useffect?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我试图理解使用React的钩子代替钩子的用例是什么 它们似乎都充当其输入状态更改的侦听器(示例取自: 但是,useffect钩子提供了清理资源的额外好处,您以前使用组件将卸载这些资源 那么,使用useCallback的好用例是什么呢?还有,我在这里遗漏了什么?useffect有非常具体的与之相关的计时方面,您可以阅读。指定的函数将在渲染完成且DOM已更新后执行。当第二个参数数组中指定的任何值发生更改时,这将在每次渲染后发生 useCallback不会自动执行任何操作。它返回一个函数,该函数可以由
useffect
钩子提供了清理资源的额外好处,您以前使用组件将卸载这些资源
那么,使用useCallback
的好用例是什么呢?还有,我在这里遗漏了什么?useffect
有非常具体的与之相关的计时方面,您可以阅读。指定的函数将在渲染完成且DOM已更新后执行。当第二个参数数组中指定的任何值发生更改时,这将在每次渲染后发生
useCallback
不会自动执行任何操作。它返回一个函数,该函数可以由任何需要触发它的代码执行。不会侦听导致执行回调的更改。数组值仅控制返回的函数实例。数组值不控制函数执行的时间
一个关键用例是将此函数作为道具传递给子组件以用作事件处理程序useCallback
允许您定义一个内联函数用作事件处理程序(因此它可以访问定义该函数的上下文中的任何其他变量),而无需在每次渲染时向子级传递唯一的属性。只要第二个参数数组中的值没有更改,就会返回与上一次渲染相同的函数。因此,如果子组件是纯组件,则不会因为总是接收唯一的事件处理程序函数而强制其重新渲染
不使用useCallback
const Parent = ()=> {
const [a, setA] = useState(null);
const eventHandler = ()=> {
// every render creates a unique instance of eventHandler
// even though it always does the same thing so long as 'a' hasn't changed
doSomethingWithA(a);
}
return <Child onClick={eventHandler}/>
}
const Parent = ()=> {
const [a, setA] = useState(null);
const eventHandler = useCallback(()=> {
// A unique function instance is passed in to useCallback on every render, but
// eventHandler will be set to the first instance of this function
// (i.e. potentially an instance of the function that was passed to useCallback
// on a previous rendering) that was passed to useCallback
// for the current value of 'a'.
doSomethingWithA(a);
}, [a]);
return <Child onClick={eventHandler}/>
}
为useCallback
和其他挂钩提供了比用例中的React文档更详细的信息
相关答案:非常简洁的解释。谢谢作者@Ryan所指的文章指向媒体。如果有人无法访问该媒体,那么也可以在作者自己的博客网站上阅读。
const Parent = ()=> {
const [a, setA] = useState(null);
const eventHandler = useCallback(()=> {
// A unique function instance is passed in to useCallback on every render, but
// eventHandler will be set to the first instance of this function
// (i.e. potentially an instance of the function that was passed to useCallback
// on a previous rendering) that was passed to useCallback
// for the current value of 'a'.
doSomethingWithA(a);
}, [a]);
return <Child onClick={eventHandler}/>
}