美文网首页
react-redux 深监听(watchDeep)

react-redux 深监听(watchDeep)

作者: AAA前端 | 来源:发表于2019-07-26 10:08 被阅读0次
    • 项目里面遇到一个情况,redux获取的数据,然后点击改变数据源中的一个数据,不能引起redux的更新。
    import React, { Component, Fragment } from 'react';
    import { connect } from 'react-redux';
    import { actionCreators } from '../store';
    class Main extends Component {  
      render() {
        const { qrcodeReturnList } = this.props;
        return (
          <Fragment>
            {qrcodeReturnList.map(item => {
              return item.bookVos.map(ite => {
                return <span className="l-mr3"
                  onClick={(e) => this.onChangeBookState(item.qrCodeNumber, 4, ite.bookBagDetailSysNo)}
                >{ite.bookState}</span>
              })
            })}
          </Fragment>
        )
      }
      // 改变数据中的bookState
      onChangeBookState = (qrcodeNumber, value, bookBagDetailSysNo) => {
        let list = this.props.qrcodeReturnList;
        
        for (let i = 0, len = list.length; i < len; i++) {
    
          if (qrcodeNumber === list[i].qrCodeNumber) {
            
            const arr = list[i].bookVos;
    
            for (let j = 0, leng = arr.length; j < leng; j++) {
    
              if (bookBagDetailSysNo === arr[j].bookBagDetailSysNo) {
    
                arr[j].bookState = value;
    
                break;
              }
            }
          }
        }
        
        this.props.changeQrcodeList(list)
      }
    }
    const mapState = (state) => ({ 
      qrcodeReturnList: state.flowBags.qrcodeReturnList, //获取数据
    })
    const mapDispatch = (dispatch) => ({
      changeQrcodeList(list) {
        dispatch(actionCreators.changeQrcodeList(list))
      },
    })
    export default connect(mapState, mapDispatch)(Main);
    
    
    • 上面例子中,我从redux中获取数据qrcodeReturnList。这是一个列表1,列表1里面又有一个列表2,列表2中每一项有个bookState的值,开始都是2.然后我通过点击事件把它变为4.(这是我期望的表现)


      image.png
    • 但是实际操作中点击并没有发生变化。
      但是我再mapState中监听一个对象或者数组就可以实现深监听了。

      image.png
    import React, { Component, Fragment } from 'react';
    import { connect } from 'react-redux';
    import { actionCreators } from '../store';
    class Main extends Component {  
      render() {
        const { qrcodeReturnList } = this.props;
        return (
          <Fragment>
            {qrcodeReturnList.map(item => {
              return item.bookVos.map(ite => {
                return <span className="l-mr3"
                  onClick={(e) => this.onChangeBookState(item.qrCodeNumber, 4, ite.bookBagDetailSysNo)}
                >{ite.bookState}</span>
              })
            })}
          </Fragment>
        )
      }
      // 改变数据中的bookState
      onChangeBookState = (qrcodeNumber, value, bookBagDetailSysNo) => {
        let list = this.props.qrcodeReturnList;
        
        for (let i = 0, len = list.length; i < len; i++) {
    
          if (qrcodeNumber === list[i].qrCodeNumber) {
            
            const arr = list[i].bookVos;
    
            for (let j = 0, leng = arr.length; j < leng; j++) {
    
              if (bookBagDetailSysNo === arr[j].bookBagDetailSysNo) {
    
                arr[j].bookState = value;
    
                break;
              }
            }
          }
        }
        
        this.props.changeQrcodeList(list)
      }
    }
    const mapState = (state) => ({ 
      watchDeep: {}, // watchDeep随便写啥都行,这么写语义化一点。 值可以是对象或者数组或函数,不能是字符串,数字,null等
      qrcodeReturnList: state.flowBags.qrcodeReturnList, //获取数据
    })
    const mapDispatch = (dispatch) => ({
      changeQrcodeList(list) {
        dispatch(actionCreators.changeQrcodeList(list))
      },
    })
    export default connect(mapState, mapDispatch)(Main);
    
    
    image.png
    • 本人菜鸡研究源码失败了,但是通过这次对比,猜测,mapState中监听数据,如果不是来自redux本身的引用类型,会触发类似vue中的watch deep效果。

    相关文章

      网友评论

          本文标题:react-redux 深监听(watchDeep)

          本文链接:https://www.haomeiwen.com/subject/detrrctx.html