Tob*_*s K 4 javascript reactjs redux redux-thunk react-hooks
我正在使用 redux 和 redux thunk 进行反应。我有一个动作,我正在发出网络请求。使用 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>
);
Run Code Online (Sandbox Code Playgroud)
}
您的组件在每次更新时重新渲染的原因是因为您再次获取数据并在 redux 存储中更新它,
由于数据的引用发生了变化,该useSelector
函数会返回一个新值并重新渲染组件。
您可以将deepEqual
比较函数作为第二个参数传递useSelector
给 以避免重新呈现数据未更改
import _ from 'underscore';
...
const contextData = useSelector(state => state.data, _.isEqual);
Run Code Online (Sandbox Code Playgroud)
但是,您必须谨慎使用它并测量数据更新的频率,否则您将在代码中添加额外的计算,这甚至不会阻止多次重新渲染
归档时间: |
|
查看次数: |
7575 次 |
最近记录: |