Vue 3 知识点大全(一)

简介: 教程来源 https://htnus.cn/ Vue 3是Vue.js最新主版本,2020年9月发布。引入Composition API、Proxy响应式系统、TypeScript深度支持及显著性能提升(渲染快133%)。本文系统梳理核心知识点,涵盖环境搭建、API用法与响应式原理,助力新手入门与进阶开发者深入掌握。

Vue 3 是 Vue.js 框架的最新主要版本,于 2020 年 9 月正式发布。它在保留 Vue 2 核心开发体验的同时,引入了 Composition API、响应式重构、TypeScript 全面支持、性能大幅提升等革命性特性。本文将系统全面地梳理 Vue 3 的核心知识点,从基础语法到高级特性,帮助初学者快速上手,也为有经验的开发者提供深入的技术参考。
f7970d76-1020-47b3-a1fa-8c8d925039bb.png

一、Vue 3 概述

1.1 Vue 3 的新特性
核心改进:

Composition API:更好的逻辑复用和代码组织

响应式系统重构:基于 Proxy,性能更好,支持更多数据类型

TypeScript 支持:源码使用 TypeScript 重写,类型推断更完善

性能提升:打包体积减少约 40%,初次渲染快 55%,更新快 133%

Fragment:组件支持多个根节点

Teleport:将组件内容渲染到指定 DOM 位置

Suspense:处理异步组件的加载状态

自定义渲染器 API:可创建自定义渲染器

1.2 环境搭建

bash
# 使用 Vite 创建 Vue 3 项目(推荐)
npm create vue@latest my-vue3-app
cd my-vue3-app
npm install
npm run dev

# 使用 Vue CLI 创建(Webpack)
npm install -g @vue/cli
vue create my-vue3-app
cd my-vue3-app
npm run serve
javascript
// main.js - Vue 3 应用入口
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

// 创建应用实例
const app = createApp(App)

// 使用插件
app.use(router)
app.use(store)

// 全局配置
app.config.globalProperties.$http = axios

// 全局组件注册
app.component('MyComponent', MyComponent)

// 挂载应用
app.mount('#app')

二、Composition API

2.1 setup 函数

vue
<template>
  <div>
    <p>{
  { count }}</p>
    <p>双倍: {
  { doubleCount }}</p>
    <button @click="increment">增加</button>
  </div>
</template>

<script>
import { ref, computed } from 'vue'

export default {
  name: 'CompositionExample',

  // setup 是 Composition API 的入口
  // 在组件创建之前执行,在 beforeCreate 和 created 之前
  setup(props, context) {
    // props: 组件接收的属性(响应式)
    // context: 上下文对象,包含 attrs, slots, emit

    // 响应式数据
    const count = ref(0)

    // 计算属性
    const doubleCount = computed(() => count.value * 2)

    // 方法
    const increment = () => {
      count.value++
    }

    // 返回的数据和方法会被模板使用
    return {
      count,
      doubleCount,
      increment
    }
  }
}
</script>

2.2 ref 与 reactive

vue
<script setup>
import { ref, reactive, isRef, isReactive, unref } from 'vue'

// ref - 用于基本类型和对象(通过 .value 访问)
const count = ref(0)
const message = ref('Hello')
const user = ref({ name: '张三', age: 25 })

// 修改值
count.value++
message.value = 'World'
user.value.name = '李四'

// reactive - 只能用于对象类型,直接访问属性
const state = reactive({
  count: 0,
  user: {
    name: '张三',
    age: 25
  },
  list: [1, 2, 3]
})

// 直接修改
state.count++
state.user.name = '李四'
state.list.push(4)

// ref 和 reactive 的区别
const refObj = ref({ name: '张三' })
const reactiveObj = reactive({ name: '张三' })

// ref 需要通过 .value 访问和修改
refObj.value.name = '李四'
// reactive 直接访问
reactiveObj.name = '李四'

// 类型判断
console.log(isRef(refObj))      // true
console.log(isReactive(reactiveObj)) // true

// 自动解包
const countRef = ref(0)
// 在模板中不需要 .value
// 在 reactive 对象中会自动解包
const state2 = reactive({
  count: countRef  // 不需要 .value
})
console.log(state2.count)  // 0

// unref - 如果参数是 ref 则返回 .value,否则返回本身
const value1 = unref(ref(10))   // 10
const value2 = unref(20)        // 20
</script>

2.3 计算属性与侦听器

vue
<script setup>
import { ref, reactive, computed, watch, watchEffect } from 'vue'

// 计算属性
const firstName = ref('张')
const lastName = ref('三')

// 只读计算属性
const fullName = computed(() => firstName.value + lastName.value)

