Vue数据绑定失败,v-if,:key,变异方法刷新无用的解决方案

先说结论

当v-model绑定一个对象A时,如果对象A的键以对象B为值A.data:B,在对象B更新后,那么即使使用变异方法,v-if、:key更新组件也是在对象A中拿不到对象B的数据的,需要A.data=B重新赋值,完成对v-model直接绑定的对象A的更新。

Vue只在视图与直接绑定的逻辑之间做了双向绑定,无法绑定到深层逻辑,也就是说:逻辑与逻辑之间没有双向绑定。

缘起

今天帮老师做项目,要在table里不断push进条目的代码

初始状态


v-model绑定数据如下:

<div class="col-12">
    <card :title="table1.title" :subTitle="table1.subTitle">
        <div slot="raw-content" class="table-responsive">
          	<paper-table  :data.sync="table1.data" :columns="table1.columns">
          	</paper-table>
        </div>
    </card>
</div>

paper-table是我自己注册的组件,data是表格数据,columns是表头字符串数组。

下面是data,columns的定义

const tableColumns = ["LOGIC_CORE_INDEX", "CPU型号", "逻辑核心频率", "CPU占用率", "CPU架构"];
data() {
    return {
      tableData: [
      ], 
      table1: {
        title: "CPU数据一览",//这些属性在组件注册的时候写好了
        subTitle: "监控模型的总计算资源",
        columns: [...tableColumns],
        data:[],//等下拿到数据直接赋值,不能通过另一个变化属性作为值
      },
	}
}

下面是数据更新操作

methods: {
    postData(url, data) {
      return new Promise(() => {
        var CPUIdx = Axios.post(url + "/watch")
        Axios.all([CPUIdx])
          .then(Axios.spread((CPUI) => {
            this.tableData = []
            this.add(CPUI.data.centralProcessor.logicalProcessorCount,
              CPUI.data.centralProcessor.processorIdentifier.name,
              CPUI.data.centralProcessor.currentFreq,
              CPUI.data.cpuInfo.usePercent,
              CPUI.data.centralProcessor.processorIdentifier.microarchitecture
            ) //这里的参数是后端返回的接口值
          }))
          .catch(err => {
            console.log(err);
          })
      })
    },
    pollData() {
      this.polling = setInterval(() => {
        this.postData(globalVars.Url, {})
	}, 5000)

    },
    add(idx, mod, hz, use, arch) {
      var obj
      while (idx >= 1) {
        idx--
        obj = {
          LOGIC_CORE_INDEX: idx,
          CPU型号: mod,
          逻辑核心频率: hz[idx],
          CPU占用率: use,
          CPU架构: arch,
        }
        this.tableData.push(obj)
      }
      this.table1.data = this.tableData  //重点就在这一句
    },
  },
  mounted() {
    this.pollData()
  },
  beforeDestroy() {
    clearInterval(this.polling);
  }

有用请赞或评论支持

最后

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这个错误是Vue框架中常见的错误之一。它的意思是在使用v-for指令进行迭代时,需要为每个迭代的元素添加一个唯一的key属性,以便Vue可以跟踪和管理每个元素的状态。如果不添加key属性,Vue将无法正确渲染组件,并且会抛出这个错误。 解决这个错误很简单,只需要在v-for指令中添加一个key属性,并为每个元素指一个唯一的值即可。例如: ``` <template> <ul> <li v-for="item in items" :key="item.id">{{ item.name }}</li> </ul> </template> ``` 在这个例子中,我们为每个li元素添加了一个key属性,并将其设置为item对象的id属性。这样做可以确保每个元素都有一个唯一的标识符,Vue就可以正确地跟踪每个元素的状态了。 总之,要解决这个错误,只需要在使用v-for指令进行迭代时添加key属性,并为每个元素指一个唯一的值即可。 ### 回答2: vue/require-v-for-key是一个Vue.js的ESLint规则。这个规则会检查Vue.js的模板中的循环遍历(通过v-for指令)是否设置了唯一的key属性。 在Vue.js中,当我们使用v-for指令进行循环遍历时,每个被遍历的元素都需要设置一个key属性。key属性的作用是帮助Vue.js更高效地更新DOM,以提高性能和避免不必要的重新渲染。 如果我们不设置key属性,Vue.js将会给出警告,指出需要设置key属性。这个警告信息就是"elements in iteration expect to have 'v-bind:key' directives"。这个警告提示的意思是在循环遍历中的元素需要设置v-bind:key指令,也就是需要设置唯一的key属性。 为了解决这个问题,我们可以在循环遍历的元素上添加一个key属性,并将其设置为唯一的值。这个唯一的值可以是元素的ID,也可以是元素在数据列表中的索引值。通过设置唯一的key属性,Vue.js可以更好地跟踪和管理元素的状态和位置,从而提高应用程序的性能和用户体验。 总结来说,vue/require-v-for-key规则要求我们在Vue.js的循环遍历中的元素上设置唯一的key属性。这个规则的目的是帮助我们提高应用程序的性能,并避免不必要的DOM重新渲染。 ### 回答3: "elements in iteration expect to have 'v-bind:key' directives"是Vue.js的一个警告提示,意味着在使用v-for指令进行迭代时,需要在迭代的元素上添加v-bind:key指令。 v-for指令用于在Vue中进行列表渲染,它通过遍历数组或对象的属性来生成重复的元素。在每个迭代的元素中,都需要添加一个唯一的键来标识该元素,以便Vue能够追踪和管理这些元素的状态。 添加v-bind:key指令的作用是告诉Vue要跟踪每个元素的唯一键,并在重新渲染列表时进行高效的diff算法比较。如果不添加该指令,Vue无法准确地识别每个元素,可能会导致性能下降或出现一些意想不到的bug。 示例代码如下: ```html <template> <div> <ul> <li v-for="item in itemList" :key="item.id">{{ item.name }}</li> </ul> </div> </template> <script> export default { data() { return { itemList: [ { id: 1, name: 'item 1' }, { id: 2, name: 'item 2' }, { id: 3, name: 'item 3' } ] } } } </script> ``` 在上述例子中,v-for指令遍历itemList数组,并通过:keyitem.id作为每个li元素的唯一键。这样,Vue能够正确地跟踪每个元素的变化,确保在列表发生更新时能够正确地进行虚拟DOM的diff比较和渲染。 总之,添加v-bind:key指令是Vue.js中使用v-for指令进行迭代时的一个必需操作,以确保元素列表的稳性和性能优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值