Vue3 知识点总结

Vue3 知识点总结

1. 核心概念

1.1 Composition API

1.1.1 setup 函数
  • setup是Vue3中的新的配置项,是组件内使用Composition API的入口
  • 在setup中定义的变量和方法需要return才能在模板中使用
  • setup执行时机在beforeCreate之前,this不可用
export default {setup() {const count = ref(0)const increment = () => count.value++return {count,increment}}
}
1.1.2 响应式API
ref
  • 用于基本类型的响应式
  • 在setup中需要.value访问
  • 在模板中自动解包
const count = ref(0)
console.log(count.value) // 0
reactive
  • 用于对象类型的响应式
  • 返回对象的响应式副本
const state = reactive({count: 0,list: []
})
toRef 和 toRefs
  • toRef: 为源响应式对象上的属性新建ref
  • toRefs: 将响应式对象转换为普通对象,其中每个属性都是ref
const state = reactive({foo: 1,bar: 2
})
const fooRef = toRef(state, 'foo')
const stateRefs = toRefs(state)

1.2 生命周期钩子

  • setup(): 组件创建前执行
  • onBeforeMount(): 组件挂载前
  • onMounted(): 组件挂载后
  • onBeforeUpdate(): 组件更新前
  • onUpdated(): 组件更新后
  • onBeforeUnmount(): 组件卸载前
  • onUnmounted(): 组件卸载后
import { onMounted } from 'vue'export default {setup() {onMounted(() => {console.log('组件已挂载')})}
}

1.3 依赖注入

provide/inject
  • 跨层级组件通信
  • 可以传递响应式数据
// 父组件
provide('key', value)// 子组件
const value = inject('key')

2. 新特性

2.1 Teleport

  • 将组件内容渲染到指定DOM节点
  • 常用于模态框、弹出层等
<teleport to="body"><div class="modal"><!-- 模态框内容 --></div>
</teleport>

2.2 Fragments

  • 组件可以有多个根节点
  • 无需包裹额外的div
<template><header>...</header><main>...</main><footer>...</footer>
</template>

2.3 Suspense

  • 处理异步组件
  • 提供加载状态
<suspense><template #default><async-component /></template><template #fallback><loading-component /></template>
</suspense>

3. 状态管理

3.1 Pinia

  • Vue3推荐的状态管理方案
  • 支持TypeScript
  • 轻量级、模块化
// store/counter.js
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),actions: {increment() {this.count++}}
})

4. 性能优化

4.1 静态提升

  • 静态节点提升到渲染函数之外
  • 减少渲染开销

4.2 Patch Flag

  • 动态节点标记
  • 优化diff算法

4.3 Tree Shaking

  • 更好的代码分割
  • 减小打包体积

5. TypeScript支持

5.1 类型定义

interface User {id: numbername: string
}const user = ref<User>({ id: 1, name: 'Tom' })

5.2 组件Props类型

defineProps<{title: stringcount: number
}>()

6. 工程化实践

6.1 Vite

  • 更快的开发服务器启动
  • 更快的模块热更新
  • 优化的构建输出

6.2 单文件组件

<script setup lang="ts">
import { ref } from 'vue'const count = ref(0)
</script><template><button @click="count++">{{ count }}</button>
</template>

6.3 组件设计原则

  • 单一职责
  • 可复用性
  • Props向下,Events向上
  • 组件通信规范

7. 最佳实践

7.1 代码组织

  • 使用组合式函数(Composables)
  • 逻辑复用和抽象
  • 目录结构规范

7.2 性能考虑

  • 合理使用computed和watch
  • 避免不必要的组件渲染
  • 使用v-show代替v-if(频繁切换)

7.3 错误处理

  • 统一的错误处理机制
  • 异步操作的错误捕获
  • 全局错误处理

7.4 自定义指令

  • 生命周期钩子
  • 传递参数和修饰符
// 自定义防抖指令
app.directive('debounce', {mounted(el, binding) {const delay = binding.value || 300let timer = nullel.addEventListener('click', () => {if (timer) clearTimeout(timer)timer = setTimeout(() => {binding.value()}, delay)})}
})

7.5 动画与过渡

  • v-enter-from/v-leave-to
  • transition组件
  • transition-group列表过渡
