HuKai's Blog HuKai's Blog
首页
  • Java核心技术

    • Java基础
    • Java并发编程
    • JVM
    • Java新特性
  • Spring生态

    • Spring5
    • SpringMVC
    • SpringBoot
  • 开源框架

    • MyBatis
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
  • 页面样式

    • HTML
    • CSS
  • JavaScript

    • JavaScript基础
    • ECMAScript6教程
    • TypeScript
  • 前端框架

    • Vue
    • Webpack
  • NIO
  • Netty
  • RabbitMQ
  • 技术文档

    • GitHub技巧
    • 博客搭建
    • 技术笔记
  • 优质文章

    • 小技巧
    • 解决方案
GitHub (opens new window)

HuKai

梦想成为全栈的保安
首页
  • Java核心技术

    • Java基础
    • Java并发编程
    • JVM
    • Java新特性
  • Spring生态

    • Spring5
    • SpringMVC
    • SpringBoot
  • 开源框架

    • MyBatis
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
  • 页面样式

    • HTML
    • CSS
  • JavaScript

    • JavaScript基础
    • ECMAScript6教程
    • TypeScript
  • 前端框架

    • Vue
    • Webpack
  • NIO
  • Netty
  • RabbitMQ
  • 技术文档

    • GitHub技巧
    • 博客搭建
    • 技术笔记
  • 优质文章

    • 小技巧
    • 解决方案
GitHub (opens new window)
  • HTML

  • CSS

  • JavaScript基础

  • ECMAScript

  • TypeScript

  • Vue

    • Vue基础

      • 初识Vue
      • 模板语法 - 插值语法 - 指令语法
      • 计算属性和监听属性
        • 计算属性 computed
        • 监视属性 watch
        • 计算属性与监视属性的区别
      • 样式绑定 - class - style
      • 列表渲染v-for
      • 事件处理v-on
      • 表单输入绑定
      • 生命周期钩子
      • 过滤器filter
      • 常用内置指令
      • 自定义指令
    • Vue组件化编程

    • Vue脚手架

    • Vue插件

  • Webpack

  • 前端
  • Vue
  • Vue基础
HuKai
2022-02-22
目录

计算属性和监听属性

官方文档:计算属性和侦听器 — Vue.js (vuejs.org) (opens new window)

# 计算属性 computed

