文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

详解vue3中ref和reactive用法和区别

2023-08-30 11:02

关注

refreactiveVue3中用来实现数据响应式的API,一般情况下,ref定义基本数据类型,reactive定义引用数据类型。

2.1 ref

基础用法

<template><h1>{{ name }}</h1>  <button @click="changeName">修改名称</button></template><script setup>import { ref} from 'vue'const name = ref('张三')const changeName = () => {name.value = '李四'age.value = 20}</script>

2.2 reactive

基础用法

<template><Child:current="pageConfig.pageNum"></Child></template><script setup>import { reactive} from 'vue'const queryParams= reactive({pageNum: 1,pageSize: 10})  const onChange = () => {queryParams.pageNum = 2;queryParams.pageSize = 20;}</script>

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

const str = reactive('字符串')

在这里插入图片描述

3.1 ref定义数组

<template><Table :data="tableData"></Table></template><script setup>import { ref, reactive, onMounted } from 'vue'import { getTableDataApi } from '@/api'const queryParams= reactive({pageNum: 1,pageSize: 10})  const tableData = ref([]) onMounted(() => {getTableData()})const getTableData = async () => {const { data } = await getTableDataApi(queryParams) // 模拟接口获取表格数据tableData.value = data }</script>

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

3.1 reactive定义数组

<template><Table :data="tableData"></Table></template><script setup>import { ref, reactive, onMounted } from 'vue'import { getTableDataApi } from '@/api'const queryParams= reactive({pageNum: 1,pageSize: 10})  const tableData = reactive([]) onMounted(() => {getTableData()})const getTableData = async () => {const { data } = await getTableDataApi(queryParams) // 模拟接口获取表格数据tableData= data }</script>

需要注意的是,reactive定义的数组使用 tableData = data 的修改方式会造成 tableData 响应式丢失。

解决方法如下:

// 方法一:改为 ref 定义const tableData = ref([])const getTableData = async () => {const { data } = await getTableDataApi(queryParams)tableData.value = data // 使用.value重新赋值}// 方法二:使用 push 方法const tableData = reactive([])const getTableData = async () => {const { data } = await getTableDataApi(queryParams)tableData.push(...data) // 先使用...将data解构,再使用push方法}// 方法三:定义时数组外层嵌套一个对象const tableData = reactive({ list:[] })const getTableData = async () => {const { data } = await getTableDataApi(queryParams)tableData.list = data // 通过访问list属性重新赋值}
  1. ref用于定义基本类型和引用类型,reactive仅用于定义引用类型;
  2. reactive只能用于定义引用数据类型的原因在于内部是通过ES6的Proxy实现响应式的,而Proxy不适用于基本数据类型;
  3. ref定义对象时,底层会通过reactive转换成具有深层次的响应式对象,所以ref本质上是reactive的再封装;
  4. 在JS中我们如果去对数据进行操作,在ref定义的数据中,使用变量.value;访问reactive不需要;
  5. 在定义数组时,建议使用ref,从而可避免reactive定义时值修改导致的响应式丢失问题。

来源地址:https://blog.csdn.net/DZQ1223/article/details/132448112

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