VueJs中toRef与toRefs函数对比详解

目录
  • 正文
  • toRef()函数
  • 与ref的不同
  • toRefs()函数
  • 为啥需要toRef()与toRefs()函数
  • 总结

正文

ref是处理基本数据类型响应式API函数,在setup中声明定义的变量,可以直接在模板中使用

没有被响应式API包裹处理的变量数据,是不具备响应式能力的

也就是往往在逻辑中修改了数据,但是页面不会更新,那怎么样将一个非响应式数据变成响应式数据

就需要用到toRef()toRefs()这两个componsition API

单纯的去看概念,往往比较抽象,是难以理解的,还是需要从具体的实例出发

toRef()函数

作用:创建一个ref对象,其value值指向另一个对象中的某个属性值,与原对象是存在关联关系的

也就是基于响应式对象上的一个属性,创建一个对应的ref,这样创建的ref与它的源属性是保持同步的,与源对象存在引用关系

改变源属性的值将更新ref的值

语法: const 变量名 = toRef(源对象,源对象下的某个属性)

如:const name = toRef(person,'name')

应用: 要将响应式对象中的某个属性单独提供给外部使用时,不想丢失响应式,把一个propref传递给一个组合式函数也会很有用

缺点toRef()只能处理一个属性,但是toRefs(源对象),却可以一次性批量处理

<script setup>
import { reactive } from "vue";
const person = reactive({
   name:"川川",
   age: 18,
   job: {
     web: '前端开发',
     trade: '互联网'
   }
});
</script>

那在模板当中想要渲染数据可以这么写

{{person.name}} -{{person.age}}-{{person.job.web}}-{{person.job.trade}}

如果不想在模板当中,写那么长,那么可以先解构,如下所示

<script setup>
import { reactive } from "vue";
const person = reactive({
   name:"川川",
   age: 18,
   job: {
     web: '前端开发',
     trade: '互联网'
   }
});
const { name, age} = person;
const { web,trade} = person.job;
</script>

那在模板中,可以直接使用变量的,如下所示

{{name}}-{{age}}-{{web}}-{{trade}}

现在,如果我们想要去修改变量数据,会发现,逻辑中的数据会被修改,但是页面中的数据不会更新,也就是丢失了响应式 比如:如下模板,分别修改名字,年龄属性

<button @click="handleChangeAttrs">修改属性</button>

那在逻辑代码中

<script setup>
import { reactive } from "vue";
const person = reactive({
   name:"川川",
   age: 18,
   job: {
     web: '前端开发',
     trade: '互联网'
   }
});
const { name, age} = person;
const { web,trade} = person.job;
// 这样直接操作数据是无法修改的,因为它不是一个响应式数据,只是一个纯字符串,不具备响应式
function handleChangeAttrs() {
    name = "itclanCoder";
    age = 20;
}
</script>

如果想要修改数据,支持响应式,将一个非响应式数据,变成一个响应式数据,需要借用toRef(源对象,源对象下指定的属性)函数,如下所示

<script setup>
import { reactive,toRef } from "vue";
const person = reactive({
   name:"川川",
   age: 18,
   job: {
     web: '前端开发',
     trade: '互联网'
   }
});
// 想要修改指定哪个对象具备响应式,那么就使用toRef函数处理,toRef(源对象,源对象下的某个属性)
const name = toRef(person,'name');
const age = toRef(person,'age');
// 经过了toRef的处理,修改变量的值,那么就需要xx.value
function handleChangeAttrs() {
    name.value = "itclanCoder";
    age.value = 20;
}
</script>

在模板当中,仍然是如上所示

{{person}}
{{name}}-{{age}}-{{web}}-{{trade}}
<button @click="handleChangeAttrs">修改属性</button>

你会发现使用toRef()函数处理后,非响应式数据就具备响应式数据的能力了的,而且源数据也会同步

如果只是用于纯数据页面的展示,那是没有必要将数据转化为响应式数据的,如果需要修改数据,那么就需要将非响应式数据转化为响应式数据

是通过toRef()函数实现的

与ref的不同

如果你用ref处理数据的话,如下所示,使用ref处理数据,页面也能实现数据的响应式,更新,但是它与toRef是不同,有区别的

<script setup>
import { reactive,toRef } from "vue";
const person = reactive({
   name:"川川",
   age: 18,
   job: {
     web: '前端开发',
     trade: '互联网'
   }
});
// 使用ref
const name = ref(person.name);
const age = toRef(person.age);
// 经过了toRef的处理,修改变量的值,那么就需要xx.value
function handleChangeAttrs() {
    name.value = "itclanCoder";
    age.value = 20;
}
</script>

修改数据,页面数据会更新,但是源数据不会同步,修改,并无引用关系,ref相当于是对源对象重新拷贝一份数据 ref()接收到的是一个纯数值

toRefs()函数

