zoukankan      html  css  js  c++  java
  • Vue之计算属性和侦听器

    计算属性

      模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何复杂逻辑,你都应当使用计算属性。

    计算属性:
                     1.定义:要用的属性不存在,要通过已有属性计算得来。
                     2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。
                     3.get函数什么时候执行?
                                (1).初次读取时会执行一次。
                                (2).当依赖的数据发生改变时会被再次调用。
                     4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
                     5.备注:
                                (1).计算属性最终会出现在vm上,直接读取使用即可。
                                (2).如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。
    代码举例:
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8" />
            <title>姓名案例_计算属性实现</title>
            <!-- 引入Vue -->
            <script type="text/javascript" src="../js/vue.js"></script>
        </head>
        <body>
            <!-- 准备好一个容器-->
            <div id="root">
                姓:<input type="text" v-model="firstName"> <br/><br/>
                名:<input type="text" v-model="lastName"> <br/><br/>
                全名:<span>{{fullName}}</span> <br/><br/>
            </div>
        </body>
    
        <script type="text/javascript">
            Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    
            const vm = new Vue({
                el:'#root',
                data:{
                    firstName:'',
                    lastName:'',
                },
                computed:{
                    //完整写法
                    /* fullName:{
                        get(){
                            console.log('get被调用了')
                            return this.firstName + '-' + this.lastName
                        },
                        set(value){
                            console.log('set',value)
                            const arr = value.split('-')
                            this.firstName = arr[0]
                            this.lastName = arr[1]
                        }
                    } */
                    //简写
                    fullName(){
                        console.log('get被调用了')
                        return this.firstName + '-' + this.lastName
                    }
                }
            })
        </script>
    </html>

    运行结果:

    侦听器

      虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

     computed和watch之间的区别:
                            1.computed能完成的功能,watch都可以完成。
                            2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
                    两个重要的小原则:
                                1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
                                2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。
    监视属性watch:
                        1.当被监视的属性变化时, 回调函数自动调用, 进行相关操作
                        2.监视的属性必须存在,才能进行监视!!
                        3.监视的两种写法:
                                (1).new Vue时传入watch配置
                                (2).通过vm.$watch监视
    深度监视:
                            (1).Vue中的watch默认不监测对象内部值的改变(一层)。
                            (2).配置deep:true可以监测对象内部值改变(多层)。
                    备注:
                            (1).Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!
                            (2).使用watch时根据数据的具体结构,决定是否采用深度监视。
    代码举例:
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8" />
            <title>天气案例_监视属性_简写</title>
            <!-- 引入Vue -->
            <script type="text/javascript" src="../js/vue.js"></script>
        </head>
        <body>
            <!-- 准备好一个容器-->
            <div id="root">
                <h2>今天天气很{{info}}</h2>
                <button @click="changeWeather">切换天气</button>
            </div>
        </body>
    
        <script type="text/javascript">
            Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
            
            const vm = new Vue({
                el:'#root',
                data:{
                    isHot:true,
                },
                computed:{
                    info(){
                        return this.isHot ? '炎热' : '凉爽'
                    }
                },
                methods: {
                    changeWeather(){
                        this.isHot = !this.isHot
                    }
                },
                watch:{
                    //正常写法
             isHot:{
                        // immediate:true, //初始化时让handler调用一下
                        // deep:true,//深度监视
                        handler(newValue,oldValue){
                            console.log('isHot被修改了',newValue,oldValue)
                        }
                    }, 
                    //简写
                    /* isHot(newValue,oldValue){
                        console.log('isHot被修改了',newValue,oldValue,this)
                    } */
                }
            })
    
            //正常写法
            /* vm.$watch('isHot',{
                immediate:true, //初始化时让handler调用一下
                deep:true,//深度监视
                handler(newValue,oldValue){
                    console.log('isHot被修改了',newValue,oldValue)
                }
            }) */
    
            //简写
            /* vm.$watch('isHot',(newValue,oldValue)=>{
                console.log('isHot被修改了',newValue,oldValue,this)
            }) */
    
        </script>
    </html>

    运行结果:点击切换天气,可看到data中,isHot的boolean值在true和false之间切换,并且控制台有被修改的提示信息,表明监听成功

  • 相关阅读:
    Power BI 根据用户权限动态生成导航跳转目标
    Power BI Tooltips 增强功能
    Power BI refresh error “could not load file or assembly…provided impersonation level is invalid”
    SQL 错误代码 18456
    如何使用SQL Server Integration Services从多个Excel文件读取数据
    通过表格编辑器将现有表引入Power BI数据流
    Power BI 中动态增长的柱状图
    ambari2.7.3离线安装hdp3.1.0时,ambari-hdp-1.repo中baseurl无值
    ambari 安装 cannot download file mysql-connector-java from http://8080/resource/mysql-connector-java.jar
    洛谷P4180 [BJWC2010]严格次小生成树
  • 原文地址:https://www.cnblogs.com/ftx3q/p/15320335.html
Copyright © 2011-2022 走看看