- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从我从 React 文档和网络上的其他 Material 中了解到,useCallback 用于通过确保将回调的内存版本传递给子组件来避免重新渲染子组件,因此子组件的引用 props 保持不变。但这一切仅在我在子组件上使用 React.memo 时才有效。没有 React.memo,子组件无论如何都会重新渲染。我的问题是在这种情况下 useCallback 有什么用,即没有将 React.memo 应用于子组件。 useCallback 的其他好处是什么?
最佳答案
React.memo 确保在 props 进入组件时执行浅比较,并在它们相等时跳过组件的渲染。
给定一个子组件 Cell:
当应用于在渲染另一个父组件期间创建的功能组件时,将在每次渲染时创建一个新的 Cell 组件。这个新的 Cell 组件将始终对其 props 进行浅层比较,但它会在每次渲染其父级时重新渲染。
但是,如果它的依赖数组在父重新渲染期间没有更改,则 useCallback 将记住此函数回调 Cell。
单独一个包含在 useCallback 中的函数组件 Cell 在接收到 props 时将始终重新渲染,这将在其父级的每次渲染中发生。
然而不同的是,如果组件本身被重新创建,它的整个子树会被重新渲染,就像单独使用 React.memo 时的情况一样。
然而,配对在一起,您可以绕过重新渲染在父级内部定义的组件。
您会注意到,当尝试拖动 Memoized 单元格时,未包含在 useCallback 中的单元格不会发生拖动。这是因为当它的父元素重新渲染时,您尝试拖动的原始元素被重新创建为新实例。
更详细地解释了这个概念 here
示例
const { useCallback, useState, useRef } = React;
function App() {
const [state, setState] = useState(false);
const [title, setTitle] = useState("");
const Cell = useCallback(({ title }) => {
console.log(`${title} rendering`);
function onDragStart() {
setState(true);
}
function onDragEnd() {
setState(false);
}
return (
<div draggable onDragStart={onDragStart} onDragEnd={onDragEnd}>
Drag {title}
</div>
);
}, []);
const MemoizedCell = React.memo(({ title }) => {
console.log(`${title} rendering`);
function onDragStart() {
setState(true);
}
function onDragEnd() {
setState(false);
}
return (
<div draggable onDragStart={onDragStart} onDragEnd={onDragEnd}>
Drag {title}
</div>
);
});
const MemoizedCallbackCell = useCallback(
React.memo(({ title }) => {
console.log(`${title} rendering`);
function onDragStart() {
setState(true);
}
function onDragEnd() {
setState(false);
}
return (
<div draggable onDragStart={onDragStart} onDragEnd={onDragEnd}>
Drag {title}
<button onClick={() => setTitle(" Updated")}>Change Title</button>
</div>
);
}),
[]
);
return (
<div className="App">
<Cell title="Cell" />
<MemoizedCell title="Memoized Cell" />
<MemoizedCallbackCell title={"Memoized Callback Cell" + title} />
Is dragging {`${state}`}
<br />
</div>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
关于javascript - 在没有 React.memo 的情况下使用 useCallback 有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59663387/
我正在优化应用程序的性能,我想知道是否对那些不依赖任何变量的函数使用 useCallback 钩子(Hook)。 考虑以下情况: 假设我们有一些功能: const someFunc = () => {
在我尝试更好地理解 React Hooks 的过程中,我遇到了一些我没有预料到的行为。我试图创建一个引用数组,并通过 onRef 函数推送到所述数组,我将传递给我的 's 。每次组件重新渲染时,数组都
我对 useMemo 还很陌生和 useCallback react 中的钩子(Hook),我有点不明白为什么即使我检查的变量保持不变,我的函数仍然继续重新渲染。目前我正在尝试构建一个谷歌地图,允许用
最近在研究react-hook。我在实践的过程中遇到了一个让我无法理解的问题。 import React, { useState, useCallback } from 'react'; const
根据 React 官方文档,如果组件新状态是使用先前状态计算的,则可以将函数传递给 setState。该函数将接收先前的值,并返回更新后的值。 考虑以下代码片段示例: const [counter,
为什么useCallback 钩子(Hook)会执行两次?我收到一条警告,建议我使用 useCallback,所以我正在尝试这样做。据我了解,useCallback 只会在我们传递给数组的对象更新时执
目前,每次更新查询参数时,我的代码都会重新呈现。一旦我删除了查询参数;但是,我收到一条警告,指出“React Hook useCallback 缺少依赖项:'query'。要么包含它,要么删除依赖项数
使用 React 的 useCallback hook 本质上只是 useMemo 的包装。专门用于函数,以避免在组件的 props 中不断创建新的函数实例。我的问题来自于当您需要将争论传递给从内存创
React 文档中关于 useMemo 的内容如下 You may rely on useMemo as a performance optimization, not as asemantic gu
在我读过的 React 文档 Pass an inline callback and an array of dependencies. useCallback will return a memoi
在我读过的 React 文档 Pass an inline callback and an array of dependencies. useCallback will return a memoi
什么时候应该使用 useCallback 什么时候应该使用简单的数组函数?或者也许我不应该使用第二种方法? const MyCompenent = (props) => { const handl
使用 React Hooks,当我们想要记住函数的创建时,我们有 useCallback 钩子(Hook)。这样我们就有了: const MyComponent = ({ dependancies }
我有接受函数作为参数的钩子(Hook)。如果功能发生不必要的更改,则可能会导致额外的重新渲染。我想确保函数用 useCallback 包装。 即这是一个简化版本: function useApi({
考虑这个带有自定义表单钩子(Hook)的基本表单字段组件来处理输入更改: import React, { useState, useCallback } from 'react'; const use
我正在检测组件中的按键,该组件知道当前通过 Prop 在应用程序的其他地方打开了什么对话框组件, currentDialog .通常我可以在嵌套函数中访问这个 Prop ,但在使用 useCallba
我正在学习 Advanced React Patterns with Hooks 在线类(class),在这个早期示例中,他们使用以下 API 创建了一个可扩展组件(比如经典的 Accordion 或
我是 React 的新手,我收到了这个错误: Warning: Can't perform a React state update on an unmounted component. This i
我的回调在一次又一次调用后返回相同的状态 我是 react 类中的 react 钩子(Hook)的新手,我本可以使用 shouldcomponentupdate 并且可以解决这个问题 但是 useca
下面的示例是一个简化的摘录,其中子组件根据鼠标行为发出事件。然后 React 应根据发出的事件更新 DOM。 function SimpleSample() { const [addons, se
我是一名优秀的程序员,十分优秀!