vue3
前言
vue3的学习记录
vue3新的特性
Composition API(组合API)
- setup配置
- ref与reactive
- watch与watchEffect
- provide与inject
- ……
- 新的内置组件
- Fragment
- Teleport
- Suspense
- 其他改变
- 新的生命周期钩子
- data 选项应始终被声明为一个函数
- 移除keyCode支持作为 v-on 的修饰符
- ……
vite
1 | ## 不需要全局安装 |
参考:vue3保姆级教程
vue3-cli项目分析
1 | // main.js 分析 |
setup函数
1 | /* |
ref函数
1 | /* |
reactive函数
1 | /* |
Vue3.0中的响应式原理
1 | /* |
1 | // vue2 的数据 需要 $set 和 $delete |
setup 的参数
1 | /* |
computed 计算属性
1 | import {computed} from 'vue' |
watch函数
与Vue2.x中watch配置功能一致,两个小“坑”:
监视reactive定义的响应式数据时:oldValue无法正确获取、强制开启了深度监视(deep配置失效)。
监视reactive定义的响应式数据中对象时:deep配置有效。
watch 监听对象的某个具体的值时,可以获取到oldVlaue。
1 | //数据 |
watchEffect函数
- watch的套路是:既要指明监视的属性,也要指明监视的回调。
- watchEffect的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。
- watchEffect有点像computed:
- 但computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值。
- 而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值。
1 | //watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。 |
vue3 的生命周期
1 | // 注意:Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名: |
自定义Hook
1 | // hook,本质是一个函数,把setup函数中使用的Composition API进行了封装。类似于vue2.x中的mixin。 |
toRef
1 | /* |
shallowReactive 与 shallowRef
1 | /* |
readonly 与 shallowReadonly
1 | /* |
toRaw 与 markRaw
1 | /* |
customRef
作用:创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制
1 | // 实现防抖效果: |
provide 与 inject
1 | /* 作用:实现祖与后代组件间通信 |
响应式数据的判断
1 | isRef: 检查一个值是否为一个 ref 对象 |
新的组件
1.Fragment
- 在Vue2中: 组件必须有一个根标签
- 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中
- 好处: 减少标签层级, 减小内存占用
2.Teleport
1 | // Teleport 是一种能够将我们的组件html结构移动到指定位置的技术。 |
3.Suspense (目前好像在试用阶段)
1 | // 异步引入组件 |
其他改变
1.全局API的转移
| 2.x 全局 API(Vue) | 3.x 实例 API (app) |
|---|---|
| Vue.config.xxxx | app.config.xxxx |
| Vue.config.productionTip | 移除 |
| Vue.component | app.component |
| Vue.directive | app.directive |
| Vue.mixin | app.mixin |
| Vue.use | app.use |
| Vue.prototype | app.config.globalProperties |
2.其他
1 | // 1.data选项应始终被声明为一个函数。 |
pinia
参考:掘金pinia
优点
- Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。
- pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑减少了我们工作量。
- pinia中action支持同步和异步。
- 良好的Typescript支持,毕竟我们Vue3都推荐使用TS来编写,这个时候使用pinia就非常合适了。
- 无需再创建各个模块嵌套了,Vuex中如果数据过多,我们通常分模块来进行管理,稍显麻烦,而pinia中每个store都是独立的,互相不影响。
- 体积非常小,只有1KB左右。
- pinia支持插件来扩展自身功能。
- 支持服务端渲染。
使用
1 | // 创建项目 |
1 | <template> |
setup 语法糖
setup 取名
参考:参考
1 | // 方法一 |
defineProps()和defineEmits()
使用的编译器宏不需要导入
1 | // props 里面的属性,在模板中不需要添加props,在js中需要添加 |
defineExpose
1 | 使用 <script setup> 的组件是默认关闭的,setup 相当于是一个闭包,除了内部的 template模板,谁都不能访问内部的数据和方法。 |
1 | <script setup> |
Ref 获取 DOM
1 | // 获取单独的一个DOM |
vue3 父子组件双向绑定
1 | // 父组件 |
vue3 中css使用js中的变量
1 | <script setup> |
获取 slots 和 attrs
1 | <script setup> |
vue3 路由使用
1 | import { useRouter, useRoute } from 'vue-router' |
setup 里面的导航守卫
1 | import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router' |
Vue Router 4 补充
参考:掘金
基本使用
1 | // 1. vue Router 的模式配置 |
动态路由匹配
1 | // 路由匹配 |
路由守卫
1 | /* 全局守卫 */ |
动态路由
1 | // 新增路由 |
其他
1 | // resolve 返回路由地址的标准化版本。还包括一个包含任何现有 base 的 href 属性。 |
插槽
参考:CSDN
1 | <!-- 只有默认插槽时,组件的标签才可以被当作插槽的模板来使用,这样我们就可以把 v-slot 直接用在组件上, |
全局组件
1 | import MyComponent from './App.vue' |
自定义指令
1 | <script setup> |
自定义插件
1 | // 使用插件 |
defineComponent
defineComponent 本身的功能很简单,但是最主要的功能是为了 ts 下的类型推到。
类似于vite里面的defineConfing
mitt
1 | yarn add mitt // 安装依赖 |
vue3 补充
项目构建
1 | // 使用官方的脚手架搭建 npm init vue@latest |
语法补充
1 | /* 1. 事件名称使用变量 |
vue 样式 BEM
1 | // BEM 架构是一种 css 架构,是block、element、modifier的缩写, |
组件语法补充
1 | // ref 获取组件 DOM 定义类型 |
vue3 tsx 语法
1 | // 方式 1 直接返回一个渲染函数 |
指令补充
1 | // v-model 自定义修饰符 |
Vue3 定义全局函数和变量
1 | // mian.ts ,添加全局属性或函数 |
Vue3 插件补充
1 | <template> |
vue3 样式补充
1 | // :deep() |
Vue3集成Tailwind CSS
参考:csdn tailwindcss
Vue3集成 unocss原子化
参考:csdn
环境变量
1 | // 1. 注意:不能使用动态的后缀,会在生产环境无效 |
pinia 持久化插件
1 | // $subscribe 只要有state 的变化就会走这个函数 |
router 补充
1 | // 命名视图 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 moxieBlog!
