记一次Redux中异步请求数据render不执行的问题

首先来一次问题的描述吧,个人感觉这样学习的方法不错。

关于Redux中state改变而render不渲染的问题。

实际问题场景如下:

数据:一个数组dateList,一个对象activeObj。
["2013","2014"],{}

在手风琴组件内,我们根据数组遍历生成对应List,并为其添加onChange监听。

理想效果为,根据点击的List发送ajax请求,在请求完成之前显示loading,并在ajax请求完成后显示相应数据。
实际效果为,无论你点击哪一个,都显示loading。

错误代码为:

// ajax请求后处理res
.then(res=>{
let result;
if(!this.props.activeObj){
  // 处理默认情况
  result={
    [date]:res.data.shiftList
  };
}else{
   // 问题关键部分
  result = this.props.activeObj;
  result[date] = res.data.shiftList;
}
this.props.setActiveObj({
  payload: result
});

错误主要原因:

而错误主要原因是没有好好理解Redux中state到底是个什么东西。
我们在通过this.props.setActiveObj(一个封装的dispatch)修改了activeObj对象。
而Redux中state树的改变是受我们操作影响的。result = this.props.activeObj 仅仅只是赋值了引用,而我们的修改 result[date] = res.data.shiftList也是在原来的activeObj对象上修改。所以导致结果是Redux没有发现state树的变化,所以并没有触发render刷新我们的视图。

总结

基本概念要熟,爬坑才足够迅捷,抓虫不要想的太复杂,错的往往都很简单。
PS:自己封装些异步请求组件吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值