姓名案例

插值语法实现

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

    <script>
        // 创建Vue实例
        const vm = new Vue({
            el: '#room',
            data: {
                firstName: 'R',
                lastName: 'cloud'
            }
        })
    </script>

假设我们想实现复杂一点的:无论在姓里输入多少个字,在姓名里只显示三个,或者再将其反转,如果都写在模板里面,这就违背了vue模板简洁的原则。

methods实现

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

    <script>
        // 创建Vue实例
        const vm = new Vue({
            el: '#room',
            data: {
                firstName: 'R',
                lastName: 'cloud'
            },
            methods: {
                fullName() {
                    return this.firstName + '-' + this.lastName
                }
            }
        })
    </script>

虽然也能实现功能,但是只要数据一变化,模板就会被重新解析

computed计算属性

定义

当我们要用的属性不存在时,需要通过已有的属性计算得来

原理

底层借助了Object.defineproperty()方法提供的gettersetter

  • getter什么时候执行?
    • 初次读取数据时会执行一次
    • 当依赖的数据发生改变时会被再次调用

优势

与methods相比,内部有缓存机制,computed不会像methods,用到就调用,例如有n个同样的属性在页面使用,computed只会调用一次,而methods会调用n次,computed效率更高

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

    <script>
        // 创建Vue实例
        const vm = new Vue({
            el: '#room',
            data: {
                firstName: 'R',
                lastName: 'cloud'
            },
            computed: {
                fullName: {
                    //get作用:当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
                    get() {
                        return this.firstName + '-' + this.lastName
                    },
                    //set何时被调用?当fullName被修改时
                    set(value) {
                        // split() 方法用于把一个字符串分割成字符串数组
                        const arr = value.split('-')
                        this.firstName = arr[0]
                        this.lastName = arr[1]
                    }
                }
            }
        })
    </script>

备注

  1. 计算属性最终会出现在vm上,直接读取使用即可
  2. 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变
  3. 如果计算属性确定不考虑修改,可以使用计算属性的简写
    <div id="room">
        姓:<input type="text" v-model="firstName"></br>
        名: <input type="text" v-model="lastName"></br>
        姓名:<span>{{fullName}}</span>
    </div>

    <script>
        // 创建Vue实例
        const vm = new Vue({
            el: '#room',
            data: {
                firstName: 'R',
                lastName: 'cloud'
            },
            computed: {
                //一般只读取属性值而不修改,所以简写只读取属性值
                fullName() {
                    return this.firstName + '-' + this.lastName
                }

            }
        })
    </script>