Vue中watch监听属性新旧值相同的问题解决方案

 更新时间:2023年08月10日 10:28:42   作者:前端李十三  
这篇文章主要给大家分享了Vue中watch监听属性新旧值相同问题解决方案,如果有遇到相同问题的朋友,可以参考阅读本文

侦听器 _watch:

作用:可以侦听data和computed中数据的变化.

语法

watch: { "被侦听的属性名" (newVal, oldVal){ } }

监听简单数据类型时可以直接使用,而监听复杂数据类型时,例如当我们只需要监听data或者computed中对象的某个属性时,可以使用字符串的形式进行监听.

//举例: 
watch: {
​    //字符串形式  表示监听item对象下的good_count属性
​    'item.goods_count'(newval) {
​      if (newval <= 0) {
​        this.item.goods_count=1    
​      }
​    }
  }

在watch中,如果对对象进行监听,只有对象obj被重新赋值时,watch才会被监听到,这个时候无法对obj里面的属性的变化进行监听,我们也可以给watch对象加上深度监听属性.

      handler(newval, oldval) {
        console.log("完整写法,监听复杂数据类型", newval);
      },
      deep: true, //表示开启深度监听
      immediate: true, //立即监听,在页面初始化时,会监听一次
    }

而监听复杂数据类型,当复杂数据类型被改变之后,newval的值改变,由于newval和oldval都指向同一个对象,导致oldval也会随之改变,打印出来则没有了old和new之分.

解决方法:在初始化的时候,深克隆一个oldval.

也有看其他人写的文章解决方案,都大差不差,都是使用一个计算属性加上深拷贝,看别人的回答时总感觉很拗口.于是自己总结了一下.

在我看来,解决此问题的关键在于:我们此时遇到的问题就是新值与旧值指向同一个地址的问题.而深拷贝的特点就是新开辟一个地址储存需要拷贝对象的所有属性.然后指向这个新地址. 故 JSON.parse(JSON.stringify())能完美解决其中的问题.然后与计算属性合并达到监听的属性一旦变化,自动新开辟一个地址,储存新值.而新值与旧值指向的地址不同,则解决了新值与旧值相同的问题.

  <div id="app">
    <input type="text" v-model="lzy.age" />
  </div>
</template>
<script>
export default {
  name: "App",
  watch: {
    lzy2: {
      handler(newvalue, oldvalue) {
        console.log("新值");
        console.log(newvalue);
        console.log("旧值");
        console.log(oldvalue);
        console.log(oldvalue===this.lzy);
      },
      deep: true,
    },
  },
  data() {
    return {
      lzy: {
        gender: "man",
        age: 21,
      },
    };
  },
  computed: {
    lzy2(){
      return JSON.parse(JSON.stringify(this.lzy))
      // 因为计算属性一开始就执行了一次,相当于在一开始就深拷贝拿到了oldvalue,改变之后又再一次深拷贝,每一次深拷贝生成的对象都是指向不同的地址,所以oldvalue和newvalue是两个不同的地址.
    },
  },
};
</script>
<style scoped>
</style>

到此这篇关于Vue中watch监听属性新旧值相同问题解决方案的文章就介绍到这了,更多相关Vue watch监听属性新旧值相同内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue实现监听dom节点宽高变化方式

    Vue实现监听dom节点宽高变化方式

    这篇文章主要介绍了Vue实现监听dom节点宽高变化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vuex简单入门

    Vuex简单入门

    本篇文章主要介绍了初步认识理解Vuex,Vuex就是在一个项目中,提供唯一的管理数据源的仓库,有兴趣的可以了解一下
    2017-04-04
  • 详解vue-cli中模拟数据的两种方法

    详解vue-cli中模拟数据的两种方法

    这篇文章主要介绍了vue-cli中模拟数据的两种方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • 详解一次Vue低版本安卓白屏问题的解决过程

    详解一次Vue低版本安卓白屏问题的解决过程

    这篇文章主要介绍了详解一次Vue低版本安卓白屏问题的解决过程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • vue中的计算属性的使用和vue实例的方法示例

    vue中的计算属性的使用和vue实例的方法示例

    本篇文章主要介绍了vue计算属性的使用和vue实例的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • vue中实现图片和文件上传的示例代码

    vue中实现图片和文件上传的示例代码

    下面小编就为大家分享一篇在vue中实现图片和文件上传的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue中监听返回键问题

    vue中监听返回键问题

    这篇文章主要介绍了解决vue中监听返回键问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 详解vue使用插槽分发内容slot的用法

    详解vue使用插槽分发内容slot的用法

    这篇文章主要介绍了vue使用插槽分发内容slot的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • vue项目中$t()的意思是什么

    vue项目中$t()的意思是什么

    这篇文章主要介绍了vue项目中$t()的意思是什么,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 关于Vue的 Vuex的4个辅助函数

    关于Vue的 Vuex的4个辅助函数

    这篇文章主要介绍了关于Vue的 Vuex的4个辅助函数,辅助函数的好处就是帮助我们简化了获取store中state、getter、mutation和action,下面我们一起来看看文章具体的举例说明吧,需要的小伙伴也可以参考一下
    2021-12-12

最新评论