• 计算属性与侦听器


    https://cn.vuejs.org/v2/guide/computed.html

    计算属性

    模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

    <div id="example">
      {{ message.split('').reverse().join('') }}
    </div>
    

    在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中多包含此处的翻转字符串时,就会更加难以处理。

    所以,对于任何复杂逻辑,你都应当使用计算属性

    普通的方法来计算

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue compute</title>
        <!--这里因为方便,我直接使用cdn方式引入-->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="div">
        <input type="text" v-model="xing">
        <input type="text" v-model="ming">
        {{ fullname() }}
        <!-- 一百次调用,观察时间结果-->
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
        {{ fullname() }}
    </div>
    </body>
    <script>
        var app = new Vue({
            el: '#div',
            data: {
                xing:'',
                ming:'',
            },
            methods:{
                fullname(){
                    return this.xing+this.ming+Date.now();
                }
            }
        })
    </script>
    </html>
    

    运行结果

    image-20201017213617366

    注意看尾数,你会发现是不一样的,说明这个方法每次都会调用;所以,对于任何复杂逻辑,你都应当使用计算属性 ,因为计算属性,会自动缓存数据

    计算属性实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue compute</title>
        <!--这里因为方便,我直接使用cdn方式引入-->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="div">
            <input type="text" v-model="xing">
            <input type="text" v-model="ming">
            {{fulln}}
            <!-- 一百次调用 -->
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
            {{fulln}}
        </div>
    </body>
    <script>
        var app = new Vue({
            el: '#div',
            data: {
                xing:'',
                ming:'',
            },
            /*计算属性定义*/
            computed:{
                fulln(){
                    //this 指向vue实例
                    return this.xing+this.ming+Date.now();
                }
            }
        })
    </script>
    </html>
    

    image-20201017213950755

    因为会自动缓存,所以只执行一次

    我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的依赖进行缓存的。只在相关依赖发生改变时它们才会重新求值;多次调用,计算属性会立即返回之前的计算结果,而不必再次执行函数。

    侦听器

    使用侦听器

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue compute</title>
        <!--这里因为方便,我直接使用cdn方式引入-->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="div">
            <input type="text" v-model="xing">
            <input type="text" v-model="ming">
            {{ fullname }}
        </div>
    </body>
    <script>
        var app = new Vue({
            el: '#div',
            data: {
                xing: '',
                ming: '',
                fullname:''
            },
            // 设置侦听器
            watch: {
                // 侦听器中的方法名和要真挺的数据属性名必须一致
                // xing 发生变化,侦听器就会被执行,且将变化后的值和变化前的值传入
                xing:function(newVal,old_val){
                    this.fullname = newVal+this.ming;
                },
                ming:function(newVal,oldVal){
                    this.fullname = this.xing+newVal;
                }
            }
        })
    </script>
    </html>
    

    image-20201017220309063

    通过上面的例子,基本知道了侦听器的使用,但是也发现,与计算属性相比,侦听器并没有优势;也不见得好用,直观上反而比计算属性的使用更繁琐;

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

    上面这句话来自vue官网,大概意思就是,侦听器的作用在当需要在数据变化时执行异步或开销较大的操作时

    例如:某个值只有ajax 访问成功后才会被改变,否则在页面显示原来的值

  • 相关阅读:
    MD5 Message Digest Algorithm in Visual Basic 6
    遍历指定文件夹的指定格式的文件并且copy到指定的文件夹下面
    宝宝的成长脚印8/17
    儿歌童谣两首
    office2003之資料編輯列的角字顯示7/10
    宝宝的成长脚印8/27
    宝宝的成长脚印7/30
    宝宝的成长脚印7/3
    LED手电筒真不咋滴8/27
    液晶显示器右边出现黑条7/7
  • 原文地址:https://www.cnblogs.com/makalochen/p/13832821.html
Copyright © 2020-2023  润新知