// 可写计算属性
const fullNameWritable = computed({
  get: () => firstName.value + lastName.value,
  set: (newValue) => {
    firstName.value = newValue[0]
    lastName.value = newValue[1]
  }
})

// 侦听器 - watch
const count = ref(0)
const state = reactive({ name: '张三', age: 25 })

// 侦听单个 ref
watch(count, (newVal, oldVal) => {
  console.log(`count 从 ${oldVal} 变为 ${newVal}`)
})

// 侦听多个数据源
watch([count, () => state.age], ([newCount, newAge], [oldCount, oldAge]) => {
  console.log('count 或 age 变化了')
})

// 侦听对象属性
watch(() => state.name, (newVal, oldVal) => {
  console.log(`name 从 ${oldVal} 变为 ${newVal}`)
})

// 深度侦听
watch(() => state, (newVal, oldVal) => {
  console.log('state 变化了', newVal)
}, { deep: true })

// 立即执行
watch(count, (newVal) => {
  console.log('立即执行', newVal)
}, { immediate: true })

// watchEffect - 自动收集依赖,立即执行
watchEffect(() => {
  // 自动追踪 count 和 state.name
  console.log(`count: ${count.value}, name: ${state.name}`)
})

// 停止侦听
const stopWatch = watch(count, (newVal) => {
  console.log(newVal)
})
// 停止侦听
stopWatch()

// watch 清理副作用
watchEffect((onCleanup) => {
  const timer = setInterval(() => {
    console.log('执行')
  }, 1000)

  // 清理副作用
  onCleanup(() => {
    clearInterval(timer)
  })
})
</script>

2.4 生命周期钩子

vue
<script setup>
import {
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
  onErrorCaptured,
  onRenderTracked,
  onRenderTriggered,
  onActivated,
  onDeactivated
} from 'vue'

// Composition API 生命周期钩子
// 对应 Options API:beforeCreate -> setup()
// 对应 Options API:created -> setup()

// 组件挂载前
onBeforeMount(() => {
  console.log('组件挂载前')
})

// 组件挂载后
onMounted(() => {
  console.log('组件挂载后')
  // DOM 已渲染,可以访问 DOM 元素
})

// 组件更新前
onBeforeUpdate(() => {
  console.log('组件更新前')
})

// 组件更新后
onUpdated(() => {
  console.log('组件更新后')
})

// 组件卸载前
onBeforeUnmount(() => {
  console.log('组件卸载前')
})

// 组件卸载后
onUnmounted(() => {
  console.log('组件卸载后')
})

// 错误捕获
onErrorCaptured((err, instance, info) => {
  console.log('捕获错误:', err)
  // 返回 false 可以阻止错误继续传播
  return false
})

// 渲染追踪(开发环境)
onRenderTracked((event) => {
  console.log('渲染追踪:', event)
})

// 渲染触发(开发环境)
onRenderTriggered((event) => {
  console.log('渲染触发:', event)
})

// keep-alive 组件激活时
onActivated(() => {
  console.log('组件激活')
})

// keep-alive 组件停用时
onDeactivated(() => {
  console.log('组件停用')
})
</script>

三、响应式原理

3.1 Proxy 响应式系统

javascript
// Vue 3 响应式原理示例
function reactive(target) {
  if (typeof target !== 'object' || target === null) {
    return target
  }

  return new Proxy(target, {
    get(target, key, receiver) {
      // 依赖收集
      track(target, key)
      const result = Reflect.get(target, key, receiver)
      // 深度响应式
      return reactive(result)
    },

    set(target, key, value, receiver) {
      const oldValue = target[key]
      const result = Reflect.set(target, key, value, receiver)

      // 触发更新
      if (oldValue !== value) {
        trigger(target, key)
      }

      return result
    },

    deleteProperty(target, key) {
      const hadKey = Object.prototype.hasOwnProperty.call(target, key)
      const result = Reflect.deleteProperty(target, key)

      if (hadKey) {
        trigger(target, key)
      }

      return result
    }
  })
}

// 依赖收集
const targetMap = new WeakMap()

function track(target, key) {
  let depsMap = targetMap.get(target)
  if (!depsMap) {
    depsMap = new Map()
    targetMap.set(target, depsMap)
  }

  let dep = depsMap.get(key)
  if (!dep) {
    dep = new Set()
    depsMap.set(key, dep)
  }

  // 添加当前活动的 effect
  if (activeEffect) {
    dep.add(activeEffect)
  }
}

// 触发更新
function trigger(target, key) {
  const depsMap = targetMap.get(target)
  if (!depsMap) return

  const dep = depsMap.get(key)
  if (dep) {
    dep.forEach(effect => effect())
  }
}

// effect 函数
let activeEffect = null

