• [vue]计算和侦听属性(computed&watch)


    先看一下计算属性

    vue只有data区的数据才具备响应式的功能.

    计算和侦听属性

    - v-text里可以写一些逻辑
    
    <div id="example">
      {{ message.split('').reverse().join('') }}
    </div>
    
    - 不过页面有大量引用这种逻辑, 显得就不太酷了, 将这种需要处理的属性写到computed里
    
    <div id="example">
      <p>Original message: "{{ message }}"</p>
      <p>Computed reversed message: "{{ reversedMessage }}"</p>
    </div>
    
    var vm = new Vue({
      el: '#example',
      data: {
        message: 'Hello'
      },
      computed: {
        // 计算属性的 getter
        reversedMessage: function () {
          // `this` 指向 vm 实例
          return this.message.split('').reverse().join('')
        }
      }
    })
    

    参考
    计算属性持续追踪它的响应依赖。在计算一个计算属性时,Vue.js 更新它的依赖列表并缓存结果,只有当其中一个依赖发生了变化,缓存的结果才无效。因此,只要依赖不发生变化,访问计算属性会直接返回缓存的结果,而不是调用 getter。
    下面的栗子,只有msg发生变化时,才会重新计算.即调用属性的get方法.

    - 只有当this.msg更改时,才会触发computed重新计算
    
    <div id="app">
        <input type="text" v-model="msg">
        {{example}}
    </div>
    <script src="node_modules/vue/dist/vue.js"></script>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                msg: 'hi'
            },
            computed: {
                example() {
                    return Date.now() + this.msg;
                }
            }
        })
    </script>
    
    - 栗子2: 全选按钮
    
    <div id="app">
        全选: <input type="checkbox" v-model="checkAll"> <br>
        <input type="checkbox" v-for="product in products" v-model="product.isSelected">
    </div>
    
    <script src="node_modules/vue/dist/vue.js"></script>
    
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                msg: "maotai",
                products: [
                    {productName: 'python', isSelected: false},
                    {productName: 'go', isSelected: true},
                ],
            },
            computed: {
                checkAll: {
                    get() { //计算checkall的值
                        return this.products.every(item => item.isSelected);
                    },
                    set(val) {//根据checkall的值计算每项该不该选
                        this.products.forEach(item => item.isSelected = val);
                    }
                }
            }
        })
    
    - 仅有少数computed属性需要set, 绝大多数只有get(可以省略关键词)
    
    <div id="app">
        <input type="text" placeholder="price1" v-model="price1">
        <input type="text" placeholder="price2" v-model="price2"> <br>
        总价格: {{price3}}
    </div>
    <script src="node_modules/vue/dist/vue.js"></script>
    <script>
        let vm = new Vue({
            el: "#app",
            data: {
                msg: 'maotai',
                price1: 1,
                price2: 2,
            },
            computed: {
                price3() {
                    return parseInt(this.price1) + parseInt(this.price2);
                }
            }
        })
    </script>
    
  • 相关阅读:
    《JS权威指南学习总结--6.6属性getter和setter》
    《JS权威指南学习总结--6.5枚举属性》
    django的模板系统
    django额外参数的传递和url命名
    python在图片上画矩形
    当爬虫遇到js加密
    php基础-7
    php基础-6
    php基础-5
    php基础-4
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/9025253.html
Copyright © 2020-2023  润新知