news 2026/8/14 16:26:48

Vue 3 学习笔记:从入门到核心概念

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 3 学习笔记:从入门到核心概念

一、Vue 3 简介与优势

Vue 3 是 Vue.js 框架的重大版本更新,于 2020 年 9 月正式发布。它带来了全新的Composition API、更好的 TypeScript 支持、更小的打包体积以及更高的性能。

主要优势:

  • Composition API:提供更灵活的逻辑复用方式,解决了 Options API 在复杂组件中逻辑分散的问题。
  • 性能提升:基于 Proxy 的响应式系统,初始渲染和更新速度更快,内存占用更少。
  • 更好的 TypeScript 支持:源码使用 TypeScript 重写,提供完整的类型定义。
  • 更小的体积:通过 Tree-shaking 优化,核心库体积减少约 40%。
  • 新的内置组件:如<Teleport><Suspense>等。

二、快速开始:创建 Vue 3 项目

推荐使用 Vite 创建 Vue 3 项目,速度更快,配置更简单。

# 使用 npm npm create vue@latest 或使用 yarn yarn create vue 根据提示选择项目配置(TypeScript、Router、Pinia 等)

项目创建完成后,进入项目目录并安装依赖:

cd your-project-name npm install npm run dev

三、核心概念:Composition API 与响应式

1. 响应式基础:ref 与 reactive

Vue 3 使用refreactive创建响应式数据。

<script setup> import { ref, reactive } from 'vue' // ref 用于基本类型(也可用于对象) const count = ref(0) const user = ref({ name: 'John' }) // reactive 用于对象 const state = reactive({ message: 'Hello Vue 3', list: [1, 2, 3] }) // 访问 ref 的值需要使用 .value console.log(count.value) // 0 count.value++ // reactive 对象直接访问 console.log(state.message) // 'Hello Vue 3' </script>

2. 计算属性与侦听器

<script setup> import { ref, computed, watch } from 'vue' const firstName = ref('张') const lastName = ref('三') // 计算属性 const fullName = computed(() => { return firstName.value + lastName.value }) // 侦听器 watch(fullName, (newValue, oldValue) => { console.log(全名从 ${oldValue} 变为 ${newValue}) }) // 立即执行的侦听器 watch(fullName, (newValue) => { console.log(当前全名:${newValue}) }, { immediate: true }) </script>

四、组件开发与通信

1. 组件定义与使用

<!-- ChildComponent.vue --> <template> <div> <h3>子组件</h3> <p>接收的消息:{{ message }}</p> <button @click="emitEvent">触发事件</button> </div> </template> <script setup> // defineProps 和 defineEmits 是编译器宏,无需导入 const props = defineProps({ message: { type: String, default: '默认消息' } }) const emit = defineEmits(['custom-event']) const emitEvent = () => { emit('custom-event', '来自子组件的数据') } </script>
<!-- ParentComponent.vue --> <template> <div> <h2>父组件</h2> <ChildComponent :message="parentMessage" @custom-event="handleEvent" /> </div> </template> <script setup> import { ref } from 'vue' import ChildComponent from './ChildComponent.vue' const parentMessage = ref('来自父组件的消息') const handleEvent = (data) => { console.log('收到子组件事件:', data) } </script>

2. 插槽(Slots)

<!-- SlotComponent.vue --> <template> <div class="card"> <header> <slot name="header">默认标题</slot> </header> <main> <slot>默认内容</slot> </main> <footer> <slot name="footer"></slot> </footer> </div> </template>
<!-- 使用插槽 --> <SlotComponent> <template #header> <h2>自定义标题</h2> </template> <p>这是自定义内容</p> <template #footer> <button>确定</button> </template> </SlotComponent>

五、状态管理:Pinia

Pinia 是 Vue 3 官方推荐的状态管理库,比 Vuex 更简洁、类型安全。

// stores/counter.js import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), getters: { doubleCount: (state) => state.count * 2 }, actions: { increment() { this.count++ }, async incrementAsync() { await new Promise(resolve => setTimeout(resolve, 1000)) this.count++ } } })
// 在组件中使用 <script setup> import { useCounterStore } from '@/stores/counter' const counter = useCounterStore() // 访问状态 console.log(counter.count) // 使用 getter console.log(counter.doubleCount) // 调用 action counter.increment() </script>

