你的浏览器无法正常显示内容,请更换或升级浏览器!

Vue3 组合式API高频用法与避坑指南

tenfei
tenfei
发布于2026-08-24 11:45 阅读17次
Vue3 组合式API高频用法与避坑指南
整理 Vue3 组合式 API 的高频用法和常见坑,涵盖 setup 语法、ref 与 reactive 选择、computed/watch、生命周期钩子、组合函数复用等,附代码示例和易错点分析,帮助快速上手组合式 API。
# Vue3 组合式API高频用法与避坑指南 ## 前言 Vue3 主推组合式 API,但它和 Options API 的写法差异大,新手容易踩坑。本文整理高频用法和常见错误,帮助快速掌握。 ## 1. ref 与 reactive 的选择 ```javascript import { ref, reactive } from "vue"; // ref:基本类型,或需要整体替换的对象 const count = ref(0); count.value++; // 注意 .value // reactive:对象,深层响应式 const user = reactive({ name: "张三", age: 25 }); user.age++; // 直接访问,无需 .value ``` 选择原则:基本类型用 ref,对象结构固定用 reactive,复杂逻辑抽组合函数。 ## 2. 响应式丢失的坑 ```javascript // 坑:解构 reactive 会丢失响应式 const state = reactive({ count: 0 }); const { count } = state; // count 变成普通值,不再响应式 // 正确:用 toRefs 保持响应式 import { toRefs } from "vue"; const { count } = toRefs(state); // 或者直接 state.count 访问 ``` 这是组合式 API 最常见的坑,解构 reactive 对象一定要用 toRefs。 ## 3. computed 计算属性 ```javascript import { computed } from "vue"; const price = ref(100); const count = ref(2); // 只读计算属性 const total = computed(() => price.value * count.value); // 可写计算属性 const total2 = computed({ get: () => price.value * count.value, set: (val) => { price.value = val / count.value; }, }); ``` 计算属性会缓存结果,依赖不变不重新计算。 ## 4. watch 与 watchEffect ```javascript import { watch, watchEffect } from "vue"; // watch:监听特定数据 watch(count, (newVal, oldVal) => { console.log(`count 从 ${oldVal} 变成 ${newVal}`); }); // watch 监听 reactive 对象属性 watch(() => user.age, (newVal) => { console.log(newVal); }); // watchEffect:自动追踪依赖 watchEffect(() => { console.log(`当前 total: ${total.value}`); }); ``` 区别:watch 需要显式指定监听源,watchEffect 自动追踪用到的响应式数据。 ## 5. 生命周期钩子 ```javascript import { onMounted, onUnmounted } from "vue"; onMounted(() => { console.log("组件已挂载"); timer = setInterval(() => {}, 1000); }); onUnmounted(() => { // 清理定时器,防止内存泄漏 clearInterval(timer); }); ``` 组合式 API 没有 beforeCreate/created,直接在 setup 里写逻辑即可。 ## 6. 组合函数(Composables)复用 ```javascript // useCounter.js import { ref } from "vue"; export function useCounter() { const count = ref(0); const increment = () => count.value++; const decrement = () => count.value--; return { count, increment, decrement }; } // 组件中使用 import { useCounter } from "./useCounter"; const { count, increment } = useCounter(); ``` 组合函数是组合式 API 的核心优势,把逻辑抽离复用。 ## 7. provide / inject ```javascript // 祖先组件 import { provide } from "vue"; provide("theme", "dark"); // 后代组件 import { inject } from "vue"; const theme = inject("theme", "light"); ``` 适合跨多层组件传值,避免 prop 逐层传递。 ## 常见坑总结 - 解构 reactive 用 toRefs,否则丢响应式 - ref 在 script 里访问要加 .value - 定时器、事件监听记得在 onUnmounted 清理 - watch 监听对象属性用 getter 函数 - 组合函数命名以 use 开头,便于识别 ## 小结 组合式 API 的核心:ref/reactive 管理响应式、computed/watch 处理派生和监听、组合函数复用逻辑。记住解构用 toRefs、定时器要清理这两个高频坑,就能避开大部分问题。

1

0

文章点评
Copyright © from 2021 by namoer.com
458815@qq.com QQ:458815
蜀ICP备2022020274号-2