Vue3中ref与toRef的区别

本文详细介绍了 Vue 中 `ref` 和 `toRef` 的使用场景及其响应式原理。通过示例代码展示了它们在页面数据更新时的不同行为,指出 `ref` 在创建时仅读取对象属性,后续修改的是 `ref` 自身的属性,而非源数据。同时,对比了使用 `ref` 和 `toRef` 渲染页面的效果,强调了它们在数据绑定和响应式更新方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发时,有时候会遇到,使用toRef和使用ref的页面效果一样。

代码如下:

    <template>
        <div>
            <h1>姓名:{{name}}</h1>
            <h1>年龄:{{age}}</h1>
            <h1>薪资:{{salary}}K</h1>
            <div>
                <button @click="name+='-'">修改姓名</button>
                <button @click="age++">修改年龄</button>
                <button @click="salary+=10">修改薪资</button>
            </div>
        </div>
    </template>

    <script>
        import {ref,reactive,toRef,toRefs} from 'vue'
        export default {
            name: "Demo2",
            setup(){
                let obj = reactive({
                    name:'孙悟空',
                    age:99,
                    job:{
                        j1:{
                            salary:20
                        }
                    }
                });

                let name = obj.name
                console.log(`我是name`,name);

                let name1 = toRef(obj,"name")
                console.log(`我是name1`,name1);

                return {
                    name:ref(obj.name),
                    age:ref(obj.age),
                    salary:ref(obj.job.j1.salary),
                }
            }
        }
    </script>

    <style scoped>

    </style>

使用ref,页面上的数据依旧是响应式的。

但是这里有一个坑,使用ref,它只有创建的时候读取了obj里面的数据。之后修改的数据都是ref创建出来的属性。

验证一下,在页面中渲染出obj。进行对比

代码:

    <template>
        <div>
            {{obj}}
            <h1>姓名:{{name}}</h1>
            <h1>年龄:{{age}}</h1>
            <h1>薪资:{{salary}}K</h1>
            <div>
                <button @click="name+='-'">修改姓名</button>
                <button @click="age++">修改年龄</button>
                <button @click="salary+=10">修改薪资</button>
            </div>
        </div>
    </template>

    <script>
        import {ref,reactive,toRef,toRefs} from 'vue'
        export default {
            name: "Demo2",
            setup(){
                let obj = reactive({
                    name:'孙悟空',
                    age:99,
                    job:{
                        j1:{
                            salary:20
                        }
                    }
                });

                let name = obj.name
                console.log(`我是name`,name);

                let name1 = toRef(obj,"name")
                console.log(`我是name1`,name1);

                return {
                    obj,
                    name:ref(obj.name),
                    age:ref(obj.age),
                    salary:ref(obj.job.j1.salary),
                }
            }
        }
    </script>

    <style scoped>

    </style>

效果图:

 name:ref(obj.name),相当于读取了孙悟空这个字符串,把它打包成了一个新的ref对象。源数据丝毫不变。

以上就是ref以及toRef的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值