gpt4 book ai didi

javascript - 即使数据没有改变,react redux useSelector 也会重新渲染

转载 作者:行者123 更新时间:2023-12-03 21:13:23 24 4
gpt4 key购买 nike

我正在使用 redux 和 redux thunk 的 react 。
我有一个 Action ,我正在发出网络请求。
使用 useSelector 我从 redux 商店获取数据。
我有一个问题,每次我调度操作时组件都会重新呈现。
我希望组件仅在数据更改时重新呈现。
我已经尝试使用 shallowEqual 作为 useSelector 的第二个参数。但它不起作用。
我已将其压缩为此沙箱中的最小示例。在控制台中,您可以看到组件随每个网络请求重新呈现。
这是代码框:
https://codesandbox.io/s/useselector-js6j0?file=/src/App.js:885-1294
这是代码:

function LevelThree() {
console.log(`Level three calls: ${++levelThreeCalls}`);
const contextData = useSelector(state => state.data);
console.log(contextData);
const dispatch = useDispatch();
useInterval(() => {
dispatch(updateData());
}, 1000);

return (
<div>
<button onClick={() => dispatch(updateData())}>Change context</button>
{contextData[0].userId}
</div>
);
}

最佳答案

您的组件在每次更新时都重新渲染的原因是因为您再次获取数据并在 redux 存储中更新它,
由于数据的引用发生了变化,useSelector函数返回一个新值并重新渲染组件。
您可以通过 deepEqual比较函数作为 useSelector 的第二个参数为了避免重新渲染它数据没有改变

import _ from 'underscore';
...
const contextData = useSelector(state => state.data, _.isEqual);
但是,您必须小心使用它并测量数据更新的频率,否则您将在代码中添加一个额外的计算,这甚至不会阻止多次重新渲染
Working demo

关于javascript - 即使数据没有改变,react redux useSelector 也会重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62214646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com