javascript - 为什么 useMemo 不起作用?我用错了吗?
问题描述
所以我只是掌握了 useMemo 和 useCallback 的窍门,然后到处玩,看看事情是如何运作的。在这种情况下,我想做的不是在父级发送相同对象时渲染子级。
这是我的父组件:
const Parent = () => {
const [value, setValue] = useState(0);
const handleOnClick = e => {
setValue(value + 1);
};
const myObject = useMemo(() => {
return { value: value - value };
}, [value]);
return (
<div>
<h1>I am a parent</h1>
<button onClick={handleOnClick}>
Click on Me
</button>
<Child object={myObject} />
</div>
);
};
export default Parent;
这是我的孩子,虽然“myObject”的内容是一样的,但每次点击都会重新渲染。(我知道每次参考都会改变,但我的理解是 useMemo 所做的)
const Child = ({ object }) => {
return (
<div>
<h1>I am child</h1>
<p>Object is {JSON.stringify(object)}</p>
</div>
);
};
export default React.memo(Child);
请让我知道我做错了什么以及这种情况的解决方案是什么?
解决方案
依赖数组控制着记忆中断的时间。如果该数组中的任何内容发生了变化,那么 memoization 将再次运行。React 只检查那个数组,而不是成品。
现在你告诉它重新计算任何时间value
变化。value
如果不是您想要的,您可以为数组提供其他内容。你的例子value - value
没有多大意义,因为它永远不会改变,所以让我替换它,它会改变一半的时间:
const Parent = () => {
const [value, setValue] = useState(0);
const handleOnClick = e => {
setValue(value + 1);
};
const halfValue = Math.round(value / 2);
const myObject = useMemo(() => {
return { halfValue: halfValue };
}, [halfValue]);
return (
<div>
<h1>I am a parent</h1>
<button onClick={handleOnClick}>
Click on Me
</button>
<Child object={myObject} />
</div>
);
};
现在,每隔一次点击就会重新计算记忆。
推荐阅读
- javascript - 我无法在循环中在谷歌自定义搜索 api 中获得 100 个结果
- node.js - 如何删除/添加由于重命名文件夹而被删除/未跟踪的阶段的文件
- python - 在 django 中无法访问 html 文件 url
- vba - 程序在 if 语句之前关闭 (CATIA VBA)
- powerbi - Power BI:如何计算源表中值的出现?
- python - 如何使用 Div 和 Script 标签在 HTML 中渲染两个或多个散景图?
- react-native - Webview&redabilitywebview 在 android 中工作正常而不是在 ios 中反应原生
- heroku - Heroku 自动对我的数据库进行维护,现在我的应用程序无法连接
- python - 使用 OpenCV 和 Python 提取楼层布局和阈值
- git - Git ignore ignoring too many things