IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 计算属性computed和监视属性watch的区别 -> 正文阅读

[JavaScript知识库]计算属性computed和监视属性watch的区别

计算属性和监视属性的区别

计算属性(computed)
定义:要用的属性不存在,得通过data中已有的属性计算得来
原理:底层通过Object.defineproperty方法提供的getter和setter
computed中可以分为getter和setter,一般情况下是没setter
get函数什么时候执行

  1. 初次读取计算属性时会执行一次
  2. 当依赖的数据发生改变时会被再次调用
    优点:内部有缓存机制,可复用,效率高,调式方便
    注意:如果计算属性要被修改,必须写set函数去响应修改
<div id="root">
   姓:<input type"text" v-model="lastName"/><br/>
   名:<input type"text" v-model="firtName"/><br/>
   姓名:<p>{{fullName}}</p>
</div>

<script>
    new Vue({
      el:'#root',
      data:{
        lastName:"张",
        firtName:"三"
      },
      computed:{
        fullName:{
          get(){
            return this.lastName+ '.' + this.firtName
          }
          set(value){
            let arr = value.split('.')
            this.firtName = arr[1]
            this.lastName = arr[0]
          }
        }
      }
    })
</script>

如果计算属性被多次调用,打开控制台发现get函数只会执行一次,因为computed有缓存

<div id="root">
   姓:<input type"text" v-model="lastName"/><br/>
   名:<input type"text" v-model="firtName"/><br/>
   姓名:<p>{{fullName}}</p>
   姓名:<p>{{fullName}}</p>
   姓名:<p>{{fullName}}</p>
   姓名:<p>{{fullName}}</p>
</div>

<script>
    new Vue({
      el:'#root',
      data:{
        lastName:"张",
        firtName:"三"
      },
      computed:{
        fullName:{
          get(){
            console.log("fullName执行一次")
            return this.lastName+ '.' + this.firtName
          }
          set(value){
            let arr = value.split('.')
            this.firtName = arr[1]
            this.lastName = arr[0]
          }
        }
      }
    })
</script>

如果没有对计算属性进行修改(只读取不修改),可以简写为

computed:{
  //简写 function(){}相当于get函数
  fullName:function(){
      return this.lastName+ '.' + this.firtName
  }
}

监视属性(watch)
当监视的属性变化时,回调函数自动调用,进行相关操作
监视属性必须存在,才能进行监视
监视有两种写法:
1. new Vue时传入watch配置
2. 通过vm.$watch监视

<div id="root">
  <p>今天心情{{result}}</p>
  <button @click="changeData">切换</button>
</div>

<script>
   const vm = new Vue({
      el:'#root',
      data:{
        isGood:true,
      },
      computed:{
		 result(){
		     return this.isGood ? '很好': '很不好'
		 }
	  },
	  //第一种写法
      watch:{
        isGood:{
          immediate:true,//是否立即执行,初始化时调用handler一次
          //监视属性发生变化时,handler函数被调用
          handler(newValue,oldValue){
            console.log(newValue,oldValue)
          }
        }
      }
    })
    //第二种写法
    vm.$watch('isGood',{
      immediate:true,//是否立即执行,初始化时调用handler一次
      handler(newValue,oldValue){
        console.log(newValue,oldValue)
      }
    })
</script>

深度监视

  • vue中watch默认不监视对象内部属性的变化
  • 配置deep为true,可以监视对象内部属性的变化
<div id="root">
  <p>a的值是{{number.a}}</p>
  <button @click="add">a+1</button>
   <br/>
  <hr/>
  <br/>
  <p>b的值是{{number.b}}</p>
  <button @click="add">b+1</button>
</div>

<script>
   const vm = new Vue({
      el:'#root',
      data:{
        number:{
          a:1,
          b:1
        }
      },
      watch:{
      //监视多级结构的某个属性变化
        /**'number.a':{
          immediate:true,//是否立即执行,初始化时调用handler一次
          handler(newValue,oldValue){
            console.log(newValue,oldValue)
          }
        }**/
        number:{
           //监视多级结构中所有属性的变化
           deep:true,
           handler(){
            console.log('number改变了')
          }
        }
      }
    })
</script>

computed和watch区别:
computed:有缓存机制;不能接受参数;不能与data中的属性重复
watch:没有缓存机制;可接受两个参数;监听属性必须存在;可进行异步操作

//computed写法
<div id="root">
   姓:<input type"text" v-model="lastName"/><br/>
   名:<input type"text" v-model="firtName"/><br/>
   姓名:<p>{{fullName}}</p>
</div>

<script>
    new Vue({
      el:'#root',
      data:{
        lastName:"张",
        firtName:"三"
      },
      computed:{
      //fullName监听属性不存在
        fullName(){
        //这样写法不行 computed不可以进行异步操作
         setTimeout(()=>{
            return this.lastName+ '.' + this.firtName
          },1000)   
          /**return this.lastName+ '.' + this.firtName**/
        }
      }
    })
</script>
//watch写法 监听属性必须存在
<div id="root">
   姓:<input type"text" v-model="lastName"/><br/>
   名:<input type"text" v-model="firtName"/><br/>
   姓名:<p>{{fullName}}</p>
</div>

<script>
    new Vue({
      el:'#root',
      data:{
        lastName:"张",
        firtName:"三",
        fullName:"张.三"
      },
      watch:{
        firtName(newValue){    
          //watch可以进行异步操作
          setTimeout(()=>{
          //fullName 监听属性必须存在
            this.fullName = this.lastName+ '.' + newValue
          },1000)     
        },
        lastName(newValue){    
          setTimeout(()=>{
             this.fullName = newValue + '.' + this.firtName
          },1000)      
        }
      }
    })
</script>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:15:09  更:2021-11-22 12:16:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 1:24:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码