解决vue更新对象数组时,视图不更新以及更新错误问题

最近因为工作需求原因一直使用VUE框架,作为时下最热门的渐进式框架,开发起来确实非常给力~
当然一个好的工具也不可能完全对你百依百顺,最近在工作中就遇到了一个问题,经过一下午的奋战终于搞定了,秉承着本熊一贯的无私奉献的原则,也为了向诸位同行一同探讨,特地临时搭了一个架子来演示解决过程,如果有更好方式欢迎指正:
大致需求是这样的:
当我点击类型下拉框时,要同步更新这行的数据:
在这里插入图片描述
嗯~感觉so easy!
一阵悦耳的:啪!啪!啪!啪…(是敲键盘啦~)
大致思路就是:
1、获取选中的类型值和对应的数据索引;
2、根据类型值去数据中找到对应的数据;
3、再根据索引将数据赋值给数组的指定位置
代码如下

methods: {
    selectionType(val, index) {
      var selectItem = {};
      this.tableData.forEach((item, index) => {
        if (item.type == val) {
          selectItem = item;
        }
      });
      this.tableData[index] = selectItem;
    }
  }

接下来我们看效果:
1、首先选择一个类型,点击:
在这里插入图片描述
2、查看效果,发现前三项数据正常更新了,当然只点一下怎么能满足我
在这里插入图片描述
3、然后就…筐瓢了。
在这里插入图片描述
但是没关系,遇到问题搞定就是了,然后查了下官方文档:
在这里插入图片描述
说得是呢~
在这里插入图片描述
立马开始实践:

//   this.tableData[index] = selectItem;
     this.$set(this.tableData, index, selectItem);

。。。。
在这里插入图片描述
经过一番研究,发现居然是因为索引问题:
1、为了获取当前数据的所在的索引,手动在生命周期中添加了index属性,以便于操作项能判断当前数据是否需要继续上移还是下移按钮;
2、虽然当替换完数组项后,重新调用了更新数组索引方法,但貌似这个并没有生效;
在这里插入图片描述
ok既然知道问题所在了,我们需要的是当点击下拉选项后,只更新数据,索引不变即可

//   this.tableData[index] = selectItem;
//   this.$set(this.tableData, index, selectItem);

this.tableData[index].type = selectItem.type;
this.tableData[index].name = selectItem.name;
this.tableData[index].tip = selectItem.tip;
this.tableData[index].required = selectItem.required;
      
this.tableData = upload(this.tableData);

再点点看
(1)
在这里插入图片描述
(2)
在这里插入图片描述
完美~~~
当然如果真的要一个个赋值未免太二了,所以最终代码如下:

methods: {
    selectionType(val, index) {
      var selectItem = {};
      var newTableData = [];

      this.tableData.forEach((item, index) => {
        delete item.index;
        if (item.type == val) {
          selectItem = item;
        }
      });
      this.tableData[index] = selectItem;

      // JSON.parse(JSON.stringify(this.dataA));
      // 解决data的数据给了newTableData变量,改变newTableData的值,data对象也变化的
      newTableData = JSON.parse(JSON.stringify(this.tableData));
      this.tableData = upload(newTableData);
    }
  }

如果有更好的方法欢迎批评指正
在这里插入图片描述

Vue 3中,当你对变量进行更改后,如果变量没有更新,可能是由于以下几个原因: 1. 响应式属性:Vue 3中,只有被声明为响应式属性的变量才会在数据更改自动更新视图。确保你的变量被正确地声明为响应式属性,可以使用`ref`函数进行声明。 ```javascript import { ref } from 'vue'; const myVariable = ref(initialValue); ``` 这样声明后,你可以通过`myVariable.value`来访问变量的值,并且在更改变量值视图会自动更新。 2. 缺少响应式依赖:Vue 3使用了基于Proxy的响应式系统,它会自动追踪变量的使用情况并建立依赖关系。如果你在模板或计算属性中没有正确地使用变量,Vue 将无法追踪到对应的依赖关系,导致变量不会更新。确保在模板或计算属性中正确地使用变量。 3. 引用类型的变量:如果你的变量是一个对象或数组,当你对其进行修改Vue 不能检测到具体的属性变化。为了使Vue能够追踪到引用类型变量的属性变化,你可以使用`reactive`函数来声明变量。 ```javascript import { reactive } from 'vue'; const myVariable = reactive({ prop: initialValue }); ``` 这样声明后,在修改`myVariable.prop`的值,变量的变化会被正确地追踪和更新。 请确保以上情况都排查过后,如果问题仍然存在,可能是由于其他代码逻辑或框架问题引起的。可以提供更多的代码细节或错误提示,以便更好地帮助你解决问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值