React+Dva 当改变models中的state时,props中数据改变但不触发render事件导致页面无法再次更新渲染,深拷贝JSON的缺陷

dva是一个很好用的状态管理框架,
最近遇到了一个就是
当改变models中的state时,props中数据改变但不触发render事件导致页面无法再次更新渲染
贴上错误代码:
models文件:

  state: {
    items: [],//是一个引用数据类型,除了基本数据类型:Number、String、Boolean、Null、 Undefined、Symbol(ES6)之外都是
  },
  reducers: {
    save(state, { params }) {
      return { ...state, items: params };
    },

引用文件:

add = ()=>{
let {items} = this.props
items.push({
a:1,
b:2,
node:this.getNode
});
this.props.dispatch({
   type: 'model/save',
   params: items,
});
}

getNode = (item,index)=>{
return <div>{index}</div>
}
render函数
{this.props.items.map((item: any, index: number) => {
                      return item.node(item, index);
})}

然后你就会发现 当你通过按钮调用add函数的时候
屏幕一直是 为零 0,
所以这就出现一个问题,为什么props中数据改变但不触发render事件导致页面无法再次更新渲染,

原因:
如果这个props如果是引用数据类型的话,当这个引用数据类型的地址不发生变化时,
是不会触发componentWillReceiveProps,引发render函数的重新执行"
解决方案:
通过深拷贝,重新给items复制到一个新的堆栈,
let items = JSON,parse(JSON.stringify(this.props.items))//比较常用
这样子就可以了

但是JSON.parse,JSON.stringify也有引发另一个问题就是:
他无法拷贝函数,(补充:时间对象会变成 字符串 的形式、RegExp,Error、函数会丢失)
所以我就这样子,拷贝后再赋值给他

 let items:any = JSON.parse(JSON.stringify(this.props.items))
      for(let key in items){
        items[key].node=this.getNode
      }
      items.push(obj);
      this.props.dispatch({
        type: 'model/save',
        params: items,
      });
    }

如果有其他比较好的方法也很欢迎大家留言,一起学习进步

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值