Vue计算属性基础知识学习

206 阅读1分钟

计算属性

将Maustache(插值中的)复杂的逻辑使用计算属性来代替 将插值模板中的表达式的复杂逻辑放入计算属性 计算属性以函数的形式定义

举个列子

<body>
    <div id="app">
        <p>原始字符串:{{message}}</p>
        <p>表达式实现反转:{{message.split('').reverse().join('')}}</p>
        <p>计算属性反转:{{reversedMessage}}</p>
        <p>在Vue的方法中实现:{{reversedMessageMethod()}}</p>

    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                message: "Hello World"
            },
            computed: {
                reversedMessage() {
                    return this.message.split('').reverse().join('');
                }
            },
            methods: {
                reversedMessageMethod() {
                    return this.message.split('').reverse().join('');
                }
            }
        })
    </script>
</body>

例子2: 将计算属性定义为:对象属性包含getter和setter

通过getter收集依赖,setter响应变化 (响应式系统的核心:Object.definePorperty() + 发布订阅模式)

<body>
    <div id="app">
        <p>First Name: <input type="text" v-model="firstName"></p>
        <p>Last Name: <input type="text" v-model="lastName"></p>
        <p>{{fullName}}</p>
    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                firstName: "Smith",
                lastName: "Will"
            },
            computed: {
                fullName: {
                    get: function() {
                        return this.firstName + ' ' + this.lastName;
                    },
                    set: function(newValue) {
                        const [first, last] = newValue.split(' ');
                        this.firstName = first;
                        this.lastName = last;
                    }
                }
            }
        })
    </script>
</body>

v-if & v-for 组合使用的替代:计算属性

<body>
    <div id="app">
        <p>
            <h3>待完成:</h3>
            <ul>
                <li v-for="complete in completedPlans">
                    {{complete.content}}
                </li>
            </ul>
        </p>
        <p>
            <h3>已完成:</h3>
            <ul>
                <li v-for="incomplete in completedPlans">
                    {{incomplete.content}}
                </li>
            </ul>

        </p>
    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                plans: [{
                    content: "写作业",
                    isComplete: true
                }, {
                    content: "买菜",
                    isComplete: true
                }, {
                    content: "跑步",
                    isComplete: false
                }]
            },
            computed: {
                completedPlans() {
                    return this.plans.filter(plan => plan.isComplete);
                },
                inCompletedPlans() {
                    return this.plans.filter(plan => !plan.isComplete);
                }
            }
        })
    </script>
</body>

使用计算属性的优点:

使用计算属性可以使用它的特性基于响应式缓存,只有计算属性的相关响应式依赖发生变化时才会重新求值。而方法的话是调用一次求值一次,没有缓存。 (依赖:可以理解为使用调用了那个直接就是产生了依赖)

计算属性练习demo

https://github.com/suckitfa/cart-demo-computed-attrs

参考

  • 《Vue.js从头入门到实战》
  • 《Vue.js深入浅出》