• 【Vue】Re03 computed属性计算和ES6的一些补充


    一、Computed属性计算

    四种计算处理的方式方法

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <!-- 计算属性 computed  -->
    <div id="v">
        <!-- 变量凭借直接显示处理 -->
        <h3>{{firstName}} {{lastName}}</h3>
    
        <!-- 第二种:在模板语法内运算处理 -->
        <h3>{{firstName + " " + lastName}}</h3>
    
        <!-- 第三种:使用方法进行处理 -->
        <h3>{{splicingStr()}}</h3>
    
        <!-- 第四种:使用方法的定义,声明在computed中,嵌入模板使作为变量使用 -->
        <h3>{{splicingStr2}}</h3>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script type="text/javascript">
        const vm = new Vue({
            el : '#v',
            data : {
                firstName : 'Dai',
                lastName : 'Zeal4J'
            },
            methods : {
                splicingStr : function () {
                    return this.firstName + ' ' + this.lastName;
                },
            },
            computed : {
                splicingStr2 : function () {
                    return this.firstName + ' ' + this.lastName;
                }
            }
        });
    </script>
    
    </body>
    </html>

    如果计算逻辑更为复杂,使用computed选项的处理:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <!-- 为了显示总价格,虽然可以在模板语法内进行计算,但不建议 -->
    <div id="v">
        <h3>价格合计 : {{getBookSum}}</h3>
        <h3>价格合计 : {{getBookSumByForIn}}</h3>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script type="text/javascript">
        const v = new Vue({
            el : '#v',
            data : {
                bookList : [
                    { id : 1, name : 'Unix编程', price : 100 },
                    { id : 2, name : '深入理解计算机原理', price : 100 },
                    { id : 3, name : '现代操作系统', price : 100 },
                    { id : 4, name : '代码大全', price : 100 }
                ]
            },
            computed : {
                getBookSum : function () {
                    let sum = 0;
                    for (let i = 0; i < this.bookList.length; i++) {
                        sum += this.bookList[i].price;
                    }
                    return sum;
                },
                getBookSumByForIn : function () { // 使用ES6语法
                    let sum = 0;
                    for (let book of this.bookList) {
                        sum += book.price;
                    }
                    return sum;
                }
            }
    
        });
    </script>
    
    </body>
    </html>

    setter&getter属性概述:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script type="text/javascript" src="../dependencies/vue.js"></script>
    </head>
    <body>
    
    <div id="v">
    </div>
    
    <script type="text/javascript">
        const v = new Vue({
            el : '#v',
            data : {
                firstName : 'nico',
                lastName : 'jacob'
            },
            computed : {
                fullName : {
                    set : function (newVal) { // 如果要设置就需要传入形参中处理
                        // 因为一般不怎么作用于修改属性值,set用不上 -> 不写了
                    },
                    get : function () {
                        // 处理计算的逻辑都放在这个里面,所以省略开始直接对象名称衔接方法处理
                        return 0;
                    }
                }
            }
        });
    </script>
    <!--
        computed 和 method的区别在于?
        computed具备缓存特性,多次重复性调用将会触发缓存
        method则不具备,方法调用一次就重新赋值一次
        如果是重复性的频率高的获取,可以使用computed更好,减少内存消耗
    -->
    
    </body>
    </html>

    computed & methods的区别?

    methods不具备缓存功能

    /* 计算属性,用于处理一些属性合计或者需要计算得到的结果值 */
    /* 这里虽然是一个方法,但是使用上看是作为一个属性进行操作 */
    /* 要注意一个问题,data中的属性的值发生变化,那么将会重新调用computed内的函数,,并渲染 */
    /* 当computed内部的函数被调用两次以上的情况,如果里面涉及的属性值没有发生改变,则使用缓存的值进行渲染 */

    演示案例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <div id="v">
        <h3>{{getFullName()}}</h3>
        <h3>{{getFullName()}}</h3>
        <h3>{{getFullName()}}</h3>
        <hr>
        <h3>{{getFullNameByCompute}}</h3>
        <h3>{{getFullNameByCompute}}</h3>
        <h3>{{getFullNameByCompute}}</h3>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script type="text/javascript">
        const v = new Vue({
            el : '#v',
            data : {
                firstName : 'kobe',
                lastName : 'bryant'
            },
            methods : {
                getFullName() {
                    let fullName = this.firstName + this.lastName;
                    console.log('methods -> ' + fullName);
                    return fullName;
                }
            },
            computed : {
                getFullNameByCompute() {
                    let fullName = this.firstName + this.lastName;
                    console.log('computed -> ' + fullName);
                    return fullName;
                }
            }
        });
    </script>
    
    </body>
    </html>

    二、ES6相关

    1、块级作用域,Let变量关键字和Var变量关键字

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <button>按钮01</button>
    <button>按钮02</button>
    <button>按钮03</button>
    <button>按钮04</button>
    <button>按钮05</button>
    
    <script type="text/javascript">
    
        // 代码块内的作用域问题
        {
            var a = 100;
            let b = 200;
            console.log("in codeBlock var a -> " + a);
            console.log("in codeBlock let b -> " + b);
        }
        console.log("out codeBlock var a -> " + a);
        // console.log("out codeBlock let b -> " + b); // 出作用域 let修饰的变量将会报错无法获取
    
        // ---------------------------------------------------------------------------------------------------------
    
        // 函数问题
        var fun;
        if (true) {
            var txt = '打印的内容';
            fun = function () {
                console.log(txt);
            }
        }
    
        // 在调用的时候 txt变量可能被改变
        txt = '更改的内容';
        fun();
    
        // ---------------------------------------------------------------------------------------------------------
    
        // for中的块级作用域问题
        var buttons = document.getElementsByTagName('button');
        // for (var i = 0; i < buttons.length; i++) {
        //     buttons[i].addEventListener('click', function () {
        //         console.log(('第' + i + '个按钮被点击')); // 第5个按钮被点击 无论点击哪一个按钮都是显示第五个按钮被点击
        //     });
        // }
    
        // 使用闭包解决问题
        for (var i = 0; i < buttons.length; i++) {
            (function (ii) { // 这一行的i只是一个形参,和外部的ib
                buttons[ii].addEventListener('click', function () {
                    console.log(('' + (ii + 1) + '个按钮被点击'));
                });
            })(i);
        }
        // 为什么闭包能够解决上述的问题?因为函数具有作用域的功能
    
        // 使用let则不会存在这个问题
        for (let i = 0; i < buttons.length; i++) {
            buttons[i].addEventListener('click', function () {
                console.log(('' + (i + 1) + '个按钮被点击'));
            });
        }
        // ---------------------------------------------------------------------------------------------------------
    </script>
    
    </body>
    </html>

    2、Const常量定义关键字

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <script type="text/javascript">
        // const 常量修饰
        // 声明变量时优先使用const定义,如果变量需要被改变赋值再使用let进行修饰
    
        // 1、const声明的常量不允许二次赋值
        const val = 100;
        // val = 200; ×
    
        // 2、const声明的常量不允许不赋值
        // const val2; × 声明即必须赋值
    
        // 3、如果 const常量指向的是一个对象,则不可以改变对象的指向,但是对象的属性可以被更改
        const obj = {
            name : 'objectA',
        };
        // obj = {}; × 不允许重新赋值一个新对象
        obj.name = 'ooo'; // 属性允许重新赋值
    </script>
    
    </body>
    </html>

    3、对象字面量和函数的增强:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <!-- 对象字面量增强 -->
    <script>
        /* 常规JS创建对象写法 */
        const obj = new Object();
    
        /* 字面量JS创建对象写法 */
        const literalObj = {};
    
        /* ES5属性赋值写法 */
        const p1 = {
            key1 : 100,
            key2 : 'aaa',
            key3 : true
        }
    
        /* ES6支持外部变量同名赋值 */
        const key4 = 50;
        const key5 = 'bbb';
        const key6 = false;
    
        const p2 = {
            key4,
            key5,
            key6
        }
        console.log(p2);
    
        /* ES5的方法声明 */
        const m1 = {
            set : function (val1, val2) {
    
            },
            get : function () {
                return 100;
            }
        }
        /* ES6支持方法声明的增强 */
        const m2 = {
            set(val1, val2) {
    
            },
            get() {
                return 100;
            }
        }
    </script>
    </body>
    </html>

    4、对JS对象的比较判断处理方法:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <script type="text/javascript">
    
        /* JS对象不能像后端编程语言一样,使用地址值进行判断是否为同一个对象 */
        const getObject = function() {
            return {
                name : 'aaa',
                age : 22,
                gender : true
            }
        }
    
        /* 这里使用函数获取三个对象 */
        const obj1 = getObject();
        const obj2 = getObject();
        const obj3 = getObject();
    
        /* 如果三者都为同一个对象,则对obj1修改属性,其23都将改变,反之三者不是同一个对象 */
        obj1.age = 33;
    
        /* 打印结果 */
        console.log(obj1);
        console.log(obj2);
        console.log(obj3);
    
        /* 如果是这样返回的对象,就是返回一个地址,三者都为同一个对象 */
        const finalObject = {
            name : 'bbb',
            age : 44,
            gender : false
        }
        const getObject2 = function() {
            return finalObject;
        }
        const obj4 = getObject2();
        const obj5 = getObject2();
        const obj6 = getObject2();
        obj4.age = 88;
        console.log(obj4);
        console.log(obj5);
        console.log(obj6);
    </script>
    </body>
    </html>
  • 相关阅读:
    Android Studio 活动启动模式
    Android Studio 活动的生命周期
    OA表单制作(致远)
    打开excel打印时报“不能使用对象链接和嵌入”
    C#面对对象之封装、继承、多态的简单理解
    C#上手练习7(构造方法语句)
    C#上手练习7(方法语句2)
    C#上手练习6(方法语句1)
    C#上手练习5(GOTO语句)
    C#上手练习4(Break、CONITINUE语句)
  • 原文地址:https://www.cnblogs.com/mindzone/p/13877438.html
Copyright © 2020-2023  润新知