vue2检测对象和数组生效问题

总结

对象

如果没有在data里面定义的属性名,想要添加新的属性名,就需要vm.$set()方法,使vue能够检测到,或者使用vm.$forceUpdate()钩子强制刷新数据只是这样做不会给新的属性名添加get()set()方法,下次还想改变这个属性名的值,还需要调用vm.$forceUpdate()钩子

vm.$forceUpdate()钩子 适合一次性的且修改的地方比较多

数组

不能通过数组的下标直接修改,可以使用vm.$set()方法,还可以使用vue官网提供的修改数组的方法,这样做都是响应式的。

也可以使用 vm.$forceUpdate()钩子  只不过,他只生效一次。

代码案例

<template>
  <div class="test">
    <div>test</div>
    <div>
      {{arr}}
      <span @click="arrMethod">点击改变数组</span>
    </div>
    <div>
      {{obj}}
      <span @click="objMethod">点击改变对象</span>
    </div>
    <div>
      <span @click="forceUpdateAfter">点击测试$forceUpdate()的对象属性 以后是不是响应式的</span>
      <br>
      <span>很显然不是响应式的如果以后想再次生效只能再掉用$forceUpdate()钩子</span>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      arr: [1, 2, 3, 4],
      obj: {
        a: "a",
        b: {
          c: "c"
        }
      },
      temp: {}
    };
  },
  methods: {
    arrMethod() {
      //this.arr = [5, 6, 7, 8];//可以直接改变根元素
      //this.arr[0] = 111; //不能通过下标直接该值,不然vue检测不到数组变化
      //可以通过 vm.$set(要改变的数组,下标,改变后的值) 来改变 或者Vue.set()
      this.$set(this.arr, 0, 1111);

      //this.$forceUpdate();//通过vue的生命周期钩子 vm.$forceUpdate() 也可以实现$set()方法的效果, 强制刷新,解决页面不会重新渲染的问题
    },
    objMethod() {
      this.obj.b.d = "d"; //不能直接添加没有在data里面定义的属性和值
      //可以通过 vm.$set(要改变的对象,属性名,改变后的属性值) 来改变 或者Vue.set()
      //this.$set(this.obj.b, "d", "d");
      this.$forceUpdate();
      console.log(this.obj);
    },
    forceUpdateAfter() {
      this.obj.b.d = "ddd";
      console.log(this.obj);
    }
  }
};
</script>
<style lang="scss" scoped>
</style>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值