【发布时间】:2019-08-14 02:14:46
【问题描述】:
如果功能组件现在可以使用 react 钩子,我是否应该使用 useCallback 包装使用 props 传递的每个函数,并使用 useMemo 包装所有其他 props 值?
我的组件内部还具有依赖于任何 props 值的自定义函数,我应该用 useCallback 包装它吗?
有什么好的做法来决定组件中的哪些 props 或 const 值用这个钩子包装?
如果这样可以提高性能,为什么不一直这样做呢?
让我们考虑包装点击处理程序并添加自定义逻辑的自定义按钮
function ExampleCustomButton({ onClick }) {
const handleClick = useCallback(
(event) => {
if (typeof onClick === 'function') {
onClick(event);
}
// do custom stuff
},
[onClick]
);
return <Button onClick={handleClick} />;
}
让我们考虑自定义按钮,我们在其中包装点击处理程序并根据条件添加自定义逻辑
function ExampleCustomButton({ someBool }) {
const handleClick = useCallback(
(event) => {
if (someBool) {
// do custom stuff
}
},
[someBool]
);
return <Button onClick={handleClick} />;
}
在这两种情况下我应该用useCallback 包裹我的处理程序吗?
与使用备忘录类似的情况。
function ExampleCustomButton({ someBool }) {
const memoizedSomeBool = useMemo(() => someBool, [someBool])
const handleClick = useCallback(
(event) => {
if (memoizedSomeBool) {
// do custom stuff
}
},
[memoizedSomeBool]
);
return <Button onClick={handleClick} />;
}
在这个例子中,我什至将记忆值传递给useCallback。
如果在组件树中许多组件记住相同的值,会怎样?这对性能有何影响?
【问题讨论】:
-
嗯,绝对不是每次,所有时间:) 它们的使用是根据情况而定的。当您开始遇到性能障碍时,我会说考虑实际使用这些。
-
感谢@Powell_v2 的评论,但如果这能提高性能,为什么不一直这样做呢?
-
我想如果这可行的话,React 会自动处理它,而不是将这些作为单独的 API 公开。正如@jalooc 指出的那样,记忆回调/值是有成本的。代码混乱也是一个问题。
-
如果点击处理程序不使用其中任何组件的
props,那么您可以在组件外部声明它,然后处理程序函数不会在组件的每个 prop 更改时重新创建(因为它在外面..) -
还应该补充一点,将useMemo放在useCallback中是无效的。 useMemo 只能在 React 函数组件或自定义 React 钩子中调用。
标签: reactjs react-hooks