Vue——02-05监听器-watch

简介: 监听器-watch

watch:在vue中,使用watch来响应数据的变化,监听异步操作异步场景。

{{watchFullName}}无需加()

案例只监听了data中数据的watchFullName的变化

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>监听器</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
</head>
<body>
    <!-- watch监听异步操作异步场景监听器后面无需加()
        此案例只监听了data中数据的watchFullName的变化
    -->
    <div id="box">
        <h1>计算属性:computed</h1>
        {{fullName}}
        <h1>方法:methods</h1>
        {{fullName2()}}
        <h1>监听器:watch</h1>
        {{watchFullName}}
        <h1>年龄</h1>
        {{age}}
    </div>
    <script>
        var other = 'This is other';
        var box = new Vue({
            el:'#box',
            data:{
                firstName:'Nan',
                lastName:'Chen',
                age:18,
                watchFullName:'NanChen',
            },
            methods: {
                    fullName2:function(){
                        console.log("调用了fullName,执行了一次方法")
                        fullName2 = this.firstName+this.lastName+","+other;
                        return fullName2;
                    }
                },
            computed: {
                    fullName:function(){
                    console.log("调用了fullName,计算了一次属性")
                    return this.firstName+this.lastName+","+other;
                    }
                },
                watch:{
                    immediate: true,
                    firstName:function(newName,oldName){
                        console.log("lastName触发了watch,newLastName="+newName+",oldLastName="+oldName);
                        this.watchFullName = this.firstName+this.lastName+","+other;
                    },
                    lastName:function(newName, oldName){
                        console.log("lastName触发了watch,newLastName="+newName+",oldLastName="+oldName)
                        this.watchFullName = this.firstName+this.lastName+","+other
                    }  ,
                }
        })
    </script>
</body>
</html>

20210924161802389.png

这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。

那如何去修改年龄(age)呢?

可以直接在控制台写

box.age=80

20210924165458754.png

这里的方法需要重新执行,而watch中没有age属性所以不用在执行一遍

如何更改other的值?

20210924165942555.png

因为不是box中的元素所以可以直接写other

20210926144001617.png

20210926144105409.png

这里没有发生任何变化再次修改firstName就会进行重新渲染

20210926144235977.png

原因:是因为我们调用firstName的时候触发了所有的方法包括更改后的watch,上面已经改为了新的值,所以也会跟着改。在实例外的对象,它并不是一修改就有的。而是在修改之后再次修改实例内置对象,它才会更改。

结论:

使用computed计算了fullName属性,值为firstName+lastName。

计算属性具有缓存功能,当firstName和lastName都不改变的时候,fullName不会重新计算,比如我们改变age的值,fullName的值是不需要重新计算的。

methods并没有缓存特性,比如我们改变age的值,fullName2()方法会被执行一遍。

当一个功能可以用上面三个方法来实现的时候,明显使用computed更合适,代码简单也有缓存特性。

计算属性范围在vue实例内,修改vue实例外部对象,不会重新计算渲染,但是如果先修改了vue实例外对象,在修改vue计算属性的对象,那么外部对象的值也会重新渲染。

computed和watch

computed:计算属性范围在Vue实例的fullName内所管理的firstName和lastName,通常监听多个变量

watch:监听数据变化,一般只监听一个变量或数组

使用watch深度监听01

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  </head>
  <body>
  <div id="app">
             <p>FullName: {{person.fullname}}</p>
             <p>FirstName: <input type="text" v-model="person.firstname"></p>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
  <script>
    const app = new Vue({
    el: "#app",
    data() {
      return {
      person: {
        firstname: 'Menghui',
        lastname: 'Jin',
        fullname: ''
      }
      }
    },
    methods: {
    },
    computed: {
                   person2(){
         return JSON.parse(JSON.stringify(this.person));
       }//解决深度监听新老值同源问题
    },
    watch:{
       person2:{
          handler(n,o){
        console.log(this.person);
        console.log(n.firstname);
              console.log(o.firstname);
        /* this.person.fullname = this.person.firstname + this.person.lastname */
       },
      /* immediate: true, */
       deep: true  // 可以深度检测到 person 对象的属性值的变化
       }
    }
    })
  </script>
  </body>
</html>

watch深度监听02

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  </head>
  <body>
  <div id="app">
    <h2>{{sum}}</h2>
    <button @click="sum++">点击</button>
             <p>FullName: {{person.fullname}}</p>
             <p>FirstName: <input type="text" v-model="person.firstname"></p>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
  <script>
    const app = new Vue({
    el: "#app",
    data() {
      return {
      sum:0,
      person: {
        firstname: 'Menghui',
        lastname: 'Jin',
        fullname: ''
      }
      }
    },
    methods: {
    },
    computed: {
                   person2(){
         return JSON.parse(JSON.stringify(this.person));
       }//解决深度监听新老值同源问题
    },
    watch:{
       person2:{
          handler(n,o){
        console.log(this.person);
        console.log(n.firstname);
              console.log(o.firstname);
        /* this.person.fullname = this.person.firstname + this.person.lastname */
       },
      /* immediate: true, */
       deep: true  // 可以深度检测到 person 对象的属性值的变化
       },
       sum:{
        handler(n,o){
         console.log('sum的值变化了',n,o);
        }
       }
    }
    })
  </script>
  </body>
</html>
相关文章
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
22 1
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
25天前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
28天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
|
28天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
28天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
28天前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
24 1
vue学习第7章(循环)