惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
P
Privacy International News Feed
P
Proofpoint News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Attack and Defense Labs
Attack and Defense Labs
NISL@THU
NISL@THU
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
GbyAI
GbyAI
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Y
Y Combinator Blog
C
CERT Recently Published Vulnerability Notes
N
Netflix TechBlog - Medium
S
Security Affairs
Spread Privacy
Spread Privacy
罗磊的独立博客
腾讯CDC
MyScale Blog
MyScale Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
L
LINUX DO - 热门话题
The Cloudflare Blog
L
LangChain Blog
博客园_首页
H
Hacker News: Front Page
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
SecWiki News
SecWiki News
A
Arctic Wolf
爱范儿
爱范儿
Google Online Security Blog
Google Online Security Blog
T
Threat Research - Cisco Blogs
Hacker News - Newest:
Hacker News - Newest: "LLM"
有赞技术团队
有赞技术团队
The GitHub Blog
The GitHub Blog
Cyberwarzone
Cyberwarzone
博客园 - 叶小钗
V
Visual Studio Blog
V
V2EX
T
Tailwind CSS Blog
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
D
Docker

博客园 - 一名程序媛呀

Anki插件开发必知必会:钩子函数与右键菜单定制 httpx 传参总报错?这次把 GET、POST、文件上传到响应处理的坑给你一次填平 从卡顿到丝滑:FastAPI 调用外部 API 的正确姿势(httpx 实战) 还在 XHR、Fetch 和 Axios 之间纠结?我踩过的坑,希望你一个都不用碰到 你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南 Uvicorn、Gunicorn 傻傻分不清?FastAPI 生产部署避坑指南 Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招! 刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API 别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了 掏出手机就能搭个 WebDAV 同步服务器?这操作有点香 别只盯着GitBook了!这个文档神器让你的笔记秒变网站 写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了 FastAPI 身份验证总踩坑?这份 FastAPI Users “避坑指南”请收好 旧手机别扔!用 Termux 搭个私人云盘,比网盘香多了 你的FastAPI又在服务器上“跑不起来”了?来,今天咱把打包这件事彻底聊透 写页面时别再把 Element Plus 整个搬进来啦!Vue3按需加载的坑我帮你踩平了 前端包管理咋选?我从npm叛逃到pnpm的血泪史(附避坑指南) 聊聊 fetch 使用中我踩过的那些坑和正确打开方式 FastApiAdmin 后端接口开发好了,前端管理界面怎么调用与显示? 给 FastApiAdmin 加个“会议纪要”模块,我把后端二次开发的坑踩了个遍 我用了FastApiAdmin后,连夜把踩过的坑都整理出来了 告别 Typora 后的新欢:我把所有笔记迁移到了 Obsidian 这个“第二大脑” 你的Agent API还在裸奔?从认证到沙箱,我用FastAPI搭了几道防线 让 FastAPI Agent 思考不阻塞:手把手教你实现异步任务与后台处理方案 让FastAPI Agent真正记住你:聊聊会话记忆与持久化存储的落地实践 FastAPI Agent 函数调用实战:我让 AI 学会了“自己动手查天气“ 初探:用 FastAPI 搭建你的第一个 AI Agent 接口 FastAPI 少有人提的实用技巧:把 Depends 依赖提到路由层,代码少写60% FastAPI 生产环境静态文件完全指南:从 /favicon.ico 404 到 HSTS 混合内容,一次全根治 用了loguru我才明白,Python日志还能这么写 FastAPI 后台任务:BackgroundTasks 的使用场景与注意事项 FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚 FastAPI 文件上传避坑全指南:分块存盘、类型校验与安全兜底 FastAPI + Pydantic 模型终极实战手册:从能跑就行到固若金汤,这些技巧你一定用得上 FastAPI + SQLAlchemy 2.0 通用CRUD操作手册 —— 从同步到异步,一次讲透 FastAPI订单防超卖实战:从数据库锁到Saga分布式事务,这一篇给你理清了 FastAPI 生产环境避坑指南:用 Alembic 管理数据库迁移,别再手动改表结构了! FastAPI服务半夜又挂了?先别急着重启,查查你的数据库连接池“池子”是不是漏了 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 我用fastapi-scaff搭了个项目,两天工期缩到两小时,老板以为我开挂了 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! FastAPI自动生成的API文档太丑?我花了一晚上把它改成了客户愿意付费的样子 告别手写 API 胶水代码:FastAPI 与 Vue 的“契约自动机” OpenAPI 实战 FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南” FastAPI + Celery 实战:异步任务里调用 Redis 和数据库的全解析,及生产级组织方案 FastAPI里玩转Redis和数据库的正确姿势,别让异步任务把你坑哭了! FastAPI + Celery 实战:异步任务的坑与解法,我帮你踩了一遍 FastAPI子应用挂载:别再让root_path坑你一夜 FastAPI项目半夜报警吵醒你?聊聊告警这事儿怎么搞! 别再数据线了!用FastAPI 5分钟搭个局域网文件+剪贴板神器 FastAPI单元测试实战:别等上线被喷才后悔,TestClient用对了真香! FastAPI状态共享秘籍:别再让中间件、依赖和路由“各自为政”了! FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了! 从0到1,FastAPI + PostgreSQL + Tortoise ORM 实战避坑指南 FastAPI + PostgreSQL 实战:给应用装上“缓存”和“日志”翅膀 FastAPI + PostgreSQL 实战:从入门到不踩坑,一次讲透
Vue 3 组合式 API 香是香,但从Vue2迁移时你可别像我当初一样踩进这 3 个深坑里
一名程序媛呀 · 2026-04-15 · via 博客园 - 一名程序媛呀

