vue踩坑汇总

vue踩坑汇总

1 深拷贝

需要特别注意的是,接口数据经常以数组对象返回,如果需要复制该对象操作过程中不改变原数组对象,一定要注意深拷贝,避免数组中对象传址
深拷贝参考链接:
https://www.cnblogs.com/penghuwan/p/7359026.html
考虑性能只对部分元素深拷贝的话,使用immutable

2 computed

bug:计算属性依赖的响应式属性发生变化,却没有改变该属性

原因:根据systemId切换展示的是filterReverseTableData还是reverseTableData(因为systemId为7时,返回的数组对象属性要按选择条件过滤)。

<normalTable v-else :tableData="systemId==7?filterReverseTableData:reverseTableData"></normalTable>

computed: {
  reverseTableData() {
    let result = this.tableData.map(item => {
      return item
    })
    result.reverse()
    filterReverseTableData = result
    return result
  }
}

这样的写法,由于reverseTableData在页面其他位置不被使用,且模板中数据为filterReverseTableData,所以即使发送不同请求改变依赖属性tableData时,不会触发reverseTableData的计算属性,因此不会改变filterReverseTableData,自然不会发生页面的更新

修正:将过滤操作放到computed属性中,结合systemID判断,不需要再新增变量去做过滤

<normalTable v-else :tableData="reverseTableData"></normalTable>

computed: {
  reverseTableData() {
    let result = this.tableData.map(item => {
      return item
    })
    result.reverse()

    if (this.systemId==7) {
      // 需要删除的属性
      let filterColumn = []
      this.moneyTypeList.forEach(elem=>{
        if (elem.checked == false) {
          filterColumn.push(elem.moneytype_name)
        }
      })
      result.forEach(elem=>{
        for (let item in elem) {
          if (filterColumn.includes(item)) {
            delete elem[item]
          }
        }
      })
    } 

    return result
  }
}

理解:computed属性未被使用时,即使该属性依赖的响应式属性发生改变也不会触发computed函数更新视图。

反思:虽然误打误撞get到了一个知识点,但是从解决方案来看,这种bug完全是可以避免的,因为设计的不合理,不止是新增了无谓的根变量,让代码看起来一团糟。总而言之,要合理地设计数据的流向再思考交互,能让代码看起来更清晰合理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值