美文网首页
computed,filters

computed,filters

作者: 没了提心吊胆的稗子 | 来源:发表于2019-07-29 21:10 被阅读0次

    computed

    当其依赖属性的值发生变化时,这个属性的值会自动更新,与之相关的DOM部分也会同步自动更新
    这里的数据跟methods中的数据一样,最后都会被放在vm实例上,因此不能和data中的数据重名
    有两部分:get(必须有) set ,一般通过js赋值影响其他元素或者表单元素设置值的时候回调用set
    实现复选框的多选不选功能

    <script>
        new Vue({
            el: '#app',
            computed: {
              checkAll: {
                  get(){ // 返回什么checkAll的值就是什么
                      return this.products.every((item) => item.isSelected );
                  },
                  set(val){ // 改自己的值影响其他的 val是给checkAll赋值的时候传过来的
                      this.products.forEach(item => {item.isSelected = val});
                  }
              }
            },
            data: {
               products: [{isSelected: true}, {isSelected: true}, {isSelected: true}]
            }
        });
    </script>
    

    根据输入框实时计算错误信息

     <input type="text" v-model="a">{{tips}}
     <!--根据输入框的内容算出一个错误信息-->
    <script>
        new Vue({
            el: '#app',
            computed: {
              tips(){
                  return this.a.length < 6 ? '密码至少6位' : null;
              }
            },
            data: {
               a: ''
            }
        });
    </script>
    

    计算属性写成函数,默认就调用的是get方法

    sum: { 
      get() {
        return this.products.reduce((prev, next) => {
        // 当前没被选中就不加
        if(!next.isSelected){ 
           return prev;
        }
        return prev + next.productPrice*next.productCount
         }, 0)
     }
    }
    // same as
    sum() {
        return this.products.reduce((prev, next) => {
        // 当前没被选中就不加
           if(!next.isSelected){ 
               return prev;
           }
        return prev + next.productPrice*next.productCount
         }, 0)
     }
    

    computedwatch
    computed默认调用get方法,必须要有return不支持异步
    下面方法的返回值是给setTimeout了,而tips就相当于returnundefined,所以此时页面上就不会有提示效果

    tips(){
        setTimeout(function () {
            return this.a.length < 6 ? '密码至少6位' : null;
        }, 500)
    }
    

    watch观察者,观察一个属性的变化,他变了就做一件事,并且watch的属性名要和被观察的属性名保持一致 只有值变化的时候才触发 支持异步 默认只监控一层的数据变化,深度监控不能用函数,要用对象

    watch: {
         a(newVal, oldVal){ // 只有值变化的时候才触发 ,支持异步
            setTimeout(function () {
                this.msg = newVal.length < 3 ? 
                           '密码至少3位' : newVal.length > 6 ? 
                           '密码最多6位' : null;
            }, 500)
         }
    },
    
    watch: {
            todos: { // 默认只监控一层的数据变化
                handler(){  // 属性写成函数,默认就写了个handler
                    
                },
                deep: true //表示深度
            }
        }
    

    computedmethod
    computed有缓存,如果依赖的数据没有变化就不会重新执行,是计算属性,不是方法,method是方法,不会缓存

    filters

    实例上可用,实例间不可公用,若挂在Vue原型上则可公用

    {{'123' | myFilters(1,2,3)}}
    
    <script>
        let vm = new Vue({
            el: '#app',
            filters: {
                // data是input 竖线前面的值,后面才是参数
                myFilters(data,  param1, param2, ...){}
            }
        });
    </script>
    

    第二个会报错,显示Failed to resolve filter: myFilters,因为这个过滤是给第一个实例上定义的方法

    <div id="app">
        {{'hello' | myFilter}}
    </div>
    <div id="app1">
        {{'hello' | myFilter}}
    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script>
        let vm = new Vue({
            el: '#app',
            filters: {
                myFilter(data){
                    return data + " world! "
                }
            }
        });
        let vm1 = new Vue({
            el: '#app1',
        });
    </script>
    

    挂在原型上,全局过滤器,一定要放在实例创建之前

    <script>
       Vue.filter('myFilter', (data)=>{return data+' world!';});
       new Vue({
            el: '#app'
            }
        });
        new Vue({
            el: '#app1',
        });
    </script>
    

    相关文章

      网友评论

          本文标题:computed,filters

          本文链接:https://www.haomeiwen.com/subject/aqwirctx.html