zoukankan      html  css  js  c++  java
  • watch 与 computed

    有三个输出框,第三个输出框的值等于第一个输出口的值加上第二个输出框的值(这里是字符串相加)。
    如果你在 data 中写 fullName: this.firstName + this.lastName 显然是不行的。

    使用 computed 实现单向数据啊绑定

    <div id="app">
        <input type="text" placeholder="firstName" v-model="firstName"><br>
        <input type="text" placeholder="lastName" v-model="lastName"><br>
        <input type="text" v-model="fullName"><br>
    </div>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                firstName: 'A',
                lastName: 'B'
            },
            computed: {
                fullName () {
                    return this.firstName + this.lastName;
                }
            }
        })
    </script>
    

    此时我们就需要用到计算属性,当 firstNamelastName 的值发生改变时计算属性 fullName() 就会执行一次,fullName 的值就会更新(初始化的时候也会执行一次)。

    computed 实现双向数据绑定

    <div id="app">
        <input type="text" placeholder="firstName" v-model="firstName"><br>
        <input type="text" placeholder="lastName" v-model="lastName"><br>
        <input type="text" v-model="fullName"><br>
    </div>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                firstName: 'A',
                lastName: 'B'
            },
            computed: {
                fullName: {
                    get() {
                        return this.firstName + ' ' + this.lastName;
                    },
                    set(value) {
                        const names = value.split(' ');
                        this.firstName = names[0];
                        this.lastName = names[1];
                    }
                }
            }
        })
    </script>
    

    get 用来获取 fullName 的值,
    set 用来监视 fullName 的值。

    watch 实现单向数据绑定

    <div id="app">
        <input type="text" placeholder="firstName" v-model="firstName"><br>
        <input type="text" placeholder="lastName" v-model="lastName"><br>
        <input type="text" v-model="fullName"><br>
    </div>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                firstName: 'A',
                lastName: 'B',
                fullName: ''
            },
            watch: {
                firstName (newValue, oldValue) {
                    this.fullName = newValue + this.lastName;
                },
                lastName (newValue, oldValue) {
                    this.fullName = this.firstName + newValue;
                }
            }
        })
    </script>
    

    使用 watch 就需要监视 firstNamelastName 两个值了,只有当 firstNamelastName 的值发生改变的时候,fullName的值才会变化。

    最后写一个 computed 的做搜索的用例

    computed 的难在于你不知道何时使用计算属性,所以下面写一个用例

    <div id="app">
        <input type="text" placeholder="请输出姓名" v-model="searchName">
        <ul>
            <li v-for="(item, index) in searchList" :key="index">{{item.name}}---{{item.age}}</li>
        </ul>
    </div>
    <script>
        new Vue({
            el: '#app',
            data: {
                list: [
                    {name: '王五', age: 16},
                    {name: '李四', age: 17},
                    {name: '王五', age: 18},
                    {name: '李四', age: 23},
                    {name: '王五', age: 22},
                    {name: '张三', age: 17}
                ],
                searchName: ''
            },
            computed: {
                searchList () {
                    return this.list.filter(p => p.name.indexOf(this.searchName) !== -1)
                }
            }
        })
    </script>
    

    当 程序初始化和 searchName 发送变化时,searchList 计算属性就会执行,更新列表。

    string.indexOf(str, num) 返回str 中 string 中首次出现的位置, num 是可选参数,指定从哪个地方开始检索。

  • 相关阅读:
    正则表达式的与或非
    正则中需要转义的符号
    HTTP 错误状态码讯息
    HTTP协议详解
    TCP/IP、Http、Socket的区别
    CSS样式中标点符号的作用
    HighCharts: 设置时间图x轴的宽度
    可以尝试用Google Font API来摆脱网页字体的单调 仅仅抛砖引玉
    Oracle 权限(grant、revoke)
    网站加上图标
  • 原文地址:https://www.cnblogs.com/Godfunc/p/9229389.html
Copyright © 2011-2022 走看看