在computed属性对象中定义计算属性的方法,在页面中使用来显示计算的结果

  1. 定义:要用的属性不存在,要通过已有属性计算得来。

  2. 原理:底层借助了Objcet.defineproperty方法提供的getter和setter。

  3. get 函数什么时候执行?

    • 初次读取时会执行一次。

    • 当依赖的数据发生改变时会被再次调用。

  4. 优势:与 methods 实现相比,内部有缓存机制(复用),效率更高,调试方便。

  5. 备注:

    1. 计算属性最终会出现在 vm 上,直接读取使用即可。
    2. 如果计算属性要被修改,那必须写 set 函数去响应修改,且 set 中要引起计算时依赖的数据发生改变。
    //完整写法
    fullName:{
        get(){
            console.log('get被调用了')
            return this.firstName + '-' + this.lastName
        },
        set(value){
            console.log('set',value)
            const arr = value.split('-')
            this.firstName = arr[0]
            this.lastName = arr[1]
        }
    } 
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //简写
    fullName(){
        console.log('get被调用了')
        return this.firstName + '-' + this.lastName
    }
    
    1
    2
    3
    4
    5
    // Make sure to add code blocks to your code group

    # 监视属性 watch

    通过 vm 对象的$watch()或watch配置来监视指定的属性,当属性变化时, 回调函数自动调用, 在函数内部进行计算

    1. 当被监视的属性变化时, 回调函数自动调用, 进行相关操作
    2. 监视的属性必须存在,才能进行监视!!
    3. 监视的两种写法:
    • (1). new Vue时传入watch配置
    watch:{
        isHot:{
            immediate:true, //初始化时让handler调用一下
            //handler什么时候调用?当isHot发生改变时。
            handler(newValue,oldValue){
                console.log('isHot被修改了',newValue,oldValue)
            }
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    • (2). 通过vm.$watch监视
    vm.$watch('isHot',{
        immediate:true, //初始化时让handler调用一下
        //handler什么时候调用?当isHot发生改变时。
        handler(newValue,oldValue){
            console.log('isHot被修改了',newValue,oldValue)
        }
    })
    
    1
    2
    3
    4
    5
    6
    7

    深度监视:

    • (1). Vue 中的 watch 默认不监测对象内部值的改变(一层)。
    • (2). 配置deep:true可以监测对象内部值改变(多层)。

    备注:

    • (1). Vue 自身可以监测对象内部值的改变,但 Vue 提供的 watch 默认不可以!
    • (2). 使用 watch 时根据数据的具体结构,决定是否采用深度监视。
    numbers:{
        deep:true,
        handler(){
            console.log('numbers改变了')
        }
    }
    
    1
    2
    3
    4
    5
    6
      //正常写法
      isHot:{
        // immediate:true, //初始化时让handler调用一下
        // deep:true,//深度监视
        handler(newValue,oldValue){
            console.log('isHot被修改了',newValue,oldValue)
        }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      //简写
      isHot(newValue,oldValue){
        console.log('isHot被修改了',newValue,oldValue,this)
      } 
      
      1
      2
      3
      4
      // Make sure to add code blocks to your code group

      # 计算属性与监视属性的区别

      • 计算属性变量在 computed 中定义,监视属性监听的是已经在 data 中定义的变量, 当该变量变化时,会触发 watch 中的方法.

      • computed 具有缓存功能,可以监听对象某个具体属性。

      • watch 可以进行深度监听,监听对象的变化。

      • 计算属性是声明式的描述一个值依赖了其他值,依赖的值改变后重新计算结果更新 DOM。监视属性的是定义的变量,当定义的值发生变化时,执行相对应的函数。

      • computed 能完成的功能,watch 都可以完成。watch 能完成的功能,computed 不一定能完成,例如:watch 可以进行异步操作。

      代码示例:

      <div id="demo">
          姓:<input type="text" placeholder="First Name" v-model="firstName"><br>
          名:<input type="text" placeholder="Last Name" v-model="lastName"><br>
          姓名1(单向):<input type="text" placeholder="Full Name1" v-model="fullName1"><br>
          姓名2(单向):<input type="text" placeholder="Full Name2" v-model="fullName2"><br>
          姓名3(双向):<input type="text" placeholder="Full Name3" v-model="fullName3"><br>
      
          <p>{{fullName1}}</p>
          <p>{{fullName1}}</p>
          <p>{{fullName1}}</p>
      
      </div>
      
      <script src="../js/vue.js"></script>
      <script>
          const vm = new Vue({
              el: '#demo',
              data: {
                  firstName: 'A',
                  lastName: 'B',
                  fullName2: 'A B'
              },
      
              computed: {
                  // 什么时候执行:初始化显示 / 相关的data属性数据发生改变
                  // 做什么的: 计算并返回当前属性的值
                  fullName1() { //计算属性中的一个方法,方法的返回值作为属性 (回调函数)
                      console.log('fullName1()') // 必然会掉用
                      return this.firstName + ' ' + this.lastName;
                  },
      
                  fullName3: { //不是函数是一个对象,里面有两个方法  
                      get() {
                          // 回调函数 : 1. 你定义的 2. 你没有调用 3. 但他最终执行了
                          // 1. 什么时候调用? 2. 用来做什么
                      // 回调函数 当需要读取当前属性值时回调  根据相关的数据计算并返回当前属性的值
                          return this.firstName + ' ' + this.lastName;
                      },
      
                      set(value) {
                      // 回调函数 监视当前属性值的变化 当属性值发生改变时回调  更新相关的属性数据
                      const names = value.split(' ');
                      this.firstName = names[0];
                      this.lastName = names[1];
                      }
                  }
              },
      
              watch: { //配置监视
                  firstName: function(value){ // firstName 发生了变化
                      console.log(this); //就是vm对象
                      this.fullName2 = value + ' ' + this.lastName;
                  }
              }
          });
      
          vm.$watch('lastName', function(value) {
              //更新fullName2
              this.fullName2 = this.firstName + ' ' + value;
          })
      </script>
      
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62

      最后【补充】两个重要的小原则:

      1. 所被 Vue 管理的函数,最好写成普通函数,这样 this 的指向才是 vm 或 组件实例对象。
      2. 所有不被 Vue 所管理的函数(定时器的回调函数、ajax 的回调函数等、Promise 的回调函数),最好写成箭头函数,这样 this 的指向才是 vm 或 组件实例对象。
      编辑 (opens new window)
      #Vue
      上次更新: 2022/03/20, 11:17:00
      模板语法 - 插值语法 - 指令语法
      样式绑定 - class - style

      ← 模板语法 - 插值语法 - 指令语法 样式绑定 - class - style→

      最近更新
      01
      MyBatisPlus
      03-20
      02
      MyBatis源码剖析-延迟加载
      03-20
      03
      MyBatis源码剖析-二级缓存
      03-20
      更多文章>
      Theme by Vdoing | Copyright © 2021-2022 HuKai | 赣ICP备17016768号
      • 跟随系统
      • 浅色模式
      • 深色模式
      • 阅读模式