watch属性中,监听sum值的变化
immediate:true,表示立即监听(页面一加载就能触发);
deep:true,表示开启深度监听。
- watch: {
- sum: {
- handler(newValue, oldValue) {
- console.log('sum的值变化了', newValue, oldValue);
- },
- immediate: true,
- deep: true
- }
- },
- <template>
- <div class="about">
- <div>当前值为:{{ sum }}div>
- <button @click="sum++">加一button>
- div>
- template>
-
- <script>
- import { ref } from 'vue';
-
- export default {
- name:'aboutPage',
- watch: {
- sum: {
- handler(newValue, oldValue) {
- console.log('sum的值变化了', newValue, oldValue);
- },
- immediate: true,
- deep: true
- }
- },
- setup() {
- let sum = ref(0)
-
- return {
- sum
- }
- }
- }
- script>
浏览器控制台输出:
vue3中的watch为组合式Api中的一个函数。
vue2的watch只能写一个,vue3中可以写多个watch函数,当watch同时监听多个响应式数据时,需要放进一个数组中。
情况一:监视ref定义的一个响应式数据
- watch(sum, (newValue, oldValue) => {
- console.log('sum变化了', newValue, oldValue);
- }, {immediate: true})
情况二:监视ref定义的多个响应式数据
- watch([sum,msg], (newValue, oldValue) => {
- console.log('sum或sum变化了', newValue, oldValue);
- }, {immediate: true})
缺点:
1、无法正确获取oldValue
2、强制开启深度监听,deep配置无效
情况三:监听reactive定义的一个响应式数
- watch(person, (newValue, oldValue) => {
- console.log('person改变了', newValue, oldValue);
- })
情况四:监听reactive定义的一个响应式数据中的某个属性(监听属性需要写成函数形式)
- watch(()=>person.name, (newValue, oldValue) => {
- console.log('person的name改变了', newValue, oldValue);
- })
情况五:监听reactive定义的一个响应式数据中的多个属性(监听属性需要写成数组包函数形式)
- watch([()=>person.name, ()=>person.age], (newValue, oldValue) => {
- console.log('person的name或age改变了', newValue, oldValue);
- })
情况六:监听reactive定义的一个响应式数据中深层次的一个属性(特殊情况)
- watch(()=>person.job, (newValue, oldValue) => {
- // 页面上修改的其实是job下的j1下的salary属性值, 需要开启深度监听才能触发
- console.log('person的job改变了', newValue, oldValue);
- }, {deep: true})
ps:如果对象是ref定义的,监听整个对象时需要写成person.value的形式,或者开启深度监听。