详解Vue3中ref与reactive的用法与区别

文章详细对比了Vue2和Vue3中响应式数据处理的不同,指出Vue3使用Proxy实现响应式,而Vue2依赖defineProperty。ref适用于基本数据类型,需要通过.value访问,而reactive用于对象或数组,提供深层次响应式。两者在使用场景和访问方式上有明显区别,但底层都基于Proxy。
摘要由CSDN通过智能技术生成

详解Vue3中ref与reactive的用法与区别

Vue2.x vs Vue3.x

  • Vue2中响应式是通过defineProperty实现的
  • Vue3中响应式是通过ES6的Proxy实现的
  • Vue3中实现响应式数据的方法是ref和reactive

reactive 特点

  • reactive的参数一般是对象或者数组,他能够将复杂数据类型变为响应式数据。
  • reactive的响应式是深层次的,底层本质是将传入的数据转换为Proxy对象

使用方法

import { reactive } from 'vue'
export default {
  name: 'App',
  setup () {
    const user = reactive({
      name: 'frank',
      age: 18
    })
    const handleChange = () => {
		user.name = 'mike'
		user.age = 20
    }

    return { user, handleChange }
  }
}

Proxy vs defineProperty

reactive方法内部是利用ES6的Proxy API来实现的,这里与Vue2中的defineProperty方法有本质的区别。

  • defineProperty只能单一地监听已有属性的修改或者变化,无法检测到对象属性的新增或删除,而Proxy可以轻松实现。
  • defineProperty无法监听属性值是数组类型的变化,而Proxy可以轻松实现。

用reactive声明简单数据类型

let buttonName2 = reactive('str');

在这里插入图片描述

:可以看到,用reactive定义number变量时,vue给出了一个警告,提示这个值是不能被reactive创建的。

在这里插入图片描述
通过Vue3源码可以发现,当使用reactive定义数据时,会先进行判断定义的数据是否是对象,是对象的话才会继续进行数据响应式的处理,反之就直接被return出来了。
因此可以得出结论reactive更推荐用于对象或数组的数据类型

ref 特点

  • ref的参数一般是基本数据类型,也可以是对象类型
  • 如果参数是对象类型,其实底层的本质还是reactive,系统会自动将ref转换为reactive,例如:ref(1) ===> reactive({value:1})
  • 在模板中访问ref中的数据,系统会自动帮我们添加.value,在JS中访问ref中的数据,需要手动添加.value
  • ref的底层原理同reactive一样,都是Proxy

使用方法

<template>
	<h1>{{ name }}</h1>
	<h1>{{ age }}</h1>
</template>

<script>
import { ref} from 'vue'
export default {
  name: 'App',
  setup () {
	const name = ref('frank')
	const age = ref(18)
    const handleChange = () => {
		name.value = 'mike'
		age.value = 20
    }
    return { name, age, handleChange }
  }
}
</script>

reactive vs ref

  • reactive参数一般接受对象或数组,是深层次的响应式。
  • ref参数一般接收简单数据类型,若ref接收对象为参数,本质上会转变为reactive方法
  • 在JS中访问ref的值需要手动添加.value,访问reactive不需要
  • 响应式的底层原理都是Proxy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue3 的 `ref` 和 `reactive` 是 Vue3 用于数据管理的两种不同的响应式 API。 `ref` 用于创建一个包装简单值的响应式引用,例如一个数字、字符串或对象。当 `ref` 创建一个响应式引用时,它返回一个对象,该对象具有一个 `value` 属性,该属性指向实际值。当 `ref` 返回的对象的 `value` 属性更改时,组件将自动重新渲染。 `reactive` 用于创建一个响应式对象,该对象可以包含多个属性和嵌套属性。当使用 `reactive` 创建响应式对象时,返回的对象是一个代理对象,该对象具有与原始对象相同的属性,并且任何对代理对象属性的更改都将触发组件的重新渲染。 综上所述,如果需要对简单值进行响应式处理,则使用 `ref`,如果需要对对象或嵌套对象进行响应式处理,则使用 `reactive`。 ### 回答2: Vue 3和Vue 2相比,最明显的变化是引入了一些新的API和设计模式,其包括新引入的Ref API和Composition API,这两个API的出现对Vue的开发方式和状态管理带来了一些重要的变化。 RefReactiveVue3全新的响应式API,而Vue2的响应式数据主要是通过Observe和getter/setter来实现的。 在Vue3RefReactive主要用于处理模板和JavaScript代码的响应式数据。 Ref可以将普通JavaScript值转化为响应式数据,它不仅可以适用于基本数据类型如数字、字符串,还可以适用于对象,数组等复杂的数据类型。使用Ref API,可以像访问普通属性一样访问响应式数据,它可以让组件在渲染期间具备了反应式能力。 ReactRefVue3的Ref功能不太一样,ReactRef主要用于获取DOM节点和React元素,在React可以使用useRef函数来创建一个Ref。 而Reactive则可以将一个响应式对象转化为普通JavaScript对象,同时可以通过某些API对响应式数据进行处理,例如对响应式对象进行依赖追踪,处理响应式数据的更新等操作。 Composition API是Vue3另一个重要的变化,它重新组织了组合函数的API,使得Vue3的组件可以重用代码逻辑。Composition API也可以与RefReactive一起使用,从而提高代码的复用率和可维护性。 总的来说,Vue3的RefReactive相较于Vue2的Observe和getter/setter实现更加高效和灵活,可以方便地实现组件的数据响应式,同时也为代码的组织和重用提供了更多简单而强大的工具。 ### 回答3: Vue3的refreactive都是Vue3响应式数据的核心属性,但是它们有着不同的用途和应用场景。 ref是一种基本数据类型的包装器,可以通过调用.value属性来获取或设置它包含的值。ref在处理单一数据类型时非常有用,比如数字、字符串、布尔值等等。在Vue3ref主要用来引用DOM元素、组件的props、以及组件的本地变量,它是一个可读可写的响应式值,当它的value值发生变化时,会自动触发更新视图。 而reactive则是将一个普通的JavaScript对象转换为响应式的对象。在Vue3,它会将对象属性转换为getter和setter,并使用Proxy来实现,因此可以让你对对象的任何属性进行响应式处理。reactive在处理复杂的数据结构时非常方便,比如数组、对象等等。在Vue3reactive主要用于处理组件的复杂数据,如列表、表单、嵌套的对象等等。 refreactive的一个重要区别在于它们的更新方式不同。当ref所包含的值发生变化时,Vue3会立即通知更新视图。而当reactive的对象发生变化时,Vue3会将变化推迟到下一个事件循环处理,这样可以批量处理多个更新,从而提高性能和效率。 此外,ref还有一个特殊的用途:在模板使用。在Vue3的模板,可以使用类似于template refs的方式来引用DOM元素或组件实例。此时,ref保留了原始值,而被引用的组件实例是使用createApp返回的value。这样可以将指针传递给子组件或函数,并在需要时进行更新,从而提高组件的可重用性。 总的来说,refreactive都是Vue3非常重要的响应式数据类型,它们分别适用于不同的场景和需求。当你需要处理单一变量时,使用ref更为方便;而当你需要处理对象或数组时,使用reactive更为合适。同时,你也可以使用它们的组合方式来处理更加复杂的数据结构,从而提高Vue3应用的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值