Vue 侦听属性(watch)

1.侦听属性基本用法

watch 监视属性

·1.当被监视的属性变化时,回调函数自动调用,进行相关操作。

2.监视的属性必须存在,才能进行监视,既可以监视 data ,也可以监视计算属性。

3.配置属性 immediate:false , 改为 true, 则初始化时调用一次 handler(newValue,oldValue)

4.监视有两种写法

​ a.创建Vue时传入 watch:{} 配置

​ b.通过vm.$watch() 监视

<title>天气案例_监视属性</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2>今天天气很{
    
    {
    
    info}}</h2>
  <button @click="changeWeather">切换天气</button>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  const vm = new Vue({
    
    
    el: '#root',
    data: {
    
    
      isHot: true,
    },
    computed: {
    
    
      info() {
    
    
        return this.isHot ? '炎热' : '凉爽'
      }
    },
    methods: {
    
    
      changeWeather() {
    
    
        this.isHot = !this.isHot
      }
    },
    // 方式一
    /* watch:{		
			isHot:{
				immediate:true,
				handler(newValue,oldValue){
					console.log('isHot被修改了',newValue,oldValue)
				}
			}
		} */
  })
  // 方式二
  vm.$watch('isHot', {
    
    		
    immediate: true, // 初始化时让handler调用一下
    //handler什么时候调用?当isHot发生改变时
    handler(newValue, oldValue) {
    
    
      console.log('isHot被修改了', newValue, oldValue)
    }
  })
</script>

2.深度侦听

1.Vue 中的 watch 默认不检测对象内部值的改变(一层)

2.在watch中配置 deep:true 可以监测对象内部值的改变(二层)

注意:

1.Vue 自身可以监测对象内部值的改变,但Vue提供的watch默认不可以

2.使用watch时根据监视数据的具体结构,决定是否采用深度监视

<title>天气案例_深度监视</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h3>a的值是:{
    
    {
    
     numbers.a }}</h3>
  <button @click="numbers.a++">点我让a+1</button>
  <h3>b的值是:{
    
    {
    
     numbers.b }}</h3>
  <button @click="numbers.b++">点我让b+1</button>
  <button @click="numbers = {a:666,b:888}">彻底替换掉numbers</button>
  {
    
    {
    
    numbers.c.d.e}}
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  const vm = new Vue({
    
    
    el: '#root',
    data: {
    
    
      isHot: true,
      numbers: {
    
    
        a: 1,
        b: 1,
        c: {
    
    
          d: {
    
    
            e: 100
          }
        }
      }
    },
    watch: {
    
    
      // 监视多级结构中某个属性的变化
      /* 'numbers.a':{
				handler(){
					console.log('a被改变了')
				}
			} */
      // 监视多级结构中所有属性的变化
      numbers: {
    
    
        deep: true,
        handler() {
    
    
          console.log('numbers改变了')
        }
      }
    }
  })
</script>

3.侦听属性简写

<title>天气案例_监视属性_简写</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h3>今天天气很{
    
    {
    
     info }}</h3>
  <button @click="changeWeather">切换天气</button>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  const vm = new Vue({
    
    
    el: '#root',
    data: {
    
    isHot: true,},
    computed: {
    
    info() {
    
    return this.isHot ? '炎热' : '凉爽'}},
    methods: {
    
    changeWeather() {
    
    this.isHot = !this.isHot}},
    watch: {
    
    
      // 正常写法
      // isHot: {
    
    
      // 	// immediate:true, //初始化时让handler调用一下
      // 	// deep:true,	//深度监视
      // 	handler(newValue, oldValue) {
    
    
      // 		console.log('isHot被修改了', newValue, oldValue)
      // 	}
      // },

      //简写
      isHot(newValue, oldValue) {
    
    
        console.log('isHot被修改了', newValue, oldValue, this)
      }
    }
  })

  //正常写法
  // vm.$watch('isHot', {
    
    
  // 	immediate: true, //初始化时让handler调用一下
  // 	deep: true,//深度监视
  // 	handler(newValue, oldValue) {
    
    
  // 		console.log('isHot被修改了', newValue, oldValue)
  // 	}
  // })l

  //简写
  // vm.$watch('isHot', (newValue, oldValue) => {
    
    
  // 	console.log('isHot被修改了', newValue, oldValue, this)
  // })
</script>

4.计算属性VS侦听属性

computed 和 watch 之前的区别

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

两个重要的小原则

  • 所有被 Vue 管理的函数,最好写好普通函数,这样this的指向才是 vm 或组件实例对象。
  • 所有不被Vue所管理的函数(定时器的回调函数、ajax 的回调函数等、Promise的回调函数),最好写成箭头函数,这样this 的指向才是vm 或组件实例对象。

使用计算属性

new Vue({
    
    
    el:'#root', 
    data:{
    
     
        firstName:'张',
        lastName:'三'
    },
    computed:{
    
    
    	fullName(){
    
    
		    return this.firstName + '-' + this.lastName
    	}
    }
})

使用监听属性

new Vue({
    
    
  el:'#root',
  data:{
    
    
    firstName:'张',
    lastName:'三',
    fullName:'张-三'
  },
  watch:{
    
    
    firstName(val){
    
    
      setTimeout(()=>{
    
    
        this.fullName = val + '-' + this.lastName
      },1000);
    },
    lastName(val){
    
    
      this.fullName = this.firstName + '-' + val
    }
  }
})

猜你喜欢

转载自blog.csdn.net/fd2025/article/details/125308796