【前端】vue监视属性和计算属性对比

首先分开讲解各个属性的作用。
1.计算属性
作用:用来计算出来一个值,这个值调用的时候不需要加括号,会根据依赖进行缓存,依赖不变,computed的值不会重新计算。

    const vm = new Vue({
        el:'#root',
        data:{
            lastName:'张',
            firstName:'三',
        },
        computed:{
            fullName:{
                //get作用,读取fullName时get调用且返回值是fullName的值
                get(){
                    return this.lastName.slice(0,3)+'-'+this.firstName.slice(0,3);
                },
                //当fullName被修改时,会调用set
                set(value){
                    const arr = value.split('-');
                    this.lastName = arr[0];
                    this.firstName = arr[1];
                }
            }
        }
    })

其中computed的属性就是计算属性,其中get读取方法尽在初次读取的时候调用以及所依赖的数据发生变化的时候调用。set设置方法是当数据发生变化时就会直接调用去重新计算属性值。

在这里插入图片描述
2.监听属性
作用:和js中的事件监听类似,当vue中的属性值发生变化时执行。

const vm = new Vue({
        el:'#root',
        data:{
            ishot:true,
            numbers:{
                a:1,
                b:1
            }
        },
        methods:{
            change(){
                //this.ishot = (this.ishot==true)?false:true
                this.ishot = !this.ishot
            },
        },
        computed:{
            info(){
                return this.ishot?'炎热':'凉爽'
            }
        },
        watch:{
            ishot:{
                immediate:true,   //初始化时让handler调用一下
                //handler什么时候调用?当isHot发生改变时。
                handler(newValue,oldValue){
                    console.log("ishot被改变了:",newValue,'->',oldValue)
                }
            },
            //监视多级结构中某个属性的变化
            'numbers.a':{
                immediate:true,   //初始化时让handler调用一下
                //handler什么时候调用?当isHot发生改变时。
                handler(newValue,oldValue){
                    console.log("a被改变了:",newValue,'->',oldValue)
                }
            },
            //监视多级结构中所有属性的变化
            numbers:{
                deep:true,  //开启深度监视
                handler(){
                    console.log('numbers改变了');
                }
            }
        }
    })

上述代码中watch属性就是计算属性,它包含两个属性值,其中immediate属性记录的是,在初始化 的时候是否需要计算一次监视属性;还有一个deep属性值代表的是当所要监视的属性值是对象是,是否要进行深度监视,即当对象内部属性值发生变化时是否调用监视函数。

在这里插入图片描述
案例:列表过滤
问题描述搜索框,对列表中的数据进行模糊筛选。

在这里插入图片描述
在这个问题里面,列表会根据input框中的内容对列表中的名字内容进行筛选。
因为要显示的内容跟data中的列表不一样,所以一定是需要重新建一个参数的,因此就需要初始化。例如监听属性中immediate属性。
在这里插入图片描述

html:
    <div id="root">
        <h2>人员列表</h2>
        <input type="text" placeholder="请输入名字" v-model="keyWord">
        <ul>
            <!-- 动态绑定id标识 -->
            <li v-for="(person,index) in filteredPersons" :key="person.id">
                {{person.name}}-{{person.age}}-{{person.sex}}
            </li>
        </ul>
    </div>
监视属性写法:js:
    new Vue({
        el:'#root',
        data:{
            keyWord:'',
            persons:[
                {id:'001',name:'马冬梅',age:19,sex:'女'},
                {id:'002',name:'周冬雨',age:20,sex:'女'},
                {id:'003',name:'周杰伦',age:21,sex:'男'},
                {id:'004',name:'温兆伦',age:22,sex:'男'}
            ],
            filteredPersons:[]
        },
        watch:{
            //这里接收输出的值可以有两个,分别是新值和旧值;也可以只有一个新值
            keyWord:{
                immediate:true,
                handler(newValue){
                    this.filteredPersons = this.persons.filter((p)=>{
                        return p.name.indexOf(newValue)>=0;
                    })
                }
            }
        }
    })
计算属性写法:js:
    new Vue({
        el:'#root',
        data:{
            keyWord:'',
            persons:[
                {id:'001',name:'马冬梅',age:19,sex:'女'},
                {id:'002',name:'周冬雨',age:20,sex:'女'},
                {id:'003',name:'周杰伦',age:21,sex:'男'},
                {id:'004',name:'温兆伦',age:22,sex:'男'}
            ]
        },   
        computed:{
            filteredPersons:{
                get(){
                    var filteredPersons = [];
                    for(var i in this.persons){
                        if(this.persons[i].name.indexOf(this.keyWord)>=0){
                            filteredPersons.push(this.persons[i]);
                        }
                    }            
                    return filteredPersons;         
                },
                set(value){
                    this.keyWord = value;
                }
            }
        }
    })
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值