react-redux使用useSelector获取数据导致组件重复渲染的问题

当使用React-Redux的useSelector钩子从store获取数据时,即使组件未使用变更的数据,store变化也会导致组件重复渲染。这是因为默认的浅比较策略。为避免这种情况,可以传递一个比较函数作为useSelector的第二个参数,如shallowEqual,以减少不必要的重渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象:通过redux中的hooks – useSelector 获取store中的数据时,只要store中的数据发生了改变,即使组件中并没有获取修改的数据,组件也会进行重新渲染。

原因:是因为useSelector中默认使用的是 === 来判断两次获取的数据结果是否相同, 如果我们返回的是一个新对象(如果返回的是基本数据类型,则不存在该问题),那么每次比较结果都为false,导致了很多不必要的re-render。如下:

const _obj = useSelector((store: any) => ({      
  aaa: store.xxx.aaa,      
  bbb: store.xxx.bbb, 
}));

解决:可以通过useSelector hooks的第二个参数。useSelector的第二个参数是一个比较函数,比较结果为true是不进行重新渲染,为false才渲染。可以使用react-redux提供的shallowEqual函数、lodash的isEqual(), 或者自己定义的函数。

import { useSelector, shallowEqual } from 'react-redux'; 

const _obj = useSelector((store: any) => ({      
  aaa: store.xxx.aaa,      
  bbb: store.xxx.bbb, 
}), shallowEqual);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值