vue3中的包装响应式数据ref、reactive、toRef、toRefs

一、ref

Vue 3中拥有一个新的特性叫做ref,它是一个函数,用于包装响应式数据。与Vue 2的data选项不同,ref可以在普通JavaScript中使用,而不仅仅是在Vue组件中。ref可以将普通的JavaScript数据变成响应式的,这意味着当被包装的数据发生变化时,Vue会自动侦测到并更新相应的界面。

以下是ref的用法:

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increase">Increase</button>
  </div>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    const increase = () => {
      count.value++
    }

    return {
      count,
      increase
    }
  }
}
</script>

在这里插入图片描述

在上面的例子中,我们在Vue组件的setup函数中使用ref创建了一个响应式变量count。在模板中,我们可以使用count变量并通过count.value进行访问。

二、reactive

在Vue 3中,reactive是一个用于将对象转化为响应式的函数。

使用reactive函数将一个普通的对象转化为响应式对象,从而可以追踪对象的变化并在其变化时更新依赖的地方。

使用方法如下:

  1. 首先,在Vue 3中引入reactive函数:
import { reactive } from 'vue'
  1. 创建一个普通对象:
const myObject = {
  foo: 'bar',
  baz: {
    qux: 42
  }
}
  1. 使用reactive函数将对象转化为响应式对象:
const reactiveObject = reactive(myObject)

现在reactiveObject是一个响应式对象,任何对其属性的修改都将会触发响应式更新。例如,可以通过以下方式修改属性:

reactiveObject.foo = 'baz'
reactiveObject.baz.qux = 99

当属性发生变化时,依赖于该属性的组件将会自动重新渲染。

  1. 使用reactiveObject对象的值:
console.log(reactiveObject.foo) // 输出 'baz'
console.log(reactiveObject.baz.qux) // 输出 99

通过reactive函数创建的对象,可以像普通对象一样进行访问和修改。

举例说明:

<template>
	<h2>姓名:{{person.name}}</h2>
	<h2>年龄:{{person.age}}</h2>
	<h3>工作种类:{{person.job.type}}</h3>
	<h3>工作薪水:{{person.job.salary}}</h3>
	<h3>爱好:{{person.hobby}}</h3>
	<button @click="changeInfo">修改人的信息</button>
</template>

<script>
	import {reactive} from 'vue'
	export default {
		name: 'App',
		setup(){
			//数据
			let person = reactive({
				name:'张三',
				age:18,
				job:{
					type:'前端工程师',
					salary:'30K',
				},
				hobby:['抽烟','喝酒','烫头']
			})

			//方法
			function changeInfo(){
				person.name = '李四'
				person.age = 48
				person.job.type = 'UI设计师'
				person.job.salary = '60K'
				person.hobby[0] = '学习'
			}

			//返回一个对象(常用)
			return {
				person,
				changeInfo
			}
		}
	}
</script>


在这里插入图片描述
点击修改个人信息按钮之后
在这里插入图片描述

通过响应式对象person 的属性修改,Vue会自动更新依赖该属性的地方,并重新渲染相关组件。

三、toRef、toRefs

在Vue 3中,toRef和toRefs是用来创建响应式引用的函数。

  1. toRef函数: toRef接受一个响应式对象和对象的key,并返回一个ref引用,将该key所对应的值包装成一个ref对象。如果在组件中修改了ref对象的值,也会修改源对象中的值。

    例子:

    import { reactive, toRef } from 'vue';
    
    const state = reactive({
      count: 0,
    });
    
    const countRef = toRef(state, 'count');
    console.log(countRef.value); // 输出 0
    
    countRef.value += 1;
    console.log(state.count); // 输出 1
    

    应用场景:

    • 当我们需要将响应式对象的某个属性值以ref的形式,单独拿出并使用时,可以使用toRef函数。
  2. toRefs函数: toRefs接受一个响应式对象,并返回一个包含该对象所有属性的ref对象。toRef返回的是一个ref引用的单个值,而toRefs返回一个包含了所有属性的ref对象,使得我们可以以解构的方式访问和修改属性的值。

    例子:

    import { reactive, toRefs } from 'vue';
    
    const state = reactive({
      count: 0,
      text: 'Hello',
    });
    
    const refs = toRefs(state);
    console.log(refs.count.value); // 输出 0
    console.log(refs.text.value); // 输出 'Hello'
    
    refs.count.value += 1;
    console.log(state.count); // 输出 1
    

    应用场景:

    • 在模板中循环遍历一个响应式对象时,可以使用toRefs将整个响应式对象转换为ref对象,以便在模板中访问和修改属性的值。

比如这样:

<template>
	<h2>姓名:{{name}}</h2>
	<h2>年龄:{{age}}</h2>
	<h2>薪资:{{job.j1.salary}}K</h2>
</template>

<script>
	import {reactive,toRefs} from 'vue'
	export default {
		name: 'Demo',
		setup(){
			//数据
			let person = reactive({
				name:'张三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})
			//返回一个对象(常用)
			return {
				...toRefs(person)
			}
		}
	}
</script>


需要注意的是,toRefs函数返回的是一个包含ref对象的普通对象,而不是ref对象本身。如果需要在模板中使用属性的值,需要通过.value来访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieyucx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值