Vue3之toRefs和toRef在reactive中的一些应用方式

 更新时间:2024年03月18日 10:06:27   作者:小馒头学python  
这篇文章主要介绍了Vue3之toRefs和toRef在reactive中的一些应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

回顾响应式对象

在介绍知识点之前,我们准备好初始代码

<template>
<h2>姓名:{{ person.name }}</h2>
<h2>姓名:{{ person.age }}</h2>
<button @click="change_name">修改名字</button>
<button @click="change_age"></button>
 </template>
 
 <script lang="ts" setup name="Person11">
  import {reactive} from 'vue'
  
 let person = reactive({
  name:'馒头',
  age:22
 })
 function change_name(){
  person.name += '*'
 }

 function change_age(){
  person.age += 1
 }

 </script>
 
 <style scoped>
   .person {
     background-color: skyblue;
     box-shadow: 0 0 10px;
     border-radius: 10px;
     padding: 20px;
   }
   button {
     margin: 0 5px;
   }
 </style>

运行结果如下

请添加图片描述

是否和你想的一样呢,我们使用了reactive进行创建响应式对象

接下来我们对person进行解构赋值

或许有些人不太理解解构赋值,我从网上找了一段话

  • 解构赋值是 JavaScript 中一种方便的语法,用于从数组或对象中提取数据并赋值给变量。通过解构赋值,可以轻松地提取数组中的元素或对象中的属性,使代码更简洁易读。
  • 它还可以嵌套使用,处理复杂的数据结构,但要注意避免过度解构,以保持代码的可读性。

接下来我们看看代码中如何操作,只需在数据下面加一行

let {name,age} = person

接下来我们修改方法中的部分代码

//原代码
function change_name(){
          person.name += '*'
        }

        function change_age(){
          person.age += 1
        }
//修改之后的代码
function change_name(){
          name += '*'
        }

        function change_age(){
          age += 1
        }

这样我们的页面是否还会响应呢,答案是不可以

请添加图片描述

如果我们再修改模板里面的内容呢

<h2>姓名:{{ name }}</h2>
<h2>姓名:{{ age }}</h2>

答案也是不更新的,但是数据究竟改没改呢,我们打印一下

function change_name(){
          name += '*'
          console.log(name)
        }

        function change_age(){
          age += 1
          console.log(age)
        }

控制台结果显示如下,所以说是改了的

接下来我们解释一下

let {name,age} = person

上面这行代码和下面两行代码其实是等价的

let name=person.name
let age=person.age

同时我们要明确一点,下图的数据是响应式的

但是我们解构后相当于自己重新定义了一个对象name和age,然后person.name和person.age是不变的

多说无益,我们测试一下叭

function change_name(){
          name += '*'
          console.log(name, person.name)
        }

结果显然了叭,结论就是:响应式对象解构出的并非是响应式对象

介绍toRefs

承接上个标题,我们如果想要将解构的对象变为响应式的,我们应该怎么做呢,只需要import一个toRefs

import {reactive,toRefs} from 'vue'

同时我们再将解构的person包裹一下toRefs

let {name,age} = toRefs(person)

这样的意思就是,将解构的数据变为Ref定义的响应式对象,将reactive对象变为Ref对象

接下来我们改一下方法

function change_name(){
          name.value += '*'
          console.log(name, person.name)
        }

        function change_age(){
          age.value += 1
          console.log(age)
        }

这样我们再测试一下

请添加图片描述

介绍toRef(不常用)

toRef和toRefs是 Vue3 中用于处理响应式对象的两个函数,它们有一些重要的区别

toRef:    

  • 参数:接收一个响应式对象和一个属性名,返回一个 ref 对象,指向该属性的值。
  • 用途:主要用于将单个属性转换为 ref 对象,使得该属性的值能够被响应式地跟踪。

toRefs:

  • 参数:接收一个响应式对象,返回一个包含该对象所有属性的 ref 对象。
  • 用途:常用于在组件中将 props 转换为响应式对象,或者在 setup 函数中处理响应式对象的多个属性。

总的来说,toRef用于处理单个属性,将其转换为 ref 对象,而toRefs用于处理整个对象,将对象的所有属性都转换为 ref 对象

总结

本节介绍了一下toRefs和toRef,同时回忆了一下reactive

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue 路由子组件created和mounted不起作用的解决方法

    vue 路由子组件created和mounted不起作用的解决方法

    今天小编就为大家分享一篇vue 路由子组件created和mounted不起作用的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue2如何获取上页的url地址

    vue2如何获取上页的url地址

    这篇文章主要介绍了vue2如何获取上页的url地址问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue3+Hooks实现4位随机数和60秒倒计时的示例代码

    Vue3+Hooks实现4位随机数和60秒倒计时的示例代码

    Vue3的Hooks是一种新的 API,本文主要介绍了Vue3+Hooks实现4位随机数和60秒倒计时的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • vue + canvas实现涂鸦面板的示例代码

    vue + canvas实现涂鸦面板的示例代码

    这篇文章主要给大家介绍了vue + canvas实现涂鸦面板的示例,文章通过代码示例介绍的非常详细,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08
  • vue3中v-model的用法详解

    vue3中v-model的用法详解

    vue 提供了很多自定义指令,大大方便了我们的开发,其中最常用的也就是 v-model,他可以在组件上使用以实现双向绑定。它可以绑定多种数据结构, 今天总结一下用法
    2023-04-04
  • vue实现element-ui对话框可拖拽功能

    vue实现element-ui对话框可拖拽功能

    这篇文章主要介绍了vue实现element-ui对话框可拖拽功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • vue Element UI扩展内容过长使用tooltip显示

    vue Element UI扩展内容过长使用tooltip显示

    这篇文章主要为大家介绍了vue Element UI扩展内容过长使用tooltip展示鼠标hover时的提示信息,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • vant picker+popup 自定义三级联动案例

    vant picker+popup 自定义三级联动案例

    这篇文章主要介绍了vant picker+popup 自定义三级联动案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue3整合springboot打完整jar包

    vue3整合springboot打完整jar包

    本文主要介绍了vue3整合springboot打完整jar包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Vue实现纵向的物流时间轴效果的示例代码

    Vue实现纵向的物流时间轴效果的示例代码

    在当今数字化的时代,用户体验的优化至关重要,物流信息的展示作为电商和供应链领域中的关键环节,其呈现方式直接影响着用户对货物运输状态的感知和满意度,所以本文介绍了Vue实现纵向的物流时间轴效果的方法,需要的朋友可以参考下
    2024-08-08

最新评论