Vue3 知识点总结

news2025/3/26 8:19:06

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: number
  name: string
}

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

5.2 组件Props类型

defineProps<{
  title: string
  count: 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 || 300
    let timer = null
    el.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: string
  count?: 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-node
        v-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.coloradmin.cn/o/2321839.html

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

相关文章

第一天学爬虫

阅读提示&#xff1a;我今天才开始尝试爬虫&#xff0c;写的不好请见谅。 一、准备工具 requests库&#xff1a;发送HTTP请求并获取网页内容。BeautifulSoup库&#xff1a;解析HTML页面并提取数据。pandas库&#xff1a;保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…

W、M、C练题笔记(持续更新中)

web here are the flag 点击&#xff0c;页面跳转404.php&#xff0c;用bp抓包访问/flag.php页面&#xff0c;得到flag用base64解码 TryToFindFlag 打开后查看源代码 发现是robots协议&#xff0c;访问robots.txt 访问flllaaa......&#xff0c;得到空白页面&#xff0c;查看…

CVE-2021-45232未授权接口练习笔记

CVE-2021-45232 是 Apache APISIX Dashboard 中的一个严重权限漏洞&#xff0c;类似于攻击者无需密码即可拿到整个网关系统的“万能钥匙”。攻击者利用此漏洞&#xff0c;可直接操控网关流量转发规则&#xff0c;甚至远程执行代码&#xff0c;引发服务器沦陷。 默认账户密码导致…

贪心算法——c#

贪心算法通俗解释 贪心算法是一种"每一步都选择当前最优解"的算法策略。它不关心全局是否最优&#xff0c;而是通过局部最优的累积来逼近最终解。优点是简单高效&#xff0c;缺点是可能无法得到全局最优解。 一句话秒懂 自动售货机找零钱&#xff1a;用最少数量的…

Retrofit中scalars转换html为字符串

简介 在Retrofit中&#xff0c;如果你想直接获取HTML或其他文本格式的响应内容而不是将其映射到一个模型类&#xff0c;ScalarsConverterFactory 就派上用场了。ScalarsConverterFactory 是一个转换器工厂&#xff0c;它能够将响应体转换为Java基本类型如String、Integer或Byte…

【微服务架构】SpringCloud(七):配置中心 Spring Cloud Config

文章目录 配置中心为什么需要配置中心配置中心介绍 服务搭建基于GITHUB1.创建仓库2.新建微服务作为配置中心服务3.启动测试拉取 匹配规则分支读取 客户端配置配置文件引入依赖使用远程配置 刷新配置手动配置热更新自动刷新erlang安装RabbitMQ安装环境变量管理界面服务配置测试 …

Linux学习笔记(应用篇二)

基于I.MX6ULL.MINI开发板 开发板与电脑相互通信电脑与开发板互传文件 开发板与电脑相互通信 用网线将电脑与开发板连接 本人使用的是Ubuntu系统&#xff0c;不是虚拟机 一般来说刚开始电脑和开发板是ping不通的 首先查看电脑的 IP WinR&#xff0c;cmd调出终端 我使用的是…

记录一次部署k3s后,服务404 page not found,nginx显示正常

服务部署k3s后&#xff0c;正常入口端怎么返回都是80&#xff0c;且返回错误 TRAEFIK DEFAULT CERT ERR_CERT_AUTHORITY_INVALID ngnix显示也是正常&#xff0c;怎么找也找不到问题 后来通过 iptables -L -n -t nat|grep 80 发现入口端流量被DNAT转到新的服务 而k3s中&#…

mac上安装nvm及nvm的基本语法使用!!

种一棵树&#xff0c;最好是十年前&#xff0c;其次是现在&#xff01;想要改变&#xff0c;从此刻开始&#xff0c;一切都不晚&#xff01; 目录 nvm是什么&#xff1f;前提条件&#xff1a;安装homebrew如果系统已经有node版本&#xff1a;在mac上安装nvm&#xff1a;用nvm安…

(基本常识)C++中const与引用——面试常问

作者&#xff1a;求一个demo 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 内容通俗易懂&#xff0c;没有废话&#xff0c;文章最后是面试常问内容&#xff08;建议通过标题目录学习&#xff09; 废话不多…

dfs(深度优先)——太抽象了

1. 两种方法 #include<bits/stdc.h> using namespace std; //void dfs(int index,int n,vector<int> current) //{ // if(index>n){ // for(int i0;i<current.size();i){ // cout<<current[i]<<" "; // } // cout<<endl;…

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\…

redis解决缓存穿透/击穿/雪崩

文章目录 1.缓存穿透1.1 概念1.2 解决方案1.2.1 缓存空对象1.2.2 布隆过滤 1.2 店铺查询使用缓存穿透解决方案1.2.1 流程 2.缓存雪崩2.1 什么是缓存雪崩&#xff1f;2.2 雪崩解决方案 3.缓存击穿3.1 什么是缓存击穿&#xff1f;3.2解决方案3.2.1 基于互斥锁解决缓存击穿问题&am…

《TCP/IP网络编程》学习笔记 | Chapter 22:重叠 I/O 模型

《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型理解重叠 I/O 模型重叠 I/O本章讨论的重叠 I/O 的重点不在于 I/O 创建重叠 I/O 套接字执行重叠 I/O 的 WSASend 函数进行重叠 I/O 的 WSA…

python每日十题(10)

在Python语言中&#xff0c;源文件的扩展名&#xff08;后缀名&#xff09;一般使用.py。 保留字&#xff0c;也称关键字&#xff0c;是指被编程语言内部定义并保留使用的标识符。Python 3.x有35个关键字&#xff0c;分别为&#xff1a;and&#xff0c;as&#xff0c;assert&am…

LabVIEW液压振动锤控制系统

在现代工程机械领域&#xff0c;液压振动锤的高效与精准控制日益显得重要。本文通过LabVIEW软件&#xff0c;展开液压振动锤启停共振控制技术的研究与应用&#xff0c;探讨如何通过改进控制系统来优化液压振动锤的工作性能&#xff0c;确保其在复杂工况下的稳定性与效率。 ​ …

简单介绍My—Batis

1.什么是My—Batis&#xff1f; My—Batis是一个持久层框架&#xff0c;提供了sql映射功能&#xff0c;能方便的将数据库表和java对象进行映射&#xff0c;通过My—Batis可以将项目中的数据存储在数据库中&#xff0c;以便我们进行调用。值得注意的是My—Batis和spring不是一回…

ALTER TABLE SHRINK SPACE及MOVE的区别与适用场景

以下是 ‌Oracle 数据库‌中三个收缩表空间命令的对比&#xff1a; 1. ALTER TABLE table_name SHRINK SPACE;‌ ‌作用‌&#xff1a;直接重组表数据并移动高水位线&#xff08;HWM&#xff09;&#xff0c;释放未使用的空间到表空间‌。 影响‌&#xff1a; 会锁表&#…

docker远程debug

1. 修改 Java 启动命令 在 Docker 容器中启动 Java 程序时&#xff0c;需要添加 JVM 调试参数&#xff0c;jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本&#xff1a; java -Xdebug -Xrunjdwp:tra…

rosbag|ROS中.bag数据包转换为matlab中.mat数据类型

代码见代码 msg_dict中设置自定义消息类型 test_config中设置需要记录的具体的值 test_config中topic_name以及message_type照搬plotjuggler打开时的参数 最后生成.mat文件在matlab中进行使用