Vue3基础知识
·
介绍
Vue3 四大核心
一、性能大幅提升
- 打包体积减少
- 初次渲染速度提升
- 更新渲染速度提升
- 内存占用减少
二、源码底层升级
- 使用
Proxy替代 Vue2 的Object.defineProperty实现响应式,支持数组、深层对象监听,解决 Vue2 响应式缺陷。 - 重写虚拟 DOM,优化 Tree-Shaking 按需打包。
三、全面拥抱 TypeScript
Vue3 源码由 TS 编写,对 TS 类型推导、类型约束支持极佳,适合大型项目开发。
四、新增大量特性
组合式 API、全新内置组件、新生命周期、语法规范调整等。
Composition API 核心用法
语法糖
setup 是组合式 API 的入口,执行时机早于 beforeCreate,内部 this 为 undefined。
无需手动 return,代码更简洁:
<script setup lang="ts">
let name = "张三";
function changeName() {
name = "李四";
}
</script>
知识点
ref与reactive
ref 用于定义基本类型响应式数据(字符串、数字、布尔),返回 Ref 实例。
- JS 逻辑中修改需要
.value - 模板中直接使用,无需
.value
reactive 专门用于对象、数组类型,基于 Proxy 实现深层响应式,无需 .value。
使用
- 基本类型 → 必用
ref - 浅层对象 → ref /reactive 均可
- 多层嵌套复杂对象 → 推荐
reactive
toRef /toRefs
直接解构 reactive 对象会丢失响应式,使用 toRef(单个属性)、toRefs(批量属性)解决。
computed 计算属性
依赖已有响应式数据,自动计算新值,分为只读和可读写两种。
watch 监听
watch 主动监听指定响应式数据变化,Vue3 支持监听 ref、reactive、函数、数组。
场景
- 监听 ref 基本类型
- 监听 ref 对象类型(需开启 deep)
- 监听 reactive 对象(默认深度监听)
- 监听对象单个属性(使用函数写法)
- 同时监听多个数据(数组写法)
路由
路由两种模式
- history 模式:
createWebHistory(),URL 无 #,美观,上线需要后端配置防 404。 - hash 模式:
createWebHashHistory(),URL 带 #,兼容性好,无需后端配置。
命名路由
给路由配置 name,简化跳转:
routes: [
{ path: "/home", name: "home", component: Home }
]
嵌套路由
使用 children 配置子路由,子组件中必须预留 <RouterView>。
传参
query 参数
传参:
<RouterLink :to="{ path: '/news', query: { id: 1 } }">跳转</RouterLink>
接收:
<script setup lang="ts">
import { useRoute } from "vue-router";
const route = useRoute();
console.log(route.query.id);
</script>
params 参数(动态路由)
传参:
<RouterLink :to="{ name: 'news', params: { id: 1 } }">跳转</RouterLink>
接收:
const route = useRoute();
console.log(route.params.id);
Pinia
Pinia 替代 Vuex,语法更简洁、体积更小、TS 友好
创建 Store
Store 三要素:state(数据)、getters(计算属性)、actions(方法)。
import { defineStore } from "pinia";
export const useCountStore = defineStore("count", {
state: () => ({ count: 0 }),
getters: {
doubleCount: (state) => state.count * 2
},
actions: {
add() {
this.count++;
}
}
});
storeToRefs 解构响应式
直接解构 Store 会丢失响应式,使用 storeToRefs,并且storeToRefs只能解构值,不能解构函数
组件通信
父子传参
父传子传值,子传父传函数
自定义事件(一般是子传父)
子组件 defineEmits 触发事件,父组件监听:
子组件:
<script setup lang="ts">
const emit = defineEmits(["sendMsg"]);
const send = () => emit("sendMsg", "子组件数据");
</script>
父组件:
<Child @sendMsg="handleMsg" />
$attrs 祖传孙传参
父组件属性自动穿透到后代组件,会过滤已被 props 接收
总结
- 响应式由
defineProperty改为Proxy。 - 主推组合式 API,保留选项式 API 兼容。
- 移除事件总线,推荐 mitt;Vuex 替换为 Pinia。
- 移除
$children、过滤器、部分生命周期。 - 过渡动画类名规则修改,v-model 组件写法重构。
- 全局 API 挂载到应用实例
app上。
更多推荐

所有评论(0)