09-计算属性

发布时间 2023-09-11 18:26:40作者: 马铃薯1

Computed 计算属性是 Vue 中常用的一个功能,那为什么要使用计算属性

我们假定一个前提情况,如果我们需要用到一个属性,但这个属性不存在,却可以通过其他属性计算得来,我们则可以通过以下几个方法进行实现:

1) 插值语法实现

2) methods实现

3) 计算属性实现

 

例:我们已知 姓、名属性 firstName 和 lastName,想要得到姓名全名。就比如姓:"马",名:"铃薯",姓名全程:"马-铃薯"

1) 插值语法实现

<!DOCTYPE html>
<html lang="en">
    <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:value="firstname" placeholder="请输入您的姓"><br/>
            名:<input type="text" v-model:value="lastname" placeholder="请输入您的名"><br/>

            <!--使用插值语法实现-->
            <!--姓名全称:<span>{{firstname + "-" + lastname}}</span>-->
            姓名全称:<span>{{firstname}}-{{lastname}}</span><br/>

        </div>

        <script type="text/javascript">
            // 阻止 vue 在启动时生成生产提示
            Vue.config.productionTip = false;

            new Vue({
                el:"#root",
                data(){
                    return{
                        firstname:"任",
                        lastname:"先生"
                    }
                }
            })
        </script>

    </body>
</html>

2) methods实现

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>methods实现</title>
        <!--  引入Vue  -->
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <!--  准备好一个容器  -->
        <div id="root">
            姓:<input type="text" v-model:value="firstname" placeholder="请输入您的姓"><br/>
            名:<input type="text" v-model:value="lastname" placeholder="请输入您的名"><br/><br/>

            <!--使用methods实现-->
            <!--{{fullName()}}代表调用fullName()函数,获取返回值-->
            姓名全称:<span>{{fullName()}}</span><br/>
            姓名全称:<span>{{fullName()}}</span><br/>
            姓名全称:<span>{{fullName()}}</span><br/>
            姓名全称:<span>{{fullName()}}</span><br/>

        </div>

        <script type="text/javascript">
            // 阻止 vue 在启动时生成生产提示
            Vue.config.productionTip = false;

            new Vue({
                el:"#root",
                data(){
                    return{
                        firstname:"任",
                        lastname:"先生"
                    }
                },
                // 通过fullName()函数,返回所需要的内容
                methods:{
                    fullName(){
                        console.log("@---正在调用fullName()函数...")
                        return this.firstname + "-" + this.lastname
                    }
                }
            })
        </script>

    </body>
</html>

3) 计算属性实现

<!DOCTYPE html>
<html lang="en">
    <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:value="firstname" placeholder="请输入您的姓"><br/>
            名:<input type="text" v-model:value="lastname" placeholder="请输入您的名"><br/><br/>

            <!--使用计算属性实现-->
            姓名全称:<span>{{fullName}}</span><br/>
            姓名全称:<span>{{fullName}}</span><br/>
            姓名全称:<span>{{fullName}}</span><br/>
            姓名全称:<span>{{fullName}}</span><br/>

        </div>

        <script type="text/javascript">
            // 阻止 vue 在启动时生成生产提示
            Vue.config.productionTip = false;

             const vm = new Vue({
                el:"#root",
                data(){
                    return{
                        firstname:"任",
                        lastname:"先生"
                    }
                },
                // 计算属性:要用的属性不存在,需要通过已有属性计算得来
                // 计算属性一般用来描述依赖响应式状态的复杂逻辑
                computed:{
                    // 1.计算属性的完整写法
                    fullName:{
                        // get什么时候调用(返回值作为fullName的值)
                        // 1.初次读取fullName时,get就会被调用
                        // 2.所依赖的数据发生改变时,get也会被调用
                        get(){
                            console.log("@---正在调用get()方法...")
                            return this.firstname + "-" + this.lastname
                        },
                        // get什么时候调用
                        // 只有当fullName发生修改时,set才会被调用
                        set(value){
                            console.log("@---正在调用set()方法...")
                            const arr = value.split("-")
                            this.firstname = arr[0]
                            this.lastname = arr[1]
                        }
                    }

                    // // 2.计算属性的简写写法(默认没有set方法)
                    // fullName(){
                    //     console.log("@---正在调用get()方法...")
                    //     return this.firstname + "-" + this.lastname;
                    // }
                }
            })
        </script>

    </body>
</html>

 

 

 

 

 

 

计算属性的定义

要用的属性不存在,需要通过已有属性计算而来的

计算属性的原理

底层借助了Object.defineproperty方法提供的getter和setter

 

// 已有属性
data(){
    return{
        firstname:"任",
        lastname:"先生"
    }
},
// 计算属性:要用的属性不存在,需要通过已有属性计算得来
computed:{
    fullName:{
        // get什么时候调用(返回值作为fullName的值)
        // 1.初次读取fullName时,get就会被调用
        // 2.所依赖的数据发生改变时,get也会被调用
        get(){
            console.log("@---正在调用get()方法...")
            return this.firstname + "-" + this.lastname
        },
        // get什么时候调用
        // 只有当fullName发生修改时,set才会被调用
        set(value){
            console.log("@---正在调用set()方法...")
            const arr = value.split("-")
            this.firstname = arr[0]
            this.lastname = arr[1]
        }
    }
}

计算属性的原理

底层借助了