<template><transition name="fade"><div v-if="show">Content</div></transition>
</template><style>
.fade-enter-active,
.fade-leave-active {transition: opacity 0.5s;
}
.fade-enter-from,
.fade-leave-to {opacity: 0;
}
</style>

7.6 组合式函数(Composables)

  • 逻辑复用
  • 状态共享
  • 生命周期集成
// useCounter.js
import { ref, onMounted } from 'vue'export function useCounter(initialValue = 0) {const count = ref(initialValue)const increment = () => count.value++const decrement = () => count.value--onMounted(() => {console.log('Counter mounted')})return {count,increment,decrement}
}// 使用组合式函数
const { count, increment } = useCounter()

7.7 与其他技术栈集成

7.7.1 Vue3 + TypeScript
// 组件Props类型定义
interface Props {message: stringcount?: number
}defineProps<Props>()// 组合式函数类型定义
interface UseUserReturn {user: Ref<User | null>loading: Ref<boolean>error: Ref<Error | null>fetchUser: (id: number) => Promise<void>
}function useUser(): UseUserReturn {// 实现...
}
7.7.2 Vue3 + Vite + TailwindCSS
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import tailwindcss from 'tailwindcss'export default defineConfig({plugins: [vue()],css: {postcss: {plugins: [tailwindcss]}}
})
7.7.3 Vue3 + Jest
// counter.spec.js
import { mount } from '@vue/test-utils'
import Counter from './Counter.vue'test('increments value on click', async () => {const wrapper = mount(Counter)await wrapper.find('button').trigger('click')expect(wrapper.text()).toContain('1')
})

8. 高级组件模式

8.1 动态组件

<template><component :is="currentComponent" v-bind="props" />
</template><script setup>
import { shallowRef } from 'vue'const currentComponent = shallowRef(null)
const props = ref({})// 异步加载组件
async function loadComponent(name) {const component = await import(`./components/${name}.vue`)currentComponent.value = component.default
}
</script>

8.2 递归组件

<!-- TreeNode.vue -->
<template><div class="tree-node"><div @click="toggle">{{ node.label }}</div><div v-if="isExpanded && node.children" class="children"><tree-nodev-for="child in node.children":key="child.id":node="child"/></div></div>
</template><script setup>
const props = defineProps(['node'])
const isExpanded = ref(false)
const toggle = () => isExpanded.value = !isExpanded.value
</script>

8.3 高阶组件(HOC)

// withLoading.ts
import { h, defineComponent } from 'vue'export function withLoading(WrappedComponent) {return defineComponent({props: ['loading', ...WrappedComponent.props],setup(props, { attrs, slots }) {return () => props.loading? h('div', 'Loading...'): h(WrappedComponent, { ...attrs }, slots)}})
}

9. 性能优化最佳实践

9.1 大列表优化

<script setup>
import { useVirtualList } from '@vueuse/core'const list = ref(Array.from({ length: 10000 }, (_, i) => ({ id: i, text: `Item ${i}` })))
const { list: virtualList, containerProps, wrapperProps } = useVirtualList(list, {itemHeight: 40,overscan: 10
})
</script><template><div v-bind="containerProps" class="container"><div v-bind="wrapperProps"><div v-for="item in virtualList" :key="item.id" class="item">{{ item.text }}</div></div></div>
</template>

9.2 组件懒加载

// 路由懒加载
const routes = [{path: '/dashboard',component: () => import('./views/Dashboard.vue')}
]// 组件懒加载
const MyComponent = defineAsyncComponent(() =>import('./components/MyComponent.vue')
)

9.3 计算属性缓存

