Vue知识点:计算属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue知识点:计算属性相关的知识,希望对你有一定的参考价值。

参考技术A 1. 定义:计算属性不存在,要通过已有属性计算得出。

2. 原理:底层借助了Object.defineproperty方法提供的getter和setter。

3. get函数什么时候执行?

          (1)初次读取时会执行一次。

          (2)当依赖的数据发生改变时会被再次调用。

4. 优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。

5. 备注:

          (1)计算属性最终会出现在vm上,直接读取使用即可。

                    注:可以直接使用插值方法调用计算属性。比如: fullname

          (2)如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发            生改变。

```javascript

<div id="root">

姓:<input type="text" v-model="firstName"/> <br>

名:<input type="text" v-model="lastName"/> <br>

全名:<span>fullName</span>

</div>

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 只考虑读取,不需要修改的时候简写

    fullName()

        console.log('get被调用了')

        return this.firstName + '-' + this.lastName

      ,

     

    ,

)

```

vue图书小案例

小知识点:

vue中计算属性有缓存(对象属性变化时才会更新),方法没有缓存,所以计算属性比方法效率高
js中let有块级作用域,var没有块级作用域,所以var是有缺陷的
this.letters[0] = ‘bb‘; //vue中,这种做法并不是响应式的;推荐使用响应式方法:this.letters.splice(0,1,‘cc‘);

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<body>
<div id="app">
    <ul v-if="books.length">
        <ul>
            <li v-for="(v,k) in books">
                <button @click="add(k,false)" :disabled="v.num <= 1">-</button>
                <input type="text" :value="v.num">
                <button @click="add(k,true)">+</button>

                <div>{{v.name}}</div>
                <div>{{v.price * v.num | showPrice}}</div>

                <button @click="rm(k)">移除</button>
            </li>
        </ul>
        总价{{total_price | showPrice}}
    </ul>

    <div v-else>当前没有图书</div>
</div>
</body>
<script>
    let v = new Vue({
        el : "#app",
        data : {
            books : [
                {
                    name : ‘天龙八部‘,
                    price : 33,
                    num : 1,
                },
                {
                    name : ‘鹿鼎记‘,
                    price : 13,
                    num : 1,
                },        
            ]
        },
        methods : {
            add : function(k,boo){
                let obj = this.books[k];
                if(boo) {
                    obj.num+=1;
                }else{
                    obj.num-=1;
                }
                //this.books.splice(k,k+1,obj);
            },
            rm : function(k){
                this.books.splice(k,1);
            }
        },
        // 计算属性
        computed : {
            total_price : function(){
                let total = 0;
                for(let i = 0;i < this.books.length;i++ ){
                    total += (this.books[i].price * this.books[i].num);
                }
                return total;
            }
        },
        // 过滤器
        filters : {
            showPrice : function(price){
                return ‘$‘ + price.toFixed(2);
            }
        }
    })
</script>
</html>

 

以上是关于Vue知识点:计算属性的主要内容,如果未能解决你的问题,请参考以下文章

vue.js基础知识篇:计算属性表单控件绑定

vue基础知识整理

Vuejs学习笔记-9.使用计算属性

vue.js基础知识篇:简介数据绑定指令计算属性表单控件绑定和过滤器

vue入门----模板与计算属性

vue中的计算属性不起作用