欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Vue中的watch笔记

程序员文章站 2022-04-24 10:30:00
...

Watch的简单理解

引用官方解释就是:一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 watch()watchpropertyvm.watch(),遍历 watch 对象的每一个 property。 语法:vm.watch( expOrFn, callback, [options] )
参数:

  • {string | Function} expOrFn
  • {Function | Object} callback
  • {Object} [options]

{boolean} deep
{boolean} immediate

返回值:{Function} unwatch
这些都是一些官方给我们的解释跟一些用法
现在我们来简单看一下代码怎么实现

简单的监听

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./base/vue.js"></script>
<body>
        <div id="app">
            <input type="text" v-model="num">
        </div>
</body>
<script>
        new Vue({
        el: '#app',
        data: {
            num: ''
        },
        watch: {
            num(newVal, oldVal) {
                console.log('oldVal:',oldVal)
                console.log('newVal:',newVal)
            }
        }
    })
 
</script>
</html>

我们进行监听num属性的数据变化
只要num值发生改变那么num方法就会被触发
方法中第一个参数的值是新的值也就是更改变化后的值
第二个则是旧值,之前的值
当我在输入框中打印一个2
Vue中的watch笔记
会出现旧值为空,新值为2
再输入框中再加一个3,则
Vue中的watch笔记
会打印出旧值为2,新值为23

immediate

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./base/vue.js"></script>
<body>
        <div id="app">
            <input type="text" v-model="num">
        </div>
</body>
<script>
        new Vue({
        el: '#app',
        data: {
            num: 1
        },
        watch: {
            num: {
            	// 立即处理 进入页面就触发
                immediate: true,
                // 数据发生变化就会调用这个函数 
                handler(newVal, oldVal) {
                    console.log('oldVal:', oldVal)
                    console.log('newVal:', newVal)
                }
            }
        }

    })
 
</script>
</html>

immediate字面意思就是马上, immediate: true,就是页面加载立马执行
Vue中的watch笔记
由于旧值是没有所以打印undefined

deep

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./base/vue.js"></script>
<body>
    <div id="app">
        <input type="button" value="更改名字" @click="change">
    </div>
</body>
<script>
   new Vue({
        el: '#app',
        data: {
            food: {
                id: 1,
                name: '冰激凌'
            }
        },
        methods: {
            change() {
                this.food.name = '棒棒糖'
            }
        },
        watch: {
        	// 第一种方式:监听整个对象,每个属性值的变化都会执行handler
        	// 注意:属性值发生变化后,handler执行后获取的 newVal 值和 oldVal 值是一样的
            food: {
                // 每个属性值发生变化就会调用这个函数
                handler(newVal, oldVal) {
                    console.log('oldVal:', oldVal)
                    console.log('newVal:', newVal)
                },
                // 立即处理 进入页面就触发
                immediate: true,
                // 深度监听 属性的变化
                deep: true
            },
            // 第二种方式:监听对象的某个属性,被监听的属性值发生变化就会执行函数
            // 函数执行后,获取的 newVal 值和 oldVal 值不一样
            'food.name'(newVal, oldVal) {
                console.log('oldVal:', oldVal)   // 冰激凌
                console.log('newVal:', newVal)   // 棒棒糖
            }
        }
    })

 
</script>
</html>

刚开始打印
Vue中的watch笔记
点击之后打印
Vue中的watch笔记
这部分引用了一些别人的例子

想要了解更多点击vue.watch

相关标签: vue计算属性 vue