JavaScript 开发者快速上手 Vue 3 教程
JavaScript 开发者快速上手 Vue 3 教程基于 Vue 官方当前文档Vue 3 推荐使用单文件组件 SFC、script setup和Composition API。项目脚手架推荐使用create-vue它基于 Vite。参考文档Vue Quick StartVue Single-File ComponentsVue Composition API FAQ1. 你应该怎么理解 Vue如果你熟悉 JavaScript可以把 Vue 理解成HTML 模板 响应式状态 组件化 自动 DOM 更新你不再手动写document.querySelector(#count).textContentcount而是写script setup import { ref } from vue const count ref(0) /script template button clickcount Count: {{ count }} /button /template当count变化时Vue 自动更新页面。2. 创建 Vue 项目官方推荐脚手架npmcreate vuelatest然后按提示选择Project name: my-vue-app Add TypeScript? 建议先选 No熟悉后再用 Add JSX? No Add Vue Router? Yes做 SPA 建议选 Add Pinia? Yes做中大型项目建议选 Add Vitest? 可选 Add ESLint? Yes Add Prettier? Yes进入项目cdmy-vue-appnpminstallnpmrun dev典型目录src/ main.js App.vue components/ views/ router/ stores/3. Vue 单文件组件.vueVue 最常见的组件格式是 SFCSingle-File Componentscript setup const title Hello Vue /script template h1{{ title }}/h1 /template style scoped h1 { color: #42b883; } /style一个.vue文件通常分三块script setup 写 JS 逻辑 template 写 HTML 结构 style scoped 写当前组件样式scoped表示样式只影响当前组件。4.ref最常用的响应式状态script setup import { ref } from vue const count ref(0) function increment() { count.value } /script template button clickincrement {{ count }} /button /template注意count.value在script setup里访问ref要用.value。但在模板里不用{{ count }}Vue 会自动解包。5.reactive对象响应式script setup import { reactive } from vue const user reactive({ name: Alice, age: 18 }) function grow() { user.age } /script template p{{ user.name }} - {{ user.age }}/p button clickgrowGrow/button /template简单选择基本类型ref 对象/嵌套对象reactive 或 ref({ ... })实际项目里ref更通用很多团队会优先用ref。6. 模板语法文本插值p{{ message }}/p动态属性img :srcimageUrl :alttitle /:src是v-bind:src的简写。条件渲染p v-ifisLoggedIn欢迎回来/p p v-else请登录/p列表渲染ul li v-fortodo in todos :keytodo.id {{ todo.text }} /li /ul一定要写:key。事件绑定button clicksave保存/buttonclick是v-on:click的简写。7. 表单绑定v-modelscript setup import { ref } from vue const username ref() /script template input v-modelusername / p你输入的是{{ username }}/p /template相当于自动处理value input 事件常见用法input v-modeltext / textarea v-modelcontent / input typecheckbox v-modelchecked / select v-modelselected.../select8.computed派生状态如果一个值可以从现有状态计算出来用computed。script setup import { ref, computed } from vue const firstName ref(Ada) const lastName ref(Lovelace) const fullName computed(() { return ${firstName.value} ${lastName.value} }) /script template p{{ fullName }}/p /template不要这样写p{{ firstName lastName }}/p简单可以但复杂逻辑应该放进computed。9.watch监听变化执行副作用computed用于算值watch用于做事。例如搜索框防抖、请求接口、本地存储同步。script setup import { ref, watch } from vue const keyword ref() watch(keyword, (newValue, oldValue) { console.log(搜索关键词变化, oldValue, , newValue) }) /script template input v-modelkeyword / /template监听多个值watch([page,keyword],([newPage,newKeyword]){fetchData(newPage,newKeyword)})10. 生命周期最常用的是onMounted。script setup import { ref, onMounted } from vue const users ref([]) onMounted(async () { const res await fetch(/api/users) users.value await res.json() }) /script常见生命周期onMounted 组件挂载后 onUpdated DOM 更新后 onUnmounted 组件卸载后如果你熟悉 ReactonMounted ≈ useEffect(() {}, []) onUnmounted ≈ useEffect 的 cleanup computed ≈ useMemo 的一部分场景 ref/reactive ≈ useState 但自动响应式11. 组件拆分父组件script setup import UserCard from ./components/UserCard.vue const user { id: 1, name: Alice, role: Admin } /script template UserCard :useruser / /template子组件UserCard.vuescript setup defineProps({ user: { type: Object, required: true } }) /script template article h2{{ user.name }}/h2 p{{ user.role }}/p /article /templatedefineProps在script setup中不需要 import。12. 子组件向父组件通信emit子组件script setup const emit defineEmits([delete]) function handleDelete() { emit(delete) } /script template button clickhandleDelete删除/button /template父组件UserCard deleteremoveUser /带参数emit(delete,user.id)父组件接收UserCard deleteremoveUser /functionremoveUser(id){console.log(id)}13. 一个完整小例子Todo ListApp.vuescript setup import { ref, computed } from vue const newTodo ref() const todos ref([ { id: 1, text: 学习 Vue 模板语法, done: true }, { id: 2, text: 学习组件通信, done: false } ]) const unfinishedCount computed(() { return todos.value.filter(todo !todo.done).length }) function addTodo() { const text newTodo.value.trim() if (!text) return todos.value.push({ id: Date.now(), text, done: false }) newTodo.value } function removeTodo(id) { todos.value todos.value.filter(todo todo.id ! id) } /script template main h1Todo List/h1 form submit.preventaddTodo input v-modelnewTodo placeholder输入任务 / button typesubmit添加/button /form p未完成{{ unfinishedCount }}/p ul li v-fortodo in todos :keytodo.id label input typecheckbox v-modeltodo.done / span :class{ done: todo.done } {{ todo.text }} /span /label button clickremoveTodo(todo.id) 删除 /button /li /ul /main /template style scoped .done { text-decoration: line-through; color: #888; } /style这里覆盖了ref computed v-model v-for :key click submit.prevent 动态 class 数组更新14. Vue Router页面路由如果创建项目时选择了 Router会有src/router/index.js src/views/基本配置import{createRouter,createWebHistory}fromvue-routerimportHomeViewfrom../views/HomeView.vueimportAboutViewfrom../views/AboutView.vueconstroutercreateRouter({history:createWebHistory(import.meta.env.BASE_URL),routes:[{path:/,name:home,component:HomeView},{path:/about,name:about,component:AboutView}]})exportdefaultrouter入口main.jsimport{createApp}fromvueimportAppfrom./App.vueimportrouterfrom./routercreateApp(App).use(router).mount(#app)页面出口RouterView /导航RouterLink to/首页/RouterLink RouterLink to/about关于/RouterLink编程式跳转script setup import { useRouter } from vue-router const router useRouter() function goHome() { router.push(/) } /script15. Pinia状态管理如果多个组件共享状态用 Pinia。src/stores/counter.jsimport{defineStore}frompiniaimport{ref,computed}fromvueexportconstuseCounterStoredefineStore(counter,(){constcountref(0)constdoubleCountcomputed(()count.value*2)functionincrement(){count.value}return{count,doubleCount,increment}})组件里使用script setup import { useCounterStore } from /stores/counter const counter useCounterStore() /script template p{{ counter.count }}/p p{{ counter.doubleCount }}/p button clickcounter.increment 1 /button /template什么时候用 Pinia多个页面共享用户信息 购物车 权限信息 主题设置 复杂筛选条件 需要跨组件复用的业务状态什么时候不用只在一个组件内部使用的状态 父子组件之间简单传值16. Vue 和 React / 原生 JS 的思维差异你不要再频繁操作 DOM少写document.querySelector(.modal).classList.add(open)多写script setup import { ref } from vue const isOpen ref(false) /script template Modal v-ifisOpen / /template状态决定 UI。模板不是字符串拼接不要这样list.innerHTMLtodos.map(...).join()Vue 里这样li v-fortodo in todos :keytodo.id {{ todo.text }} /li数据流一般是单向的父组件 - props - 子组件 子组件 - emit - 父组件 共享状态 - Pinia不要让子组件直接修改父组件对象除非你明确知道这样做的影响。17. 常用指令速查p v-ifvisible显示/p p v-else否则显示/p li v-foritem in list :keyitem.id {{ item.name }} /li input v-modelname / button clicksubmit提交/button img :srcurl / div :class{ active: isActive }/div form submit.preventsubmit/form常见缩写v-bind:src - :src v-on:click - click18. 常见修饰符事件修饰符form submit.preventsubmit阻止默认提交。button click.stophandleClick阻止事件冒泡。键盘修饰符input keyup.entersubmit /v-model 修饰符input v-model.trimname / input v-model.numberage /19. 推荐学习路径第 1 天基础语法掌握create-vue .vue 文件结构 ref 模板插值 click v-if v-for v-model练习做一个 Todo List。第 2 天组件化掌握props emit slot 组件拆分 父子通信练习把 Todo List 拆成App.vue TodoInput.vue TodoList.vue TodoItem.vue第 3 天副作用和请求掌握onMounted watch computed fetch/axios loading/error 状态练习做一个用户列表页面支持搜索和加载状态。第 4 天路由掌握Vue Router RouterLink RouterView 动态路由 编程式跳转练习做一个三页应用首页 用户列表 用户详情第 5 天状态管理掌握Pinia store 共享状态 持久化练习做登录状态或购物车状态。20. 一个小型项目结构建议src/ assets/ components/ AppHeader.vue AppButton.vue views/ HomeView.vue UserListView.vue UserDetailView.vue router/ index.js stores/ user.js services/ userService.js App.vue main.jsservices/userService.jsexportasyncfunctionfetchUsers(){constresawaitfetch(/api/users)if(!res.ok){thrownewError(Failed to fetch users)}returnres.json()}组件中script setup import { ref, onMounted } from vue import { fetchUsers } from /services/userService const users ref([]) const loading ref(false) const error ref(null) onMounted(async () { loading.value true try { users.value await fetchUsers() } catch (err) { error.value err } finally { loading.value false } }) /script21. 最容易踩的坑1. 在 JS 里忘记.value错误count正确count.value2.v-for不写key错误li v-foritem in list正确li v-foritem in list :keyitem.id3. 过度使用watch如果你只是要计算一个值用computed。consttotalcomputed(()price.value*count.value)不要用watch手动同步。4. 子组件直接改 props不推荐props.user.nameBob推荐emit(update-user,newUser)或者把共享状态放到 Pinia。5. 把所有状态都放 PiniaPinia 不是全局变量垃圾桶。局部状态放组件里共享状态才放 store。22. 你可以按这个顺序写第一个 Vue 项目目标用户管理小应用。功能用户列表 新增用户 删除用户 搜索用户 用户详情页 全局登录用户状态涉及知识点组件 props emit ref computed watch Router Pinia API 请求推荐文件src/ views/ UserListView.vue UserDetailView.vue components/ UserForm.vue UserTable.vue stores/ auth.js services/ userService.js23. 总结你熟悉 JavaScript上手 Vue 的关键不是语法难度而是转变思路用状态描述 UI 用组件拆分页面 用 props/emit 处理父子通信 用 computed 表达派生数据 用 watch 处理副作用 用 Router 管页面 用 Pinia 管共享状态最快路线npmcreate vuelatest然后从一个 Todo List 开始把它逐步拆成组件再加路由和 Pinia。这样学 Vue 会比单纯看语法快很多。

相关新闻

主流前端技术分层选型

主流前端技术分层选型

一、当下企业主流前端技术分层选型&#xff08;分3套主流方案&#xff09; 方案1&#xff1a;Vue3 TypeScript 核心栈 框架&#xff1a;Vue3&#xff08;组合式API <script setup>&#xff09;语言&#xff1a;TypeScript&#xff08;强制类型&#xff0c;团队项目标配…

2026/10/27 12:33:24 阅读更多 →
能生成 word 文档的千问结合 AI 导出鸭,实现智能解析、精准排版与高效导出,全面提升文档处理效率

能生成 word 文档的千问结合 AI 导出鸭,实现智能解析、精准排版与高效导出,全面提升文档处理效率

能生成word文档的千问搭配AI 导出鸭&#xff0c;格式更规整导出更稳定&#xff0c;一站式搞定文档排版与导出需求 能生成word文档的千问格式易乱&#xff0c;AI 导出鸭智能优化版式&#xff0c;让千问内容导出Word更省心好用 能生成word文档的千问结合AI 导出鸭&#xff0c;实现…

2026/10/27 12:51:42 阅读更多 →
1394总线技术深度解析:从对等网络到工业视觉的坚守

1394总线技术深度解析:从对等网络到工业视觉的坚守

1. 项目概述&#xff1a;为什么我们今天还要聊1394&#xff1f;提起1394总线&#xff0c;很多年轻一代的工程师可能会觉得陌生&#xff0c;甚至有些老鸟也会觉得这已经是“上古时代”的产物了。确实&#xff0c;在USB 2.0、USB 3.0乃至雷电接口大行其道的今天&#xff0c;这个曾…

2026/10/27 1:28:56 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →