首页前端开发VUEVue——02-05监听器-watch

Vue——02-05监听器-watch

时间2023-04-25 20:51:02发布访客分类VUE浏览942
导读:watch:在vue中,使用watch来响应数据的变化,监听异步操作异步场景。{{watchFullName}}无需加( 案例只监听了data中数据的watchFullName的变化<!DOCTYPE html> <htm...

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>
    

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

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

可以直接在控制台写

box.age=80

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

如何更改other的值?

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

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

原因:是因为我们调用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>
    

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

缓存JavaScript

若转载请注明出处: Vue——02-05监听器-watch
本文地址: https://pptw.com/jishu/8603.html
SAP UI5 index.html 根节点的 css 类填充逻辑 Vue——01起步、模板语法、条件语句

游客 回复需填写必要信息