Vue 3 响应式变量笔记

一、ref

定义:

ref 用于创建一个 基本类型对象类型的响应式引用,它会包裹一个 .value

适用场景:

  • 基础类型(如 string, number)响应式

  • 也可以用于对象,但对象值会被深度代理

示例:

import { ref } from 'vue'
​
const count = ref(0)
​
count.value++  // 需要通过 .value 访问

注意:

  • .value 是必须的,除非在模板中使用(模板中会自动解包)

  • ref 对象是不可解构的,解构会丢失响应式


二、reactive

定义:

reactive 用于将一个 对象 转换为响应式对象(深度响应式)

适用场景:

  • 管理多个字段的响应式对象(如表单、复杂结构)

示例:

import { reactive } from 'vue'
​
const state = reactive({
  count: 0,
  user: {
    name: 'Alice'
  }
})
​
state.count++

注意:

  • 不能用于基本类型,基本类型会被忽略或报错

  • 不能自动解构,解构时会丢失响应性


三、toRef

定义:

toRef 用于将响应式对象中的一个 属性单独提取ref,但仍然保持响应性连接。

适用场景:

  • 当你想把对象的某个属性传给子组件或单独处理时,保持其响应性

示例:

import { reactive, toRef } from 'vue'
​
const state = reactive({
  count: 0
})
​
const countRef = toRef(state, 'count')
countRef.value++   // 会同步更新 state.count

注意:

  • 如果原始对象属性不存在,toRef 也会创建一个响应式的引用


四、toRefs

定义:

toRefs 用于将一个响应式对象的每个属性都转换成 ref,适合解构使用。

适用场景:

  • 需要从 reactive 对象中解构多个值,又想保留响应性

示例:

import { reactive, toRefs } from 'vue'
​
const state = reactive({
  count: 0,
  name: 'Vue'
})
​
const { count, name } = toRefs(state)
count.value++

注意:

  • toRefs 仅适用于 reactive 对象,非响应式对象使用无意义


五、补充常见的响应式 API

shallowRef

用法:

只对最外层做响应式,内部对象不会被深度代理

import { shallowRef } from 'vue'
​
const obj = shallowRef({ name: 'Vue' })
obj.value.name = 'React'  // 不会触发更新

shallowReactive

用法:

类似于 reactive,但只代理第一层属性

import { shallowReactive } from 'vue'
​
const state = shallowReactive({
  user: {
    name: 'Vue'
  }
})
state.user.name = 'React'  // 不会触发响应式更新

readonly

用法:

创建一个只读的响应式对象

import { readonly } from 'vue'
​
const state = reactive({ count: 0 })
const readonlyState = readonly(state)
​
readonlyState.count++  // 报错,不能修改

isRef、isReactive、isReadonly、unref

用法:

判断响应式类型或取值

import { ref, isRef, isReactive, unref } from 'vue'
​
const a = ref(1)
console.log(isRef(a))           // true
console.log(unref(a))           // 1

总结表格

API类型支持深度响应解构支持.value访问场景描述
ref基础 & 对象不支持处理基本类型、单值引用
reactive仅对象不支持不支持管理复杂对象
toRef响应对象属性(单个)绑定单个属性为 ref
toRefs响应对象(批量)批量解构响应对象
shallowRef基础 & 对象不支持不追踪内部变更(如缓存场景)
shallowReactive对象不支持不支持第一层响应式,优化性能
readonly对象不支持不支持禁止更改响应数据
### Vue 3 重要项目事件笔记 #### 组件通信方式的变化 Vue 3 中移除了事件总线,推荐使用 `mitt` 来替代。这使得跨组件通信更加简洁高效[^1]。 ```typescript // src/utils/emitter.ts import mitt from &#39;mitt&#39;; const emitter = mitt(); export default emitter; ``` 通过上述代码创建了一个全局事件中心实例,在不同组件间可以方便地进行消息传递: - 使用 `emitter.on(eventName, callback)` 订阅特定名称的事件; - 调用 `emitter.emit(eventName[, args...])` 发布指定类型的事件给监听者处理; - 执行 `emitter.off([eventName][, handler])` 或 `emitter.all.clear()` 可取消订阅单个/全部事件。 #### 状态管理库升级 原有的 Vuex 库已被 Pinia 替代作为官方首选的状态管理模式。Pinia 提供更灵活易懂API设计以及更好的 TypeScript 支持特性。 #### v-model 的改进 `.sync` 修饰符的功能已经被整合进了增强版 `v-model` 内部逻辑里,简化了父子组件之间双向绑定的操作流程。 #### 新增 setup 函数 Composition API 是 Vue 3 推出的一项重大革新,其中核心部分就是引入了 `setup` 配置选项。它允许开发者在一个地方集中定义响应式变量、计算属性、侦听器等功能模块,从而提高代码可读性和维护性[^2]。 ```javascript <script> import { ref, computed } from &#39;vue&#39;; export default { props: [&#39;title&#39;], setup(props) { const count = ref(0); const doubleCount = computed(() => count.value * 2); return { count, increment: () => (count.value += 1), decrement: () => (count.value -= 1), doubledTitle: computed(() => `${props.title}-${doubleCount}`) }; } }; </script> ``` #### 实现防抖功能 利用自定义 Ref 和定时器机制来实现简单的防抖效果,适用于输入框自动补全等场景下减少不必要的请求次数[^4]。 ```typescript // useDebounceRef.ts import { customRef } from "vue"; function debounce<T>(initValue:T, delay:number){ let timeoutId: NodeJS.Timeout | null; return customRef((track, trigger)=>{ return{ get(){ track(); return initValue; }, set(newValue){ if(timeoutId !== null){ clearTimeout(timeoutId); } timeoutId = setTimeout(()=>{ initValue = newValue; trigger(); timeoutId = null; },delay); } } }); } export default debounce; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值