当前位置: 首页 > news >正文

【vue3.0中ref与reactive的区别及使用】

什么是ref与reactive

ref与reactive都是Vue3.0中新增的API,用于响应式数据的处理。

1. ref

ref是一个函数,可以用于将一个普通的数据类型转换成响应式数据。ref返回一个包含value属性的对象,通过修改value属性的值,可以触发组件更新。

使用方式如下:

import { ref } from 'vue'const count = ref(0)// 获取值
console.log(count.value)// 修改值
count.value++// 在模板中使用
<template><div>{{ count }}</div>
</template>

2. reactive

reactive是一个函数,用于将一个普通的对象转换成响应式数据。reactive返回一个响应式的Proxy对象,通过修改该对象的属性值,可以触发组件更新。

使用方式如下:

import { reactive } from 'vue'const state = reactive({count: 0,name: 'Tom'
})// 获取值
console.log(state.count)// 修改值
state.count++// 在模板中使用
<template><div>{{ state.count }}</div>
</template>

区别:

  1. ref只能用于将基本类型数据转换成响应式数据,而reactive可以将任意对象转换成响应式数据。

  2. ref返回一个包含value属性的对象,而reactive返回一个响应式的Proxy对象。

  3. 在使用上,ref更方便一些,使用起来更简单直观。而reactive比较灵活,可以将任意对象转换成响应式数据,并且可以进行深层次的响应式处理。

reactive() API 有一些局限性:

有限的值类型:

它只能用于对象类型 (对象、数组和如 Map、Set 这样的集合类型)。它不能持有如 string、number 或 boolean 这样的原始类型。

不能替换整个对象:

由于 Vue 的响应式跟踪是通过属性访问实现的,因此我们必须始终保持对响应式对象的相同引用。这意味着我们不能轻易地“替换”响应式对象,因为这样的话与第一个引用的响应性连接将丢失:

let state = reactive({ count: 0 })// 上面的 ({ count: 0 }) 引用将不再被追踪
// (响应性连接已丢失!)
state = reactive({ count: 1 })

对解构操作不友好:

当我们将响应式对象的原始类型属性解构为本地变量时,或者将该属性传递给函数时,我们将丢失响应性连接:

const state = reactive({ count: 0 })// 当解构时,count 已经与 state.count 断开连接
let { count } = state
// 不会影响原始的 state
count++// 该函数接收到的是一个普通的数字
// 并且无法追踪 state.count 的变化
// 我们必须传入整个对象以保持响应性
callSomeFunction(state.count)

需要注意的是,使用ref和reactive时,不能直接修改属性值的方式来更新数据,而是应该通过修改value或Proxy对象的属性来触发组件更新。例如:

// ref使用示例
const count = ref(0)
count++ // 这样是错误的,应该使用count.value++// reactive使用示例
const state = reactive({count: 0
})
state.count++ // 这样是正确的,会触发组件更新
http://www.lryc.cn/news/144782.html

相关文章:

  • 计算机竞赛 基于情感分析的网络舆情热点分析系统
  • C++ 动态分配内存|动态数组
  • React Diff算法原理
  • 查局域网所有占用IP
  • 【MySQL】引擎类型
  • springMVC之HttpMessageConverter
  • 计算机网络aaaaaaa
  • pdf.js构建时,报Cannot read property ‘createChildCompiler‘ of undefined #177的解决方法
  • Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【六】
  • idea配置注释模板
  • Unity编辑器扩展:提高效率与创造力的关键
  • Java之对象引用实践
  • IntelliJ IDEA快捷键大全 + 动图演示!
  • React 生命周期
  • 5G智能网关如何解决城市停车痛点难点
  • docker 学习-- 04 实践搭建 1(宝塔)
  • MySQL的mysql-bin.00xx binlog日志文件的清理
  • Java实现SM2前后端加解密
  • 自动化PLC工程师能否转到c#上位机开发?
  • LiveData相关基本使用及去除黏性数据的方法
  • 【MegaCli】安装MegaCli后执行报参数错误
  • 时间范围选择时选中日期所使用的当日内具体时刻 如00:00:00= 23:59:59
  • 算法面试-深度学习面试题整理(2024.8.29开始,每天下午持续更新....)
  • Maven之高版本的 lombok 和 tomcat 7 插件冲突问题
  • 微信小程序申请
  • ffmpeg 配合Fiddler抓包操作
  • 美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以?
  • 【力扣每日一题】2023.8.29 带因子的二叉树
  • origin导出pdf曲线超出边框
  • 由Android10适配到Android12时遇到相关编译失败问题