Vue(九):计算属性——computed

现在有一个需求,输入姓和名将其拼接为全名,全名要求根据姓名实时变化。

下面是三种实现:

1.插值语法实现

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>姓名案例-插值语法实现</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>


    <div id="root">
        姓:<input type="text" v-model="firstName"><br>
        名:<input type="text" v-model="lastName"><br>
        全名:<span>{{firstName}}-{{lastName}}</span>
    </div>

    <script type="text/javascript">

        const vm = new Vue({
            el: "#root",
            data: {
                firstName: "",
                lastName: ""
            }
        })
    </script>
</body>

</html>

插值语法可以实现所需要的功能,但是当需要更加复杂时,插值语法中的表达式就会变得十分冗余。

2.methods实现

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>姓名案例-methods实现</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>


    <div id="root">
        姓:<input type="text" v-model="firstName"><br>
        名:<input type="text" v-model="lastName"><br>
        全名:<span>{{fullName()}}</span>
    </div>

    <script type="text/javascript">

        const vm = new Vue({
            el: "#root",
            data: {
                firstName: "",
                lastName: ""
            },
            methods: {
                fullName() {
                    return this.firstName + "-" + this.lastName
                }
            }
        })
    </script>
</body>

</html>

使用methods实现,将插值语法的表达式转化为一个方法,模板中直接对方法进行调用,但是其他地方的数据变化,Vue模板刷新,会重复调用函数,进行计算。

3.计算属性

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>姓名案例-计算属性实现</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <!--
    计算属性
        1.什么是计算属性?
        计算属性就是将Vue中的属性经过计算后得到的新的属性,计算属性会直接出现在vm上
        2.计算属性的原理
        底层借助了Object.defineProperty中的getter和setter
        3.get函数什么时候执行?
            a.计算属性被初次调用时
            b.计算属性所依赖的属性发生改动时
        4.计算属性对比methods的优势
        计算属性内部有缓存机制,能够实现复用,效率更高
    -->
    <body>
        <div id="root">
            姓:<input type="text" v-model="firstName"><br>
            名:<input type="text" v-model="lastName"><br>
            全名:<span>{{fullName}}</span>
        </div>
    </body>

    <script>
        const vm = new Vue({
            el: "#root",
            data: {
                firstName: "",
                lastName: ""
            },
            // //完整写法,setter非必要,如果没有修改的需求,setter可以省略
            // computed: {
            //     fullName: {
            //         get() {
            //             return this.firstName + "-" + this.lastName
            //         },
            //         set(value) {
            //             const arr = value.split("-")
            //             this.firstName = arr[0]
            //             this.lastName = arr[1]
            //         }
            //     }
            // }

            //省略写法,省略写法地前提是不需要setter
            computed: {
                fullName() {
                    return this.firstName + "-" + this.lastName
                }
            }
        })
    </script>
</html>

计算属性的缓存机制解决了模板刷新时重复计算的问题,只有当计算属性所依赖的属性发生变化时,才会进行重新的计算。

posted @ 2023-06-26 20:32  谁知道水烫不烫  阅读(23)  评论(0编辑  收藏  举报