Vue3中toRef以及toRefs的基本使用

toRef以及toRefs

  • 作用:创建一个ref对象,其value值指向另一个对象中的某个属性。

  • 语法:const name = toRef(obj,'name')

  • 应用:要将响应式对象中的某个属性单独提供给外部使用时

  • 拓展:toRefs与toRef功能一致,但可以批量创建多个ref对象,语法:toRefs(obj)

那什么时候用到呢?

举个例子:

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

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

            return {
                obj
            }
        }
    }
</script>

<style scoped>

</style>

以上实例可以看出,我们定义了一个obj,把它return出去后。页面上可以渲染出obj。但是如果要渲染出obj里面的一个属性,就必须{{obj.属性名}}。

那如何在插值语法里面,不通过obj.属性名,直接在插值里面写属性名的形式即可渲染呢?

我们可以在return的时候,直接return想要的属性名,而不是return整个对象。

return {
                name:obj.name,
                age:obj.age,
                salary:obj.job.j1.salary
            }

完整代码:

<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} from 'vue'
    export default {
        name: "Demo2",
        setup(){
            let obj = reactive({
                name:'孙悟空',
                age:99,
                job:{
                    j1:{
                        salary:20
                    }
                }
            });

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

<style scoped>

</style>

效果图:

 但是这时候,我们会发现一个问题。数据变成不是响应式得了。点击按钮,页面上并不会发生改变。这是为什么呢?

原因是return出去的name的值是一个字符串。也就是obj.name是一个字符串。所以这时候修改name,仅仅只是修改了字符串,并没有修改obj这个对象里面的name。

举个例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    let obj = {
        name:'孙悟空',
        age:99
    }

    let p = new Proxy(obj,{
        set(target,propName,value){
            console.log(`${propName}被修改了,准备更新界面`)
            Reflect.set(target,propName,value)
        }
    })

    let name = p.name

</script>
</html>

首先可以看到,通过p修改值的时候,数据依旧是响应式的。

 但是如果这时候,let name = p.name。name值这时候是字符串孙悟空,如果这时候把name值进行修改,仅仅只是修改了孙悟空这个字符串,仅此而已。

 所以为了解决这个问题。这时候就要使用toRef属性了。

语法:

第一步先引入:

import {toRef} from 'vue'

使用:

toRef(obj,"name")

我们来对比一下,使用toRef与不使用toRef得区别

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

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

可以看出不使用toRef是一个字符串,使用toRef是变成了一个ref对象,这时候修改ref对象里面的name,会帮我们做代理,去修改obj里面的name。

接下来说说toRefs

使用toRef过程中,会发现,toRef只能代理一个对象属性。

return {
                    name:toRef(obj,'name'),
                    age:toRef(obj,'age'),
                    salary:toRef(obj.job.j1,'salary'),
                }

使用toRef可以代理这个对象下的所有属性

return {
                    ...toRefs(obj)
                }

完整代码:

    <template>
        <div>
            <h1>姓名:{{name}}</h1>
            <h1>年龄:{{age}}</h1>
            <h1>薪资:{{obj.job.j1.salary}}K</h1>
            <div>
                <button @click="name+='-'">修改姓名</button>
                <button @click="age++">修改年龄</button>
                <button @click="obj.job.j1.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:toRef(obj,'name'),
                    // age:toRef(obj,'age'),
                    // salary:toRef(obj.job.j1,'salary'),
                    ...toRefs(obj)
                }
            }
        }
    </script>

    <style scoped>

    </style>

以上就是toRef以及toRefs的基本使用

  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
toRefs方法是Vue3的一个方法,用于将响应式对象转换为普通对象,其每个属性都是指向源对象相应属性的ref。这样做的目的是为了保持响应式,并且可以对返回的对象进行解构使用。在使用toRefs方法时,需要先使用reactive方法将对象转为响应式对象,然后再使用toRefs方法进行转换。 以下是一个使用toRefs方法的示例: ```javascript import { toRefs, reactive } from 'vue' export default { setup() { const obj = reactive({ name: '小明', age: 20, }) let resObj = toRefs(obj) return { ...resObj, } }, } ``` 在这个示例,我们先使用reactive方法将一个普通对象转换为响应式对象,然后使用toRefs方法将响应式对象转换为普通对象,其每个属性都是ref对象。最后,我们将转换后的对象返回,可以在组件对其进行解构使用使用toRefs方法的好处是可以保持响应式,并且可以对返回的对象进行解构使用,避免了使用obj\[属性\]的方式。这样可以更方便地使用响应式对象的属性。 希望这个解答对你有帮助! #### 引用[.reference_title] - *1* [vue3基础之toRefs方法](https://blog.csdn.net/weixin_64740434/article/details/131691607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Vue3 toRefs](https://blog.csdn.net/HH18700418030/article/details/124040233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值