Vue2侦听器及计算属性

Watch


watch侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作

监听器函数需要定义到Vue实例的watch节点下

监听器本质上是一个函数,要监听哪个数据的变化,就把数据名作为方法名

方法格式监听

 const app=new Vue({
    el: '#app',
    data:{
      username: ''
    },
    watch:{
     //监听username值得变化
     //newVal是变化后的新值,oldVal是变化之前的旧值
      username(newVal, oldVal){
        console.log(newVal, oldVal)
      }
    }
  })

如果要侦听的是对象的子属性变化,也可以使用方法格式的侦听

  watch:{
  		//如果侦听的是对象的子属性的变化,需要包裹一层单引号
        'info.username'(newVal, oldVal){
          //code
        }
    }

方法格式的监听器无法在刚进入页面时自动触发

数组格式监听

当侦听器传入一个回调数组,他们会被逐一调用

  watch:{
  		//如果侦听的是对象的子属性的变化,需要包裹一层单引号
        info:[
        	'handle1',
        	function handle2 (val, oldvalue){ /* code */ },
        	{
        		handler: function handle3 (val, oldvalue){ /* code */ }
        	}
        ]
    }

对象格式监听

默认情况下,组件在初次加载完毕后不会调用watch侦听器

如果想让watch立即被调用,需要使用immediate选项

  watch:{
      username: {
      //handler是固定写法,表示当username的值变化时,自动调用handler处理函数
        handler(newVal, oldVal){
          //code
        },
      //表示页面初次渲染好之后,就立即触发当前的watch侦听器
      immediate: true
      }
    }

如果监听到的是一个对象,那么对象中的值发生变化不会触发侦听器

此时需要对象格式侦听器中的另一个属性deep开启深度监听

开启深度监听后无法获得旧的值 旧的值获取到的为新的值

  watch:{
      info: {
      //handler是固定写法,表示当username的值变化时,自动调用handler处理函数
        handler(newVal, oldVal){
          //code
        },
      //开启深度监听,只要对象中任意一个属性变化了,就会触发"对象的侦听器"
      deep: true
      }
    }

每次对象中属性变化都会触发深度监听,此时在对象的监听函数handler中对变化的属性进行处理

监听路由中query参数的变化

watch: {
	$route: {
		handler() {
			// code 业务逻辑
		}
	},
	deep: true,
	// 深度监听 同时可以监听到params参数变化
}


计算属性


计算属性将被混入Vue实例中,所有getter和setter的this上下文自动的绑定Vue实例

计算属性的结果会被缓存,除非依赖的响应式property变化才会重新计算

如果某个依赖(非响应式property)在该实例范畴之外,则计算属性是不会被更新的


函数

计算属性指的是通过一系列运算之后,最终得到的一个属性值

这个动态计算出来的属性值可以被模板结构或methods方法使用

  const app=new Vue({
    el: '#app',
    data: {
      r: 0, g: 0, b: 0
    },
    computed: {
      rgb(){
        return `rgb(${this.r},${this.g},${this.b})`
      }
    },
    methods: {
      show(){
        console.log(this.rgb);
      }
    }
  })

当有部分代码需要重复操作时,可以封装到Vue实例的computed节点下,必须以函数声明

实际产生的为一个Vue实例中的属性,且属性名是函数名,属性值就是return的值

可以在Vue实例中通过this调用


箭头函数

计算属性可以使用箭头函数,但是箭头函数不能通过this获取到vue的实例

Vue为箭头函数提供了一个形参用于获取Vue实例

  const app=new Vue({
    el: '#app',
    data: {
      r: 0, g: 0, b: 0
    },
    computed: {
    // 箭头函数的this 不指向实例自身 所以如果计算属性写成箭头函数 vue 会给我们提供一个变量来访问实例的数据
    // vm为Vue的实例对象
      rgb:(vm)=>{
        return `rgb(${vm.r},${vm.g},${vm.b})`
      }
      
    }
  })

对象写法

当访问计算属性时会触发get方法 返回值为计算属性的值

当设置计算属性时会触发set方法

  const app=new Vue({
    el: '#app',
    template:`
    <div>
    	<div>{{ cd }}</div>
    	<button @click='cd="abc"'>设置cd的值</button>
    </div>
    `,
    computed: {
    	cd:{
    		// 取值函数 表示读取cd属性的值会执行的函数
			get(){
				return 'cd的值'
			},
			// 储值函数 表示打算修改cd属性会执行的函数
			set(val){
				console.log('cd的值被修改',val)
			}
		}
    }
  })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue.js中的侦听属性(Watch)和计算属性(Computed)都是用于响应数据变化的机制,但它们的使用场景和实现方式略有不同。 侦听属性(Watch)用于监听数据的变化,并在数据变化时执行相应的操作。你可以监听一个或多个数据的变化,并在回调函数中执行相应的逻辑。侦听属性是基于观察者模式实现的,当被监听的数据发生变化时,回调函数触发。 例如,你可以使用侦听属性来监听一个数据的变化,并在数据变化时执行一些操作,比如发送网络请求或者更新其他相关数据。下面是一个示例: ```javascript watch: { inputValue(newValue, oldValue) { // 监听inputValue的变化 // newValue为新,oldValue为旧 // 执行相应的操作 } } ``` 计算属性(Computed)用于根据已有的数据计算出一个新的计算属性缓存计算结果,只有当依赖的数据发生变化时才重新计算。这样可以避免不必要的计算,提高性能。 例如,你可以使用计算属性来根据一些数据的计算出一个新的结果,并在模板中使用这个计算结果。下面是一个示例: ```javascript computed: { fullName() { // 计算fullName return this.firstName + ' ' + this.lastName; } } ``` 在模板中可以直接使用计算属性 fullName 的: ```html <div>{{ fullName }}</div> ``` 总结一下,侦听属性用于监听数据变化并执行相应的操作,而计算属性用于根据已有的数据计算出一个新的。它们都是 Vue.js 提供的强大的响应式机制,可以帮助我们更方便地处理数据变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raccom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值