老生常谈vue2中watch的使用

 更新时间:2024年01月31日 10:36:09   作者:coderkey  
watch的基本用法是在Vue实例中定义一个watch对象,该对象内部包含需要监听的数据项和对应的回调函数,这篇文章主要介绍了vue2中watch的使用,需要的朋友可以参考下

一,监听基本普通属性:

字符串,布尔值,number

(1)把要监听的msg值看作方法名,来进行监听。

<template>
  <div id="app">
    <div>
      <button @click="btnClick">触发</button>
      <div>{{ msg }}</div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: "codekey",
    }
  },
  methods: {
    btnClick() {
      this.msg = 'pink'
    }
  },
  watch: {
    // watch第一次绑定值的时候不会执行监听,修改数据才会触发函数
    msg(newVal,oldVal) {
      console.log('oldVal:',oldVal)   // coderkey
      console.log('newVal:',newVal)   // pink
    }
  }
};
</script>

(2)把要监听的msg值看作对象,利用hanler方法来进行监听

watch第一次绑定值的时候不会执行监听,如果需要第一次就执行监听 则需要设置:immediate: true

<template>
  <div id="app">
    <div>
      <button @click="btnClick">触发</button>
      <div>{{ msg }}</div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: "codekey",
    }
  },
  methods: {
    btnClick() {
      this.msg = 'pink'
    }
  },
  watch: {
   //  如果需要第一次就执行监听 则需要设置:immediate: true
    msg: {
      handler(newVal,oldVal) {
        console.log('oldVal:',oldVal)  
        console.log('newVal:',newVal)  
      },
      immediate: true
    }, 
  }
};
</script>

二,监听对象:

(1)监听对象需要用到深度监听,设置deep:true

<template>
  <div id="app">
    <div>
      <button @click="btnClick">触发</button>
      <div>{{ obj.name }}</div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      obj: {
        name: 'coderkey',
        age: 18
      },
    }
  },
  methods: {
    btnClick() {
     this.obj.name = 'pink'
    }
  },
  watch: {
    obj:{
    //  注意:属性值发生变化后,handler执行后获取的 newVal 值和 oldVal 值是一样的
      handler(newVal,oldVal) {
        console.log('oldVal:',oldVal)
        console.log('newVal:',newVal)
      },
      immediate: true,
      // 开启深度监听 deep
      deep: true
    }
  }
};
</script>

(2)可以只监听对象的其中一个属性值 ’对象.属性‘ 的形式

<template>
  <div id="app">
    <div>
      <button @click="btnClick">触发</button>
      <div>{{ obj.name }}</div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      obj: {
        name: 'coderkey',
        age: 18
      },
    }
  },
  methods: {
    btnClick() {
     this.obj.name = 'pink'
    }
  },
  watch: {
    // 函数执行后,获取的 newVal 值和 oldVal 值不一样
    'obj.name'(newVal,oldVal) {
      console.log('oldVal:',oldVal)    // coderkey
      console.log('newVal:',newVal)   // pink
    }, 
   /*  'obj.name':{
      handler(newVal,oldVal) {
        console.log('oldVal:',oldVal)
        console.log('newVal:',newVal)
      },
    // 立即处理 进入页面就触发
      immediate: true
     }  */
  }
}
</script>

三,监听数组

(1)(一维、多维)数组的变化不需要深度监听

<template>
  <div id="app">
    <div>
      <button @click="btnClick">触发</button>
      <!-- <div>{{ obj.name }}</div> -->
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
     arr1:[1,2,4,5,6]
    }
  },
  methods: {
    btnClick() {
      this.arr1.unshift(0)
    },
  },
  watch: {
    arr1:{
      handler(newVal,oldVal) {
        console.log('oldVal:',oldVal)    // [0,1,2,4,5,6]
        console.log('newVal:',newVal)   // [0,1,2,4,5,6]
      },
      // immediate: true,
     } 
  }
}
</script>

多维数组

<template>
  <div id="app">
    <div>
      <button @click="btnClick">触发</button>
      <!-- <div>{{ obj.name }}</div> -->
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
     arr1:[1,2,4,[5,6]]
    }
  },
  methods: {
    btnClick() {
      this.arr1.push(0)
    },
  },
  watch: {
    arr1:{
      handler(newVal,oldVal) {
        console.log('oldVal:',oldVal)
        console.log('newVal:',newVal)
      },
      // immediate: true,
     } 
  }
}
</script>