六、路由管理:Vue Router 4

// router/index.js import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' import About from '../views/About.vue' const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About, meta: { requiresAuth: true } } ] const router = createRouter({ history: createWebHistory(), routes }) // 导航守卫 router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isAuthenticated()) { next('/login') } else { next() } }) export default router

七、常用 API 与技巧

1. 生命周期钩子

<script setup> import { onMounted, onUpdated, onUnmounted } from 'vue' onMounted(() => { console.log('组件挂载完成') }) onUpdated(() => { console.log('组件更新完成') }) onUnmounted(() => { console.log('组件卸载') }) </script>

2. 模板引用(Template Refs)

<template> <input ref="inputRef" type="text" /> <button @click="focusInput">聚焦输入框</button> </template> <script setup> import { ref, onMounted } from 'vue' const inputRef = ref(null) const focusInput = () => { inputRef.value?.focus() } onMounted(() => { // 组件挂载后 DOM 元素才可用 console.log(inputRef.value) // <input type="text"> }) </script>

八、最佳实践与常见问题

1. 性能优化

  • 使用v-once渲染静态内容
  • 使用v-memo(Vue 3.2+)缓存模板片段
  • 合理使用计算属性,避免在模板中进行复杂计算
  • 组件懒加载:defineAsyncComponent

2. 常见问题

  • 响应式丢失:解构 reactive 对象会失去响应性,使用toRefs
  • 循环引用:避免在响应式对象中创建循环引用
  • 内存泄漏:及时清理事件监听器和定时器

九、学习资源推荐

  • 官方文档:Vue.js - The Progressive JavaScript Framework | Vue.js(英文)
  • 中文文档:Vue.js - 渐进式 JavaScript 框架 | Vue.js
  • Vue Mastery:付费视频课程,质量很高
  • Vue School:免费和付费课程
  • GitHub 仓库:vuejs/core
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 16:21:30

继承体系搭好了,方法找不到了

系列回顾:上一篇毛毛姐叠了三个装饰器,执行顺序全反了——洋葱模型 + 协议覆盖,元编程的两把双刃剑。这一篇,毛毛姐搭了个粉丝管理的多重继承体系,结果方法调用顺序完全不对。 📋 本期坑点速览:多重继承 MRO 顺序反直觉 super() 在闭包中绑定错误类 __name 名称修饰不…

作者头像 李华
网站建设 2026/8/14 16:20:36

06-指标自动抽取-从影像和数仓到AI特征向量

指标自动抽取&#xff1a;从影像和数仓到 AI 特征向量 前言 指标是连接"原始数据"和"AI 推理"的关键桥梁。在上一篇文章中&#xff0c;我们讨论了 AI 如何从非结构化材料中提取字段。但这些字段本身不是指标——字段是"投保人年龄 35"&#x…

作者头像 李华
网站建设 2026/8/14 16:18:43

网页视频下载开源利器:猫抓插件从安装到批量获取全指南

网页视频下载开源利器&#xff1a;猫抓插件从安装到批量获取全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 那个周三下午&#xff0c;插画师…

作者头像 李华
网站建设 2026/8/14 16:18:41

人工智能学院科协26公招

人工智能学院科协公招“搭好台子&#xff0c;唱好戏——我们既是幕后人&#xff0c;也可以是台上人。”一、科协是什么&#xff1f; 科协全称“科技协会”&#xff0c;是学院学术科技活动的服务与支持团队。我们的核心使命是&#xff1a; 组织与保障&#xff1a;策划并执行院内…

作者头像 李华
网站建设 2026/8/14 16:17:14

万字完整版网络安全服务手册,自学网安省下上千培训费,收藏备用

信息系统上线检测服务 信息系统上线检测服务主要由四部分组成&#xff1a;代码安全审计、安全漏洞扫描、安全配置核查和渗透性测试服务。通过全面、客观、深入的开展上线检测服务可对信息系统进行全方位安全评估分析&#xff0c;提供安全检测报告。 ▶检测流程 网络安全攻防演…

作者头像 李华