Vue之监视属性(watch)

简介: Vue之监视属性(watch)



前言

监视属性


一、监视属性

1.介绍

  1. 当被监视的属性变化时,回调函数自动调用,进行相关操作
  2. 监视的属性必须存在,才能进行监视!
  3. 监视的两种写法:
    (1) Vue实例化对象内watch配置
    (2)通过Vue实例(假设是vm)vm.$watch监视

2.实例

天气小案例:点击”切换天气“按钮,文字在”炎热“和”凉快“之间切换。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>今天天气很{{info}}</h2>
        <button @click="change">切换天气</button>
    </div>
    <script>
        var vm = new Vue({
            el: "#root",
            data: {
                ishot: true
            },
            methods: {
                change() {
                    this.ishot = !this.ishot
                }
            },
            computed: {
                info() {
                    return this.ishot ? '炎热' : '凉快'
                }
            },
            watch: {
                immediate:true,//初始化时让handler调用一下
                info: {
                    handler(newValue, oldValue) {
                        console.log("info被修改了", newValue, oldValue);
                    }
                }
            }
        })
    </script>
</body>
</html>

然后点击按钮,天气由最开始的”炎热”变成“凉快”,并且watch监视info属性,并且在控制台打印了info变化前后的值(handler函数第一个参数newValue是改变后的值,第二个oldValue是改变前的值)。(watch里的handler在监视属性发生变化时触发)

另一中写法,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>今天天气很{{info}}</h2>
        <button @click="change">切换天气</button>
    </div>
    <script>
        var vm = new Vue({
            el: "#root",
            data: {
                ishot: true
            },
            methods: {
                change() {
                    this.ishot = !this.ishot
                }
            },
            computed: {
                info() {
                    return this.ishot ? '炎热' : '凉快'
                }
            },
        })
        vm.$watch('info', {
            immediate: true, //初始化时让handler调用一下
            handler(newValue, oldValue) {
                console.log("info被修改了", newValue, oldValue);
            }
        })
    </script>
</body>
</html>

二、深度监视

1.实例一

监视多级结构中的某个属性

(监视number对象中的a,b的值)

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h3>{{numbers.a}}</h3><br>
        <button @click="numbers.a++">点我a+1</button><br>
        <h3>{{numbers.b}}</h3><br>
        <button @click="numbers.b++">点我b+1</button><br>
    </div>
    <script>
        var vm = new Vue({
            el: "#root",
            data: {
                numbers: {
                    a: 1,
                    b: 1
                }
            },
            watch: {
                'numbers.a': {
                    handler() {
                        console.log("a被改变");
                    }
                },
                'numbers.b': {
                    handler() {
                        console.log("b被改变");
                    }
                }
            }
        })
    </script>
</body>
</html>

2.实例二

监视多级结构中的所有属性

(监视number对象)

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h3>{{numbers.a}}</h3><br>
        <button @click="numbers.a++">点我a+1</button><br>
        <h3>{{numbers.b}}</h3><br>
        <button @click="numbers.b++">点我b+1</button><br>
    </div>
    <script>
        var vm = new Vue({
            el: "#root",
            data: {
                numbers: {
                    a: 1,
                    b: 1
                }
            },
            watch: {
                numbers: {
                    deep: true,
                    handler() {
                        console.log("numbers改变了");
                    }
                }
            }
        })
    </script>
</body>
</html>

3.结论

  • Vue实例对象中的watch默认不监测对象内部值的改变(一层)
  • 配置deep:true可以监测对象内部值改变(多层)
  • Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以
  • 使用watch时根据数据的具体结构,决定是否采用深度检测

三、监视器简写

简写条件:没有immediate,deep

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>今天天气很{{info}}</h2>
        <button @click="change">切换天气</button>
    </div>
    <script>
        var vm = new Vue({
            el: "#root",
            data: {
                ishot: true
            },
            methods: {
                change() {
                    this.ishot = !this.ishot
                }
            },
            computed: {
                info() {
                    return this.ishot ? '炎热' : '凉快'
                }
            },
            watch: {
                info(newValue, oldValue) {
                    console.log("info改变了", newValue, oldValue);
                }
            }
        })
    </script>
</body>
</html>

总结

以上就是监视属性

相关文章
|
2天前
|
JavaScript 前端开发
【vue】iview如何把input输入框和点击输入框之后的边框去掉
【vue】iview如何把input输入框和点击输入框之后的边框去掉
9 0
|
1天前
|
监控 JavaScript
Vue中的数据变化监控与响应——深入理解Watchers
Vue中的数据变化监控与响应——深入理解Watchers
|
2天前
|
JavaScript 安全 前端开发
Vue 项目中的权限管理:让页面也学会说“你无权访问!
Vue 项目中的权限管理:让页面也学会说“你无权访问!
11 3
|
2天前
|
JavaScript 前端开发 开发者
Vue的神奇解锁:冒险的开始
Vue的神奇解锁:冒险的开始
5 1
|
4天前
|
资源调度 JavaScript 前端开发
Vue的路由管理:VueRouter的配置和使用
【4月更文挑战第24天】VueRouter是Vue.js的官方路由管理器,用于在单页面应用中管理URL路径与组件的映射。通过安装并引入VueRouter,设置路由规则和创建router实例,可以实现不同路径下显示不同组件。主要组件包括:`&lt;router-link&gt;`用于创建导航链接,`&lt;router-view&gt;`负责渲染当前路由对应的组件。此外,VueRouter还支持编程式导航和各种高级特性,如嵌套路由、路由参数和守卫,以应对复杂路由场景。
|
2天前
|
JavaScript
【vue实战】父子组件互相传值
【vue实战】父子组件互相传值
9 1
|
3天前
|
JavaScript
vue2_引入Ant design vue
vue2_引入Ant design vue
8 0
|
3天前
|
JavaScript
vue知识点
vue知识点
13 4
|
3天前
|
存储 JavaScript 前端开发
【Vue】绝了!这生命周期流程真...
【Vue】绝了!这生命周期流程真...
|
4天前
|
JavaScript 索引
【vue】框架搭建
【vue】框架搭建
7 1