function effect(fn) {
  activeEffect = fn
  fn()
  activeEffect = null
}

3.2 ref 原理

javascript
// ref 的实现原理
function ref(value) {
  return {
    _value: value,
    get value() {
      // 依赖收集
      track(this, 'value')
      return this._value
    },
    set value(newValue) {
      if (this._value !== newValue) {
        this._value = newValue
        // 触发更新
        trigger(this, 'value')
      }
    }
  }
}

来源:
https://htnus.cn/

相关文章
|
运维 安全 数据可视化
免费托管代码到云效代码管理Codeup
本场景介绍如何提交代码到云效代码管理Codeup。云效Codeup提供免费、不限容量的云上代码托管服务,您无需担心计费问题。
|
6天前
|
前端开发 JavaScript C#
MVVM框架知识点大全(一)
教程来源 https://ljtgc.cn/article/323.html 本文系统解析MVVM架构模式,涵盖Model、View、ViewModel三层职责、双向数据绑定、计算属性与命令等核心机制,对比MVC/MVP,结合Vue.js等主流框架实践,助开发者构建高可维护、易测试的响应式应用。
构建响应式网站知识点大全(二)
教程来源 https://dnuhf.cn/ 本文系统讲解响应式Web开发核心技巧:涵盖弹性图片(max-width、srcset、picture)、流体字体(rem/vw/clamp)、多模式导航(汉堡菜单、下拉/底部切换)等实战方案,兼顾兼容性与现代特性,助力构建高性能自适应网页。
|
10天前
|
XML 前端开发 开发者
CSS学习知识点大全(一)
教程来源 https://app-a7illrp9pngh.appmiaoda.com/ 梳理CSS核心知识:从基础语法、四大引入方式,到选择器(基础/组合/属性/伪类/伪元素)及优先级规则;详解盒模型(标准/怪异)、属性设置与外边距折叠。助力新手构建完整体系,也为开发者提供深度参考。
|
10天前
|
前端开发 开发者
HTML学习知识点大全(一)
教程来源 https://app-abdss1rim1oh.appmiaoda.com HTML是构建网页的基石标记语言,非编程语言,通过标签定义结构与语义。本文系统梳理从基础语法、文档结构、meta/link/script头部标签,到文本格式、标题段落、双向文本等核心知识,兼顾新手入门与开发者进阶参考。
|
7天前
|
Web App开发 前端开发 测试技术
构建响应式网站知识点大全(四)
教程来源:https://ljtgc.cn/article/218.html 本文系统讲解响应式设计最佳实践:涵盖移动优先策略、性能优化(will-change、高效动画、图片懒加载)、可访问性(焦点管理、减少动画、暗色/高对比度模式)及多端测试方法;并对比Bootstrap、Tailwind CSS与自定义响应式系统,辅以Chrome DevTools等实用调试工具。
|
7天前
|
druid 安全 Java
网站后端连接数据库知识点大全(一)
教程来源:https://dnuhf.cn/article/162.html 本文系统梳理Web后端数据库连接核心知识:涵盖JDBC原理、主流驱动配置、PreparedStatement防注入、批处理;深入解析HikariCP、Druid、Tomcat JDBC三大连接池;详解Spring中数据源配置、JdbcTemplate及多数据源实践,助开发者构建高效、安全、稳定的数据库访问体系。
|
7天前
|
Java 关系型数据库 数据库连接
网站后端连接数据库知识点大全(二)
教程来源 https://dnuhf.cn/article/156.html 本文系统介绍Java数据库访问核心实践:涵盖MyBatis与JPA/Hibernate两大ORM框架的配置与高级用法;MySQL/PostgreSQL/Oracle连接参数优化;HikariCP连接池调优及泄漏检测;以及JDBC原生事务与Spring声明式事务(含传播行为、隔离级别、超时回滚等)的完整实现方案。
|
10天前
|
前端开发 开发者
CSS学习知识点大全(终)
教程来源 https://app-aaqhxe29haf5.appmiaoda.com 本文系统介绍CSS核心进阶技术:涵盖Sass/SCSS与Less预处理器(变量、嵌套、Mixin、函数等),BEM/SMACSS架构规范,性能优化实践(关键CSS、选择器优化、will-change等),以及Tailwind CSS、CSS Modules等现代工具,助力构建高效可维护的样式系统。
|
10天前
HTML学习知识点大全(二)
教程来源 https://app-abggx9rbr6dd.appmiaoda.com 本文档系统介绍HTML核心语法:涵盖无序、有序及定义列表的规范写法;超链接(含邮件、电话、下载等)与导航结构设计;以及图像响应式加载、音视频嵌入和PDF预览等多媒体元素用法。

热门文章

最新文章