在vue中,data里面的数据改变了,试图却没有更新,常见的情况是

直接通过数组下标来修改数据,如:this.arr[2] =‘testStr’
当你修改数组的长度时,如 this.arr.length = 0
对象的删除和添加如:源对象时obj:{aa:‘aa’} 然后直接 obj.test 或者 delete obj.aa
原因是Vue2.+ 中data数据对象是通过Object.defineProerty来进行数据的双向数据绑定,而数组则是监听数组的push和pop等操作数组的方法进行双向绑定的,因此当是通过下标来修改时便不能更新视图
异步队列更新dom导致的视图不更新,因为默认情况下,vuejs 是异步执行 dom 更新操作的。在下一个 tick 来临之前,vuejs 会收集数据变化,置于一个队列之中,下个 tick 来临之时,批量执行这些更新,并清空队列。虽然大部分情况下我们不需要关心这个更新 dom 机制,但是当下一步操作与之有关联时,我们就只能使用 nextTick 来解决了。即下一个数据的页面更新,依赖与上一个数据的页面更新完成时,才需要使用this.nextTick()来解决
此时我们该怎么办呢?有三种办法
1、 通过set()方法如:this. set()方法 如:this.set()方法如:this.set(this.arr,‘2’,’‘testStr’’) 即this.$set(obj,key,val)

2、通过forceUpdate 如:在修改完数据后,直接 this.$forceUpdate()

3、修改另一个data里面的值主动更新触发渲染

<template>
  <div class="demo" ref="refDemo">
      方法一:{{arr[2]}}
    
    <button @click="Add">+</button>
        方法二:obj:{{obj.test[0].testStr}}
        方法三:
        <div  >{{test}}</div>
        <div v-if="test"></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data(){
      return{
          arr:[1,2,3,4,5,6],
          obj:{
              test:[{testStr:3}]
          },
          test:false
      }
  },
  mounted() {
       
    
  },
  methods:{
      Add(){
          // 第一种方法  this.$forceUpdate()
         
          // this.arr[2]+=this.arr[2]
     
          // console.log('this.arr[2]:'+this.arr[2])
          // this.$forceUpdate()
           //=============================================
          //第二种方法 $set()
          
          // this.$set(this.obj.test[0],'testStr',this.obj.test[0].testStr+3)
          
           //=============================================
            // 方法三修改另一个data里面的值主动更新触发渲染
          
          //this.arr[2]+=this.arr[2]
          // this.test =!this.test
           //=============================================
          //方法三优化版
          this.arr[2]+=this.arr[2]
          this.test=true
          
         this.$nextTick(() => {
           this.test = false
         })
          
      }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

标签: none

添加新评论