关于vue.js:Vue3全家桶升级指南二reftoReftoRefs的区别

ref是对原始数据的拷贝,当批改ref数据时,模板中的视图会产生扭转,然而原始数据并不会扭转。
toRef是对原始数据的援用,批改toRef数据时,原始数据也会产生扭转,然而视图并不会更新。

在vue3中定义一个根底类型的响应式数据个别应用ref,定义一个援用类型的响应式数据个别应用reactive。

import {ref,reactive} from "vue"
export default {
    setup(){
    let num=ref(0)
    let obj=reactive({name:'张三',age:18})
    return {num,obj}    
}
}

这样在模板中应用的时候,就能够间接通过{{num}},{{obj.name}},{{obj.age}}获取数据了。

根底类型的数据没有问题,然而援用类型的值在模板中这样写就比拟累赘了,咱们也能够间接解构进去,在模板中就能够间接应用{{name}}和{{age}}了。

import {ref,reactive} from "vue"
export default {
    setup(){
        let num=ref(0)
        let obj=reactive({name:'张三',age:18})
        let {name,age}=obj
        return {num,name,age}
    }
}

toRef是将对象中的某个值转化为响应式数据 toRef(obj,key)

import {toRef} from "vue"
export default {
    setup() {
        let obj = { name: '张三', age: 18 };
        let newObj = toRef(obj, 'name');
        setTimeout(() => {
            newObj.value = '李四';
            console.log(obj, newObj); //obj中的name和newObj都变成李四了,然而视图显示还是张三,不会变动
        }, 2000);
        return { obj, newObj };
    },
};
</script>

toRef是对原始数据的援用,批改toRef数据时,原始数据也会产生扭转,然而视图并不会更新。

toRefs是将整个对象转化成响应式数据 toRefs(obj)

import {toRefs} from "vue"
export default {
    let obj = { name: '张三', age: 18 };
        let newObj = toRefs(obj);
        setTimeout(() => {
            newObj.name.value = '李四';
            console.log(obj, newObj);
        }, 2000);
        return { obj, newObj };
}

须要留神的是,依照下面这种写法,在模板中应用的时候,须要依照这种形式 {{newObj.name.value}}(不太了解),如果想间接应用{{name}},那么在setup中return的时候须要解构下

import {toRefs} from "vue"
export default {
    let obj = { name: '张三', age: 18 };
        let newObj = toRefs(obj);
        setTimeout(() => {
            newObj.name.value = '李四';
            console.log(obj, newObj);
        }, 2000);
        return { obj, ...newObj };
}

这样在模板中就能够间接通过{{name}}来获取了。

小结一下

1、ref是对元数据的拷贝,批改响应式数据时不会影响之前的数据,视图会更新

2、toRef和toRefs是对元数据的援用,批改响应式数据时,元数据也会扭转,然而视图不会更新,toRef批改的是对象的某个属性,toRefs批改的是整个对象

3、toRefs的应用场景:如果想让响应式数据和原来的数据关联起来同步更新,并且不更新视图,那么就能够应用toRefs

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理