toRef()只能处理源对象指定的某个属性,如果源对象属性很多,一个一个的使用toRef()处理会显得比较麻烦

那么这个toRefs()就很有用了,它与toRef()的功能一致,可以批量创建多个ref对象,并且能与源对象保持同步,有引用关系

语法:toRefs(源对象),toRefs(person)

如上面的示例代码,修改为toRefs()所示

<script setup>
import { reactive,toRefs } from "vue";
const person = reactive({
   name:"川川",
   age: 18,
   job: {
     web: '前端开发',
     trade: '互联网'
   }
});
// 通过toRefs()批量处理,此时通过解构
const {name,age} = toRefs(person);
// 经过了toRef的处理,修改变量的值,那么就需要xx.value
function handleChangeAttrs() {
    name.value = "itclanCoder";
    age.value = 20;
}
</script>

当从组合式函数中返回响应式对象时,toRefs 是很有用的。使用它,消费者组件可以解构/展开返回的对象而不会失去响应性

import { toRefs } from "vue";
function useFeatureX() {
  const state = reactive({
    foo: 1,
    bar: 2
  })
  // 在返回时都转为ref
  return toRefs(state)
}
// 可以解构而不会失去响应性
const { foo, bar } = useFeatureX()

注意事项

toRefs 在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref,则改用 toRef

为啥需要toRef()与toRefs()函数

目的:在保证不丢失响应式的前提下,把对象进行解构,方便对象数据分解和扩散

前提:针对的是响应式对象(reactive封装的)非普通对象

注意:不创造响应式(那是reactive的事情),它本身只是延续响应式,让一个非响应式数据通过toReftoRefs转换为响应式数据能力

总结

这个toRef()toRefs()是非常实用的,都是将一个非响应式数据变为一个具备响应式数据能力,与源对象可保持数据的同步,具备引用关系,前者只支持单个属性数据的处理,而后者支持数据的批量处理

修改数据时,页面数据会更新,这两个composition API函数是非常实用的,在实际业务开发中,如果涉及到修改页面的数据,那么就会用到

以上就是VueJs中toRef与toRefs函数对比详解的详细内容,更多关于VueJs toRef与toRefs函数对比的资料请关注我们其它相关文章!

(0)

