Vue3 中文文档 https://vue3js.cn/docs/zh/
Vue3 设计理念 https://vue3js.cn/vue-composition/
动机与目的:
更好的逻辑复用 与 代码组织 (composition组合式api)
optionsAPI(旧) => compositionAPI(新), 效果: 代码组织更方便了, 逻辑复用更方便了 非常利于维护!!
更好的类型推导 (typescript支持)
vue3 源码用 ts 重写了, vue3 对 ts 的支持更友好了 (ts 可以让代码更加稳定, 类型检测! )
vue3新特性:
数据响应式原理重新实现 (ES6 proxy 替代了 ES5 的 Object.defineProperty)
解决了: 例如数组的更新检测等bug, 大大优化了响应式监听的性能
(原来检测对象属性的变化, 需要一个个对属性递归监听) proxy 可以直接对整个对象劫持
虚拟DOM - 新算法 (更快 更小)
提供了composition api, 可以更好的逻辑复用
模板可以有多个根元素
源码用 typescript 重写, 有更好的类型推导 (类型检测更为严格, 更稳定)
…
vue3 性能更高, 体积更小, 更利于复用, 代码维护更方便
Vite 是一个原生 ESM 驱动的 web 开发构建工具, 在开发环境下基于浏览器原生 ES imports 开发
可以用于快速构建 vue3 的工程化项目环境 (脚手架也能构建vue3项目, 就是比较重)
注意: node版本 12以上
按照顺序执行如下的命令,即可基于 vite 创建 vue 3.x 的工程化项目
npm init vite-app 项目名称
或者
yarn create vite-app 项目名称
cd 项目名称
yarn
yarn dev
输入地址, 启动项目
说明: 在工程化的项目中,vue 要做的事情很单纯:通过 main.js 把 App.vue 渲染到 index.html 的指定区域中。
其中:
import { createApp } from 'vue'
import App from './App.vue'
import './index.css'
// 将 App.vue 的内容, 渲染到 index.html中
// 调用createApp()函数, 就是在创建一个单页应用实例, 通过.mount方法, 渲染到el区域中
createApp(App).mount('#app')
vue2 采用的就是 optionsAPI
(1) 优点:易于学习和使用
, 每个代码有着明确的位置 (例如: 数据放 data 中, 方法放 methods中)
(2) 缺点: 相似的逻辑, 不容易复用, 在大项目中尤为明显
(3) 虽然 optionsAPI 可以通过mixins 提取相同的逻辑, 但是也并不是特别好维护
vue3 新增的就是 compositionAPI
(1) compositionAPI 是基于 逻辑功能 组织代码的, 一个功能 api 相关放到一起
(2) 即使项目大了, 功能多了, 也能快速定位功能相关的 api
(3) 大大的提升了 代码可读性
和 可维护性
vue3 推荐使用 composition API, 也保留了options API
即就算不用composition API, 用 vue2 的写法也完全兼容!!
composition的使用, 需要配置一个setup 函数
setup
返回。
{{msg}}
前置说明:
作用: 传入一个复杂数据类型,将复杂类型数据, 转换成响应式数据 (返回该对象的响应式代理)
{{ obj.name }}
{{ obj.age }}
总结: 通常是用来定义响应式 对象数据
reactive 处理的数据, 必须是复杂类型, 如果是简单类型无法处理成响应式, 所以有 ref 函数!
作用: 对传入的数据(一般简单数据类型),包裹一层对象, 转换成响应式。
{{ money }}
ref 和 reactive 的最佳使用方式:
问题小结:
使用场景: 如果对一个响应数据, 进行解构 或者 展开, 会丢失他的响应式特性!
原因: vue3 底层是对 对象 进行监听劫持
作用: 对一个响应式对象的所有内部属性, 都做响应式处理
{{ money }}
{{ car }}
{{ name }}
computed函数调用时, 要接收一个处理函数, 处理函数中, 需要返回计算属性的值
我今年的年纪
我明年的年纪
watch监视, 接收三个参数
1. 参数1: 监视的数据源
2. 参数2: 回调函数
3. 参数3: 额外的配置
{{ money }}
{{ car }}
生命周期函数 vue3 中的生命周期函数, 需要在 setup 中调用
可以使用直接导入的 onX
函数注册生命周期钩子:
import { onMounted, onUpdated, onUnmounted } from 'vue'
const MyComponent = {
setup() {
onMounted(() => {
console.log('mounted!')
})
onUpdated(() => {
console.log('updated!')
})
onUnmounted(() => {
console.log('unmounted!')
})
}
}
父组件
我是父组件
子组件
我是my-demo组件 - {{ money }}
tips: vue3中 .sync 修饰符已被废弃, 使用 v-model:props 替代
依赖注入, 可以非常方便的实现 跨层级的 组件通信
父组件利用 provide 提供数据
我是父组件
子组件 (子孙后代, 都可以拿到这个数据)
我是子组件 - {{ money }}
如果希望子传父, 可以 provide 传递一个方法
父组件
// 父组件提供修改money的方法
const changeMoney = (newMoney) => {
money.value = newMoney
}
provide('changeMoney', changeMoney)
子组件
const changeMoney = inject('changeMoney')
changeMoney(200)
联想之前的 ref 和 $refs, 获取模板的元素(dom元素,组件)
1 创建 ref => const hRef = ref(null)
2 模板中建立关联 => 钩子函数-----123
3 使用 => hRef.value
钩子函数-----123