(2)数组对象中对象属性变化监测需要使用deep:true深度监听,多少层内产生变化都可以监测到。

<template>
  <div id="app">
    <div>
      <button @click="btnClick">触发</button>
      <!-- <div>{{ obj.name }}</div> -->
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      arr1: [
				{
					name: 'coderkey',
					age: 22
				}
			],
			arr2: [
				{
					name: 'coderkey',
					age: 22,
					children: [
						{
							name: 'why',
							sex: 33
						}
					]
				}
			]
    }
  },
  methods: {
    btnClick() {
      this.arr1[0].name = 'pink'
      this.arr2[0].children[0].name = 'pink'
    },
  },
  watch: {
    arr1: {
			handler(newVal, oldVal) {
				console.log('newVal1', newVal);
				console.log('oldVal1', oldVal);
			},
			deep: true
		},
		arr2: {
			handler(newVal, oldVal) {
				console.log('newVal2', newVal);
				console.log('oldVal2', oldVal);
			},
			deep: true
		}
  }
}
</script>

四,监听路由变化

// 方法一:
watch:{
  $router(to,from){
       console.log(to.path)
  }
}
// 方法二:
watch: {
   $route: {
     handler:  function (val, oldVal){
       console.log(val);
     },
     // 深度观察监听
     deep:  true
   }
},
// 方法三:
watch: {
   '$route' : 'getRoutePath'
},
methods: {
   getRoutePath(){
     console.log( this .$route.path);
   }
}

到此这篇关于老式常谈vue2中watch的使用的文章就介绍到这了,更多相关vue2中watch使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nuxt3项目搭建过程(Nuxt3+element-plus+scss详细步骤)

    Nuxt3项目搭建过程(Nuxt3+element-plus+scss详细步骤)

    这篇文章主要介绍了Nuxt3项目搭建(Nuxt3+element-plus+scss详细步骤),本次记录一次使用Nuxt3搭建前端项目的过程,内容包含Nuxt3的安装,基于Vite脚手架(默认)构建的vue3项目,element-plus的安装配置,scss的安装,目录结构的创建和解释,需要的朋友可以参考下
    2022-12-12
  • vue中使用@change的方法

    vue中使用@change的方法

    @change 是 Vue.js 中用于监听表单元素值变化的事件处理器,很多组件有@change事件,那到底如何获取到当前的参数呢?本文给大家详细讲解,感兴趣的朋友一起看看吧
    2023-11-11
  • Vue验证用户名是否可用的方法

    Vue验证用户名是否可用的方法

    这篇文章主要为大家详细介绍了Vue验证用户名是否可用的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • vue.js样式布局Flutter业务开发常用技巧

    vue.js样式布局Flutter业务开发常用技巧

    这篇文章主要为大家介绍了vue.js样式布局Flutter业务开发中的常用技巧,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • vue中路由传参6种方式总结

    vue中路由传参6种方式总结

    这篇文章主要为大家详细介绍了vue中路由传参6种方式,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-08-08
  • vue开发中数据更新但视图不刷新的解决方法

    vue开发中数据更新但视图不刷新的解决方法

    在开发中我们处理数据时会遇到数据更新了,但视图并没有更新,这种情况往往是数据嵌套层数过多导致的问题,下面这篇文章主要给大家介绍了关于vue开发中数据更新但视图不刷新的解决方法,需要的朋友可以参考下
    2022-11-11
  • Vue中的v-model绑定修饰符的实现原理

    Vue中的v-model绑定修饰符的实现原理

    v-model 是Vue.js中的一个重要指令,通过它我们可以轻松实现数据的双向绑定,本文介绍一些常用的 v-model 绑定修饰符,并解析它们的实现原理,感兴趣的朋友一起看看吧
    2024-01-01
  • vue3中事件处理@click的用法详解

    vue3中事件处理@click的用法详解

    @click指令用于监听元素的点击事件,并在触发时执行相应的处理函数,在Vue3中,事件处理就可以通过@click指令来实现,下面我们就来看看如何在Vue3中处理点击事件吧
    2023-08-08
  • 写给新手同学的vuex快速上手指北小结

    写给新手同学的vuex快速上手指北小结

    这篇文章主要介绍了写给新手同学的vuex快速上手指北小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Vue基础知识快速入门教程

    Vue基础知识快速入门教程

    这篇文章主要介绍了Vue基础知识快速入门教程,我们可以先学会用,使用一段时间之后,回头来熟悉一下Vue框架以及它的特点,需要的朋友可以参考下
    2023-05-05

最新评论