是不是听说 Vue 3 组合式 API(Composition API)更好用了,逻辑复用好到飞起,Tree Shaking 瘦身效果一流,于是摩拳擦掌想把那个跑了两年的 Vue 2 老项目给升了?

打住!先听我讲个灵异事件。我之前把一个后台管理项目从选项式(Options API)往组合式硬切的时候,页面点着点着按钮不响应了,控制台一片寂静,我还以为我电脑坏了。最后查了俩小时——数据没加 .value

如果你不想经历这种“看着代码都对,跑起来全废”的绝望时刻,这篇文章就是为你准备的。咱们不念经,专门聊聊怎么带着老思维丝滑上车,以及我跪过的那些坑。

🎯 核心摘要:这 1200 字能帮你干点啥?

- 搞清楚组合式 API 和选项式 API 到底是不是“敌对关系”。

- 掌握一种渐进式迁移的偷懒大法,不用把旧代码全删了重写。

- 避开 3 个从 Vue 2 切过来最容易翻车的语法陷阱。

- 理解为什么官方非要搞出这套“新玩具”。

📖 第一部分:到底是升级还是折腾?

首先得给组合式 API 正个名。很多人觉得 Vue 3 是把 Vue 2 推翻了重来,其实不是。

你可以把选项式 API 想象成去餐厅吃套餐( data 是前菜,methods 是主菜,mounted 是甜点),虽然菜都给你配好了,但你要是想把隔壁桌的牛排和这边的沙拉混一起,得端着盘子跑来跑去(mixins 命名冲突、来源不明)。

组合式 API 呢?就像吃自助餐。你想拿什么拿什么,把拿来的东西全堆在一个大盘子里(setup 函数),一目了然。尤其是逻辑复用,以前 mixins 的痛,现在就是一个函数的事儿。

⚙️ 第二部分:核心原理,说人话版

好,咱们先来理解最核心的那层窗户纸。

选项式 API 是通过 this 上下文来访问数据的,这大家都熟。但组合式 API 没了 this,它靠的是闭包和响应式引用

