【Vue 快速入门系列】通过天气案例快速掌握监视属性

简介: 【Vue 快速入门系列】通过天气案例快速掌握监视属性

前言


前面一篇博客提到了计算属性的使用,本篇博客将会使用计算属性实现一下简单的天气案例,然后引出监视属性,并学习深度监视,使用监视属性实现上一篇博客中的姓名案例,总的来说呢计算属性可以实现的东西,监视属性同样可以实现。反过来监视属性可以实现的东西计算属性不一定可以实现。


先来看一下案例的效果(通过点击按钮,切换dom元素内展示的文字)


a3a080fb848f45938a64418c415d949f.gif


使用计算属性实现天气案例


<!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="demo">
        <h1>今天天气状态为{{cls}}!</好>
        <br>
        <button @click="trans">点击切换天气</button>
    </div>
</body>
<script>
    let vm=new Vue({
        el:"#demo",
        data:{
            tag:true
        },
        methods:{
            trans(){
                this.tag=(!this.tag)
            }
        },
        computed:{
            cls(){
                return this.tag?"晴天":"阴天"
            }
        }
    })
</script>
</html>


使用监视属性实现天气案例


监视属性有如下特征:


监视属性使用关键字是watch,每一个监视属性配置中都有一个handler在监视的属性被改变时而进行回调
监视属性必须存在才可以进行监视
监视属性有两种写法:
    new Vue的时候进行watch配置
    通过对vue对象进行添加(使用$watch(监视的属性名,监视配置))


<!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="demo">
        <h1>今天的天气是{{info}}!</h1>
        <br>
        <button @click="temp">点我进行天气切换</button>
    </div>
</body>
<script>
    // 第一种方法:直接对vue对象进行配置
    /*let vm=new Vue({
        el:"#demo",
        data:{
            tag:true,
        },
        methods: {
            temp(){
                this.tag=!this.tag
            }
        },
        computed:{
            info(){
                return this.tag?"晴天":"阴天"
            }
        },
        watch:{
            tag:{
                immediate:true,//在页面刚开始加载的时候调用一下回调函数
                handler(newv,oldv){
                    console.log("监视的值改变了(新旧值分别为:)",newv,oldv)
                }
            }
        }
    })
    */
    //第二种方法:先创建对象然后进行动态配置
    let vm=new Vue({
        el:"#demo",
        data:{
            tag:true,
        },
        methods: {
            temp(){
                this.tag=!this.tag
            }
        },
        computed:{
            info(){
                return this.tag?"晴天":"阴天"
            }
        }
    })
    vm.$watch("tag",{
        immediate:true,
        handler(newv,oldv){
            console.log("监视的值改变了(新旧值分别为:)",newv,oldv)
        }
    })
</script>
</html>


深度监视


什么是深度监视:
    如果监视某个属性,我们可以采取用.拼接的形式,逐层访问到某一个属性
    如果有一种需求就是检测某一数据节点下所有的子数据,在子数据有所改变的时候提示该节点存在数据改变
    并且该节点的子节点数据量很多的话,一个一个写显得有些不现实,深度检测就是为了应对这些问题
需要手动开启深度监视的原因是:Vue对象的watch默认不检测对象内部值的改变
tips:
    Vue对象时刻检测对象内部值的变化,Vue提供的watch默认不可以
    (watch不加deep:true检测不到子节点的数据变化,Vue对象可以检测到)
深度监视语法:
    在被监视属性的配置中加入deep:true


<!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="demo">
        <!-- 检测某节点的子节点 -->
        <h1>深度监视测试-----深度检测</h1>
        <hr>
        <button @click="number.a++">点我a++</button>
        <button @click="number.b++">点我b++</button>
        <!-- 如果不加深度监视只有这种情况会提示number改变了 -->
        <button @click="number={a:888,b:888}">点我替换a与b</button>
        <h1>深度监视测试-----精准检测</h1>
        <hr>
        <!-- 这里的t3在test对象内的t1内的t2对象中 -->
        <button @click="test.t1.t2.t3++">点我t3++</button>
    </div>
</body>
<script>
    let vm=new Vue({
        el:"#demo",
        data:{
            number:{
                a:0,
                b:0
            },
            test:{
                t1:{
                    t2:{
                        t3:0
                    }
                }
            }
        },
        watch:{
            number:{
                deep:true,
                handler(){
                    console.log("number数值改变了!")
                }
            },
            'test.t1.t2.t3':{
                handler(){
                    console.log("t3数据改变了!")
                }
            }
        }
    })
</script>
</html>


监视属性的简写方式


<!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="demo">
        <h1>监视属性简写</h1>
        <h2>今天的天气是{{info}}</h2>
        <button @click="alertTag">点我切换天气</button>
    </div>    
</body>
<script>
    let vm=new Vue({
        el:"#demo",
        data:{
            tag:true
        },
        methods: {
            alertTag() {
                this.tag=!this.tag
            }
        },
        computed:{
            info(){
                return this.tag?"晴天!":"阴天!"
            }
        },
        //写法如此,可以直接用被监视的属性名作为函数名,然后操作。这里的参数如果是一个就是新值,如果是两个就与原来一样。
        watch:{
            tag(nv){
                immedite:true
                console.log("监视的tag发生了变化,新的值为:"+nv)
            }
        }
    })
    // vm.$watch(tag,(newvalue)=>{
    //     console.log("数据发生了变化!新的值为:"+newvalue)
    // })
</script>
</html>


使用监视属性实现姓名案例


在本案例中监视属性不可以是最后生成的属性,监视属性的工作原理就是被监视属性一旦发生改变就执行回调,如果监视最终的属性,那么会陷入一直回调,就会导致程序出错。只能监视输入框内的属性,当输入框内的属性改变时直接修改最终需要展示的结果。


<!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="demo">
        <h1>使用watch实现姓名案例</h1>
        姓:<input v-model="firstName"><br>
        名:<input v-model="lastName"><br>
        姓名:<div>{{allName}}</div>
    </div>
</body>
<script>
    let vm=new Vue({
        el:"#demo",
        data:{
            firstName:"张",
            lastName:"三",
            allName:"张-三"
        },
        watch:{
            //常规写法
            /*firstName:{
                handler(nv){
                    this.allName=nv+"-"+this.lastName
                }
            },*/
            //定时一秒后才展示修改结果
            firstName(nv){
                setTimeout(()=>{
                    this.allName=nv+"-"+this.lastName
                },1000)
            },
            lastName:{
                handler(nv){
                    this.allName=this.firstName+"-"+nv
                }
            }
        }
    })
</script>
</html>


今天的分享就到此结束吧!

相关文章
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
426 0
|
4月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
324 17
|
6月前
|
存储 数据采集 供应链
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
10月前
|
分布式计算 JavaScript 前端开发
vue学习第8章(vue的购物车案例)
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,正向全栈进发。本篇分享一个综合练习小demo,包括目录结构、HTML、JS及CSS代码,通过增删商品实现总价计算。关注我,获取更多前端知识!🎉🎉🎉
105 1
|
11月前
|
存储 缓存 JavaScript
vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
120 2
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
5月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
607 4
|
4月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
442 77
|
5月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