const expensiveComputed = computed(() => {return list.value.filter(item => {// 复杂的计算逻辑return complexProcess(item)})
})// 带有getter和setter的计算属性
const fullName = computed({get() {return `${firstName.value} ${lastName.value}`},set(newValue) {[firstName.value, lastName.value] = newValue.split(' ')}
})

10. 与Vue2的主要区别

10.1 核心架构

  • 使用Proxy代替Object.defineProperty实现响应式
  • 重写虚拟DOM实现,性能提升100%
  • 模板编译优化,支持静态提升
  • 更好的TypeScript支持,内置类型声明

10.2 API差异

  • Composition API vs Options API
  • 新的生命周期钩子
  • 移除filter和 o n 、 on、 onoff等API
  • setup函数替代beforeCreate和created

10.3 模板语法

  • v-model的使用变化(modelValue + update:modelValue)
  • 支持多个v-model绑定
  • Teleport、Suspense等新特性
  • 片段(Fragments)支持多根节点

10.4 响应式系统

  • ref和reactive的显式声明
  • 更好的响应式解构支持(toRefs)
  • 响应式数据的调试能力增强
  • 更细粒度的响应式控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测

dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 环境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人脸检测 import cv2 import face_recognition# 读取人脸图片 img cv2.imread(r"C:\Users\123\…

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL错误解决&#xff1a;Invalid default value for xxx_time’问题分析与修复方案 问题描述 在MySQL数据库操作中&#xff0c;当尝试创建或修改表结构时&#xff0c;可能会遇到以下错误信息&#xff1a; [bug] [42000][1067] Invalid default value for xxx_time这个错误…

Go环境相关理解

Linux上安装的环境变量 ## set go env export GOPATH$HOME/go_workspace export GOPATH/usr/local/go export PATH$PATH:$GOPATH/bin go.mod 和go.sum的理解 go.mod文件 ‌go.mod文件定义了模块的路径和依赖版本‌。它遵循 语义化版本2.0.0规范&#xff0c;记录了当前项目所依…

Next.js 深度解析:全栈React框架的架构哲学与实践精髓

Next.js 作为 React 生态中最流行的全栈框架&#xff0c;已经超越了简单的SSR工具&#xff0c;发展成为完整的Web开发解决方案。以下从八个维度进行深度剖析&#xff1a; 一、核心架构设计 双引擎驱动模型 页面路由系统&#xff1a;基于文件系统的约定式路由渲染引擎&#xff…

禾赛盈利了,但激光雷达没有胜利

还远没有到激光雷达党欢呼的时候。 3月&#xff0c;随着禾赛科技公布2024年报&#xff0c;全世界第一家也是唯一一家实现全年盈利的激光雷达上市公司诞生&#xff0c;为了这个盈利目标&#xff0c;禾赛科技奋斗了十年。 但极大的出货量和不高的盈利水平&#xff0c;让禾赛科技…

心房颤动新机制:ATM/p53通路早期抑制

急性心肌梗死&#xff08;AMI&#xff09;是心血管疾病中的“大魔头”&#xff0c;它悄无声息地侵蚀着心脏的肌肉&#xff0c;导致心脏功能受损&#xff0c;严重时甚至危及生命。而心房颤动&#xff08;AF&#xff09;&#xff0c;这一常见的心律失常&#xff0c;往往在AMI后悄…

Linux 安装 Redis

虚拟机安装 linux https://www.bilibili.com/video/BVldD42177qg?p16 1、安装 gcc,编译环境 yum y install gcc-g 2、将 redis-7.2.4.tar.gz放到 linux。如&#xff0c;放到 opt 里 3、进入/opt 目录下&#xff0c;解压 tar -zxvf redis-7.2.4.tar.gz 4、进入 redis-7.2.4.tar…

六级备考 词汇量积累(day11)

sculpture 雕像 allege 指责&#xff0c;声称 pledge 发誓 breach 违背&#xff0c;违反 defaulty 违约&#xff0c;违反 infringe 侵犯 infringing on small farmers interest blacmail 勒索 idle 无所事事的 deceive 欺骗 perceive 察觉 conceive 设想 conception 设想 verdi…

关于金碟K3,禁用和启用需要流程审批后执行

真是难受,是设计师蠢呢自己问题比较多呢,现在都还没有弄好 点击禁用和启用,通过流程来执行 到底是蠢呢还是设计问题,搞了半日没有效果,搞那么复杂! 而且有样板都没有草鞋成功 BOS设计,表单属性,操作列表: 1、启用禁用流程

导入 Excel 规则批量修改或删除 PDF 文档内容

需要对 PDF 文档内容进行修改的时候&#xff0c;通常我们会需要借助一些专业的工具来帮我们完成。那我们如果需要修改的 PDF 文档较多的时候&#xff0c;有什么方法可以帮我们实现批量操作呢&#xff1f;今天这篇文章就给大家介绍一下当我们需要批量修改多个 PDF 文档的时候&am…

msyql--基本操作之运维篇

检查 root 用户的权限 查看该用户针对这个数据库的权限 -- 如果在终端连接mysql时需要 mysql -u root -p -- 查看用户权限 SELECT user, host FROM mysql.user WHERE user root;可以看的出来root有他的访问权限&#xff0c;如过没有localhost或者% 说明没有访问权限 添加…

Vue 3使用 Socket

在 Vue 3 中使用 Socket&#xff08;如 WebSocket 或基于 WebSocket 的库比如 Socket.IO&#xff09;可以通过组合式 API&#xff08;Composition API&#xff09;来实现得更清晰、模块化。下面我给你展示一个完整的例子&#xff0c;包括使用原生 WebSocket 和使用 Socket.IO 的…

云计算:探索现代科技的未来之云

文章目录 云计算基本概念云计算是什么注意 云计算的价值云计算的部署模式云计算的服务模式主流的云计算技术AWS简介AWS建立了广阔的合作伙伴生态 VMware简介VMware服务介绍 华为云简介华为云Stack模式 云计算基本概念 云计算是什么 云计算是一种模型&#xff0c;它可以实现随时…

光学像差的类型与消除方法

### **光学像差的类型、理解与消除方法** 光学像差是指实际光学系统成像时&#xff0c;由于透镜或反射镜的非理想特性导致的光线偏离理想路径&#xff0c;从而影响成像质量的现象。像差可分为**单色像差**&#xff08;与波长无关&#xff09;和**色差**&#xff08;与波长相关…

什么是ecovadis验厂?ecovadis验厂的好处?ecovadis验厂的重要意义

1. 什么是EcoVadis验厂&#xff1f; EcoVadis验厂&#xff08;又称EcoVadis评估&#xff09;是国际权威的 企业社会责任&#xff08;CSR&#xff09;和可持续发展&#xff08;ESG&#xff09;在线评估&#xff0c;通过审核企业在 环境、劳工与人权、商业道德、可持续采购 四大…

STM32蜂鸣器播放音乐

STM32蜂鸣器播放音乐 STM32蜂鸣器播放音乐 Do, Re, Mi, Fa, 1. 功能概述 本系统基于STM32F7系列微控制器&#xff0c;实现了以下功能&#xff1a; 通过7个按键控制蜂鸣器发声&#xff0c;按键对应不同的音符。每个按键对应一个音符&#xff08;Do, Re, Mi, Fa, Sol, La, Si&a…

基于 OCO - 2 氧气 A 带辐射数据与地面台站气压观测数据构建近地面气压监测算法方案

基于 OCO - 2 氧气 A 带辐射数据与地面台站气压观测数据构建近地面气压监测算法方案 一、数据获取与准备 (一)OCO - 2 氧气 A 带辐射数据 数据下载:从 OCO - 2 官方数据发布平台(如 NASA 的相关数据存储库),按照研究所需的时间范围(例如,近 5 年的数据以获取足够的样本…

程序员英语口语练习笔记

我是一个程序员&#xff0c;专注于Java, Linux和k8s. I’m a programmer specializing in Java, Linux, and Kubernetes. 这个不是我的bug。 I don’t think this bug is caused by my work. 你能帮我看一下这个代码吗&#xff1f; Can you take a look at this code for me?…

网络地址转换技术(2)

NAT的配置方法&#xff1a; &#xff08;一&#xff09;静态NAT的配置方法 进入接口视图配置NAT转换规则 Nat static global 公网地址 inside 私网地址 内网终端PC2&#xff08;192.168.20.2/24&#xff09;与公网路由器AR1的G0/0/1&#xff08;11.22.33.1/24&#xff09;做…

从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现

从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现 随着深度学习技术的发展,图像分割任务取得了长足的进步。本文将从一个具体的PyTorch代码实例出发,带大家了解一种 novel 的语义分割网络架构——RCA(Rectangular Self-Calibration Attention)和 RCM(Rectang…