接下来重点来了,这也是我当初脑子转不过弯的地方:

ref 就像是给数据包了一层“带响应的壳”。

script 里你必须用 变量名.value 去戳它一下,它才搭理你;但在 template 模板里,Vue 偷偷帮你脱掉了这层壳,直接写变量名就行。

是不是以为这样就完了?

你可能会问:“那我以前的 data 里那么多对象,全改成 ref 不得累死?” 这时候就该 reactive 登场了。
它专门用来包对象,不用 .value,跟 Vue 2 的 data 手感最像。但注意,别对它解构,一解构响应性就飞了,这点后面会说。

💻 第三部分:实战演示与迁移偷懒指南

别一上来就想着把整个文件改成 setup 语法糖。官方给了个超级平滑的过渡方案,老项目里直接这么写:

<script>
import { ref } from 'vue';
export default {
  // 你以前所有的 options 照写不误!data, methods, mounted 都留着
  data() {
    return { oldMsg: '我是老员工' };
  },
  // 直接在这里加一个 setup 函数,新逻辑写这里
  setup() {
    const newMsg = ref('我是新来的');
    // 这里千万别学我当初偷懒,忘记 return 出去,模板里死活找不到变量
    return { newMsg };
  },
  mounted() {
    // 在选项式 API 里也能直接访问组合式暴露出来的变量!
    console.log(this.newMsg); 
  }
};
</script>

看到了吗?你根本不用重构整个文件!新功能用组合式写,老功能保持原样。setup 里返回的东西会全自动混入 this,这招“新旧同居”简直是我等打工人的救星。

再说个容易翻车的点:在组合式里发请求替代 mounted。

以前我们都在 mounted 里写,现在没了 created/mounted 傻傻分不清的烦恼。在 setup 里直接写就行,它本身就介于 beforeCreate 和 created 之间。

但如果你非要等 DOM 挂载完,记得用 onMounted 钩子引入一下,别直接裸写。

⚠️ 第四部分:3 个让我加班到深夜的深坑

1. 解构 reactive 导致的“僵尸数据”

这个坑是我想把一个 reactive 对象里的 price 拿出来单独算折扣时踩的。

const state = reactive({ count: 0 });
const { count } = state; // ❌ 这么干 count 就变成普通数字 0 了,再也响应不了

解决方案:要么用 toRefs 把属性转成 ref,要么干脆用 ref 定义基本类型。

工具的选择好比选螺丝刀,不是最贵的就好,而是看你要拧十字还是一字。

2. Watch 监听 reactive 对象属性

你要监听 reactive 对象里的某个值,不能直接写属性名,得用一个 getter 函数包起来。

watch(() => state.count, (newVal) => { ... }) // ✅ 这才是对的

官方文档虽然这么说,但根据以往的经验,调整成这种函数形式传参会更稳,不会出现页面更新了但 watch 没反应的情况。

3. 忘记 .value 的灵魂暴击

用了 ref 之后,在 JS 里操作一定加 .value

我现在已经形成肌肉记忆了,只要控制台报错说 xxx is not a function 或者没反应,第一反应就是查是不是落了 .value

💡 总结与互动邀请

总结一下,组合式 API 真的挺好,特别是配合 TypeScript 和 Pinia 的时候,代码逻辑清晰得像看流程图。

别怕改变,也别急着推翻重来。先用我上面说的“新旧同居”模式慢慢切,遇到坑了回过头看看是不是我提到的这三个问题。

最后啰嗦一句:Vue 3 社区生态已经很成熟了,今年再不学,明年简历上写“精通 Vue”自己心里都得打个颤。

- 好了,茶水喝完,坑也帮你蹚平了 -

如果觉得有用,赶紧点个 收藏关注,下次切 Vue 3 的时候翻出来对照着改,省得加班掉头发!

👇 评论区说说,你在切 Vue 3 时遇到的第一个报错是啥?