简单谈谈Vue3中的ref和reactive

 更新时间:2023年04月15日 14:11:22   作者:前端小七  
vue3中实现响应式数据的方法是就是使用ref和reactive,所谓响应式就是界面和数据同步,能实现实时更新,下面这篇文章主要给大家介绍了关于Vue3中ref和reactive的相关资料,需要的朋友可以参考下

一、是什么?

ref和reactive是Vue3中用来实现数据响应式的API

一般情况下,ref定义基本数据类型,reactive定义引用数据类型

(我喜欢用它来定义对象,不用它定义数组,原因后面讲)

我理解的ref本质上是reactive的再封装

二、先聊reactive

reactive定义引用数据类型(以对象和数组举例),它能够将复杂数据类型的内部属性或者数据项声明为响应式数据,所以reactive的响应式是深层次的,其底层是通过ES6的Proxy来实现数据响应式,相对于Vue2的Object.defineProperty,具有能监听增删操作,能监听对象属性的变化等优点

使用reactive定义对象数据类型举例

const paginationConfig = reactive({
	pageNum: 1,
	pageSize: 10
}) // 定义

const onChange = () => {
	paginationConfig.pageNum = 2 // js使用
	paginationConfig.pageSize = 20 // js使用
}
<!-- Vue3模板引用使用 -->
<a-pagination v-model:current="paginationConfig.pageNum"></a-pagination>

若用reactive定义基本数据类型,Vue3会报警告错误,如图

const str = reactive('我是字符串')

控制台报错

源码解析

分析Vue3源码可知,使用reactive定义响应式数据时,若数据不是对象类型直接就返回了,就不会进行后续的数据响应式处理了,这也就是我只用reactive定义对象型响应式数据的原因,那数组类型数据怎么办呢?答案在下文中可以找到

三、再聊ref

为什么我会理解成ref是reactive的再封装,因为在ref的底层源码里最终还是reactive()来实现的

由源码分析得知,如果是对象类型,底层走的还是reactive()的逻辑,另外我们知道,使用ref定义基本数据类型时,在脚本里使用时,需要加.value后缀,然而在模板里不需要,这是因为Vue3会自动帮你加上,这就使得ref相比reactive更加简单

let num = ref(0) // 定义
let isShow = ref(false)  // 定义

const onChange = () => {
	num.value++  // js使用
	isShow.value = true  // js使用
}
<!-- Vue3模板引用使用 -->
<a-modal v-model:visible="isShow"></a-modal>

四、ref和reactive定义数组对比

使用ref定义数组举例如下

const tableData = ref([]) // 定义

const getTableData = async () => {
	const { data } = await getTableDataApi() // 模拟接口获取表格数据
	tableData.value = data // 修改
}
<!-- Vue3模板引用使用 -->
<a-table v-model:dataSource="tableData"></a-table>

图中以我们常用的表格数据举例,可以看到,ref定义数组与定义基本数据类型没什么差别,接下来看看reactive

const tableData = reactive([]) // 定义

const getTableData = async () => {
	const { data } = await getTableDataApi() // 模拟接口获取表格数据
	tableData = data // 修改,错误示例,这样赋值会使tableData失去响应式
}
<!-- Vue3模板引用使用 -->
<a-table v-model:dataSource="tableData"></a-table>

需要注意的是,使用 tableData = data 的修改方式会造成 tableData 响应式丢失,解决方法如下(供参考)

// 方法一:改为 ref 定义
const tableData = ref([])
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.value = data // 使用.value重新赋值
}
// 方法二:使用 push 方法
const tableData = reactive([])
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.push(...data) // 先使用...将data解构,再使用push方法
}
// 方法三:定义时数组外层嵌套一个对象
const tableData = reactive({ list:[] })
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.list = data // 通过访问list属性重新赋值
}
// 方法四:赋值前再包一层 reactive
const tableData = reactive([])
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData = reactive(data) // 赋值前再包一层reactive
}

五、对比总结

  1. ref用于定义基本类型和引用类型,reactive仅用于定义引用类型
  2. reactive只能用于定义引用数据类型的原因在于内部是通过ES6的Proxy实现响应式的,而Proxy不适用于基本数据类型
  3. ref定义对象时,底层会通过reactive转换成具有深层次的响应式对象,所以ref本质上是reactive的再封装
  4. 在脚本里使用ref定义的数据时,记得加.value后缀
  5. 在定义数组时,建议使用ref,从而可避免reactive定义时值修改导致的响应式丢失问题

总结

到此这篇关于简单谈谈Vue3中ref和reactive的文章就介绍到这了,更多相关Vue3中ref和reactive内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 移动端调试神器vConsole使用详解

    移动端调试神器vConsole使用详解

    vConsole 是框架无关的,可以在 Vue、React 或其他任何框架中使用,今天通过本文给大家介绍移动端调试神器vConsole使用,感兴趣的朋友一起看看吧
    2022-04-04
  • vue日志之如何用select选中默认值

    vue日志之如何用select选中默认值

    这篇文章主要介绍了vue日志之如何select选中默认值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue利用vant组件实现轮播图效果

    vue利用vant组件实现轮播图效果

    vant组件适用于移动端项目,目前项目开源,是市面上做的比较好的开源项目,功能比较强大,本文小编就来为大家介绍一下如何利用vant实现轮播图效果吧
    2023-10-10
  • vue 中基于html5 drag drap的拖放效果案例分析

    vue 中基于html5 drag drap的拖放效果案例分析

    本文通过三个案例给大家介绍了vue 中基于html5 drag drap的拖放效果 ,需要的朋友可以参考下
    2018-11-11
  • Vue封装全局toast组件的完整实例

    Vue封装全局toast组件的完整实例

    组件(Component)是 Vue.js 最强大的功能之一,组件可以扩展 HTML 元素,封装可重用的代码,这篇文章主要给大家介绍了关于Vue封装全局toast组件,需要的朋友可以参考下
    2021-07-07
  • Vue-CLI3.x 设置反向代理的方法

    Vue-CLI3.x 设置反向代理的方法

    这篇文章主要介绍了Vue-CLI3.x 设置反向代理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • vue2中seo时使用vue-meta-info的方法

    vue2中seo时使用vue-meta-info的方法

    这篇文章主要介绍了vue2中seo时使用vue-meta-info,本文通过实例代码给大家详细讲解,文末给大家补充介绍了vue seo管理 vue-meta-info 动态设置meta和title的相关知识,需要的朋友可以参考下
    2022-10-10
  • vue2.0 路由模式mode=

    vue2.0 路由模式mode="history"的作用

    这篇文章主要介绍了vue2.0 路由模式mode="history"的作用,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-10-10
  • vue element-ui实现el-table表格多选以及回显方式

    vue element-ui实现el-table表格多选以及回显方式

    这篇文章主要介绍了vue element-ui实现el-table表格多选以及回显方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • vue中使用elementUI组件手动上传图片功能

    vue中使用elementUI组件手动上传图片功能

    Vue是一套构建用户界面的框架, 开发只需要关注视图层, 它不仅易于上手,还便于与第三方库或既有项目的整合。这篇文章主要介绍了vue中使用elementUI组件手动上传图片,需要的朋友可以参考下
    2019-12-12

最新评论