vue使用中数组没办法使得页面响应式变化的解决办法

Posted ZeeH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue使用中数组没办法使得页面响应式变化的解决办法相关的知识,希望对你有一定的参考价值。

问题来源: 工作中遇到需要使用数组来记录使得页面响应式变化的需求的时候,发现数组改变的时候,页面不会变化,但是控制台输出的数组是变化了,于是寻找原因

<template>
  <div>
    <a-row>
      <a-col :span="24">
        <div class="list">
            <a-list bordered :data-source="Tdata" :infinite-scroll-disabled="true" :infinite-scroll-distance="4">
              <!-- <a-list-item slot="renderItem" slot-scope="item"> -->
              <a-list-item v-for="(item,index) in Tdata" :key="item">
                <a-checkbox :checked="Status[index]" @change="onChange(index)" >
                  {{ item }}
                </a-checkbox>
              </a-list-item>
            </a-list>
            <p>{{ checked }}</p>
        </div>
      </a-col>
    </a-row>
  </div>
</template>
<script>
import Vue from \'vue\'
export default {
  data() {
    return {
       Tdata: [1, 2, 3],
       queryParam: {
          barcodeEnd: \'\', //  条码终止号
          barcodeStart: \'\', // 条码起始号
          type: 0
        },
        Sdata: [],
        Status: [],
    }
  },
  onmounted() {
    this.init()
  },
  methods: {
    onChange: function (index) {
      var newFlag = !this.Status[index]
      Vue.set(this.Status, index, newFlag)
      console.log(this.Status[index])
      console.log(this.Status)
      this.checked = !this.checked
    },
      init: function () {
        this.Tdata.forEach((item, index) => {
          this.Status.push(true)
        })
        }
  }
}
</script>

先前开始的时候,在onChange里面的的代码是:

onChange: function (index) {
      var newFlag = !this.Status[index]
      this.Status[index] =  var newFlag 
      console.log(this.Status[index])
      console.log(this.Status)
      this.checked = !this.checked
    },

发现控制台输出确实改变了,但是页面中  p 标签里面的数组内容没有改变

 

解决方法:

找了一下,发现数组响应变化的只有特定的几个方法:

1.变异方法(修改原有数据,会影响原有数组数据)
都会被Vue处理成响应式的方式,只要调用这些方法,都会影响到页面中模板内容的变化
this.list.push(this.fname)

  • push()数组末尾添加一个或多个元素
  • pop()删除数组的最后一个元素
  • shit()删除数组的第一个元素
  • unshit()向数组开头添加一个或多个元素
  • splice()删除数组中指定元素
  • sort()对数组中的元素进行排序
  • reverse()反转数组,颠倒顺序

2.使用Vue.set

 

 

 

例如:

  this.$set(this.SData[index],newValue)

  或

  Vue.set(this.SData[index],newValue)

 或

Vue.set(Array, index , newValue)

以上是关于vue使用中数组没办法使得页面响应式变化的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

vue对象数组响应式——$set||splice

探索 Vue.js 响应式原理

Vue2源码解读

vue中响应式props办法

vue中detele删除对象属性时视图不能响应更新 - 解决办法

七vue中v-for有时候对页面不会重新渲染,数组变化后如何到渲染页面