相关推荐

  • Vue 2中实现CustomRef方式防抖节流

    目录 前言 背景 撸代码 防抖(debounce) 代码 使用 节流(throttle) 代码 使用 总结 前言 今天给大家带来的是Vue 2 中的实现 CustomRef 方式防抖/节流这篇文章,前几天利用 customRef 实现了在 vue 3 中的极致防抖/节流的新方式.感兴趣的朋友可以点击 Vue 3 中的极致防抖/节流(含常见方式防抖/节流) 进行查看. 在前端的开发过程中,在涉及到与用户交互的过程中是基本上都是需要处理的,常规操作就是在对应位置加上防抖或者节流. 加上防抖或者节流的

  • 一文搞懂VueJs中customRef函数使用

    目录 前言 示例-延迟显示 总结 前言 ref是Vue官方提供的componsition API,将一个非响应式数据转变为响应式数据的函数,至于底层怎么实现数据的收集与响应式 使用者无需去关注,相当于就是精装电脑,然而有时候,针对一些复杂特殊的需求,我们需要自己造轮子,自己手动原生的去实现内部结构 实现基础的功能的同时,还要进行额外的拓展,那么这时候就需要自定义ref了的,它就相当于是组装式的电脑,内部结构需要自己去组装,实现 而非直接从商城里购买,用一些现成的零部件组装一个类似精装的电脑,甚至

  • Vue2 Dialog弹窗函数式调用实践示例

    目录 前言 Vue2 的弹窗常用的使用方式 第一种:将弹窗写在上下文中 第二种:原型上注入全局方法 第三种:通过依赖注入的方式 合理的使用方式 功能实现 结语 前言 Dialog 对话框组件几乎是每个前端项目必不可少的组件,通常是在保留当前页面状态并屏蔽其他用户输入的情况下,与用户交互并承载相关操作. 在 BOM 的方法中,alert.prompt 都是以前用来做类似功能的方法,但是这些浏览器内置方法会完全停止网页代码执行,对于贫乏的前端线程资源来说实在是过于僵硬.于是便产生了各种各样的 Js

  • vueJs函数readonly与shallowReadonly使用对比详解

    目录 前言 readonly shallowreadonly 总结 前言 在使用vue3开发项目时,对于一些特殊的需求,针对有些数据字段,在前端,只允许读取,不允许修改,比如:有的网站用户名,一旦注册了,就不允许修改 当然,有时候,我们从别的地方引用数据过来,用作信息的展示,但是却不允许修改,不希望影响源数据 那么readonly与shallowReadonly这两个API就很有用了的 readonly 让一个响应式数据变为只读的,接收一个响应式数据,经过readonly加工处理一下,那么新赋值

  • vueJs函数toRaw markRaw使用对比详解

    目录 前言 toRaw()函数 markRaw()函数 总结 前言 针对一些特殊的需求,在项目里,需要将响应式数据变为普通原始类型数据,这种情况是有的 在Vue里,能够将普通数据类型的数据变为响应式数据,同时,也能将响应式类型数据变为普通类型数据 可以用于提升数据的性能 toRaw()函数 接收一个reactive响应式数据,将一个响应式的数据变为普通类型的数据,转化为非响应式数据,相当于还原对象,reactive相当于制作,但对于ref响应式数据不起作用 将一个由reactive生成的响应式对

  • C++ 中const修饰虚函数实例详解

    C++ 中const修饰虚函数实例详解 [1]程序1 #include <iostream> using namespace std; class Base { public: virtual void print() const = 0; }; class Test : public Base { public: void print(); }; void Test::print() { cout << "Test::print()" << end

  • Vue中util的工具函数实例详解

    Vue中util的工具函数,下面通过实例代码给大家介绍的非常详细,具体代码如下所示: // 防抖函数 function debounce (fn, wait) { let t return () => { let context = this let args = arguments if (t) clearTimeout(t) t = setTimeout(() => { fn.apply(context, args) }, wait) } } function flatten (arr)

  • python中强大的format函数实例详解

    python中format函数用于字符串的格式化 自python2.6开始,新增了一种格式化字符串的函数str.format(),此函数可以快速处理各种字符串. 语法 它通过{}和:来代替%. 请看下面的示例,基本上总结了format函数在python的中所有用法 #通过位置 print '{0},{1}'.format('chuhao',20) print '{},{}'.format('chuhao',20) print '{1},{0},{1}'.format('chuhao',20) #

  • 一文搞懂Vue3中toRef和toRefs函数的使用

    目录 toRef 函数 toRef 函数使用 ref 函数验证 toRefs 函数 toRefs 函数使用 总结 上一篇博文介绍了vue3 里面的 ref 函数和 reactive 函数,实现响应式数据,今天主要来说一下 toRef 函数和 toRefs 函数的基本使用. toRef 函数 通过上一篇博客,我们知道,ref 函数可以创建一个响应式的数据,那 toRef 函数同样也是创建一个响应式的数据,那么他们之间的区别是什么呢? 首先一点,ref 函数他的本质其实是去拷贝一份数据,脱离了与源数

  • Oracle中nvl()和nvl2()函数实例详解

    目录 1.nvl:根据参数1是否为null返回参数1或参数2的值 [样例展示一]:expression1值为null: [样例展示二]:expression1值不为null: [样例展示三]:expression1.expression2值均为null: 2.nvl2:根据参数1是否为null返回参数2或参数3的值 [样例展示一]:expression1值不为null: [样例展示二]:expression1值为null: [样例展示三]:expression1为null,且expression

  • MySQL中日期型单行函数代码详解

    MySQL中日期型单行函数: CURDATE()或CURRENT_DATE() 返回当前日期(精确到日) 参考代码如下: SELECT CURDATE() FROM DUAL; SELECT CURRENT_DATE() FROM DUAL; -----------------------------------(分割线)------------------------------------ CURTIME() 或CURRENT_TIME() 返回当前时间(精确到秒) 参考代码如下: SELE

  • python中np.random.permutation函数实例详解

    目录 一:函数介绍 二:实例 2.1 直接处理数组或列表数 2.2 间接处理:不改变原数据(对数组下标的处理) 2.3 实例:鸢尾花数据中对鸢尾花的随机打乱(可以直接用) 总结 一:函数介绍 np.random.permutation() 总体来说他是一个随机排列函数,就是将输入的数据进行随机排列,官方文档指出,此函数只能针对一维数据随机排列,对于多维数据只能对第一维度的数据进行随机排列. 简而言之:np.random.permutation函数的作用就是按照给定列表生成一个打乱后的随机列表 在

  • kotlin Standard中的内联函数示例详解

    let.with.run.apply.also.takeIf.takeUnless.repeat函数的使用 kotlin Standard.kt文件中,提供了一些内联函数,这些内联函数可以减少代码量,在使代码优美的同时,打打提高开发效率.它们分别为: run.with.let.also.apply let let函数的定义如下: public inline fun <T, R> T.let(block: (T) -> R): R = block(this) 默认当前这个对象作为闭包的it

  • 如何在c++中实现字符串分割函数split详解

    前言 在学习c++中string相关基本用法的时候,发现了sstream的istringstream[1]可以将字符串类似于控制台的方式进行输入,而实质上这个行为等同于利用空格将一个字符串进行了分割,于是考虑到可以利用这个特性来实现c++库函数中没有的字符串分割函数split string src("Avatar 123 5.2 Titanic K"); istringstream istrStream(src); //建立src到istrStream的联系 string s1, s2

  • java中Collections.sort排序函数用法详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

随机推荐