1、Vue3的生态与优势
1-1、Vue3的社区生态:
- 社区生态 - 逐步完善
- 整体优化 - 性能优化/TS支持优化/组合式API加持
- 市场使用 - 部分技术选型激进的公司已经在生产环境使用了vue3
社区生态
组件(插件)名称 | 官方地址 | 简介 |
ant-design-vue | ant-design-vue 是 Ant Design 的 Vue 实现,组件的风格与 Ant Design 保持同步 | |
element-plus | Element Plus,一套为开发者、设计师和产品经理准备的基于 Vue 3.0 的桌面端组件库 | |
vant | 有赞前端团队开源的移动端组件库,于 2016 年开源,已持续维护 4 年时间 | |
Naive UI | 一个 Vue 3 组件库比较完整,主题可调,使用 TypeScript,不算太慢,有点意思 | |
VueUse | 基于composition组合api的常用集合,小兔仙项目会部分使用 |
1-2、Vue3的整体优化
1. 性能提升
- 首次渲染更快
- diff算法更快
- 内存占用更少
- 打包体积更小
2. 更好的Typescript支持
3. Composition API (重点)
Vue3 中文文档 Vue3
2、组合式API
2-1、setup入口函数
setup 函数在beforeCreate生命周期钩子执行之前执行,实例还没生成,没有this
代码演示:
export default {
setup () {
console.log('setup执行了')
console.log(this)
},
beforeCreate() {
console.log('beforeCreate执行了')
console.log(this)
}
}2-2、响应式API - ref
作用:ref是一个函数,接受一个简单类型或者复杂类型的传入并返回一个响应式且可变的 ref 对象
简单来说,给ref传入一个初始数据,返回给你一个响应式数据。vue2中在data中定义数据,vue3使用ref来定义数据
使用步骤:
- 从vue中导入ref的包
- 在steup调用ref并传入初始数据
- 在setup函数中把ref函数调用完毕的返回值以对象的形式返回出去
- 在setup函数中使用ref需要加上.value进行访问,模板中不需要加.value
代码演示
<template>
<div>{{ money }}</div>
<button @click="changeMondy">改值</button>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
let money = ref(100)
console.log(money.value)
return {
money
}
}
}
</script>2-3、响应式API - computed
使用步骤:
- 从vueu框架中导入computed
- 在setup函数中执行computed函数,并传入一个函数,在函数中计算公式
- 接受computed的返回值,并return出去
代码演示:
<template>
{{ list }}
{{ filterList }}
<button @click="changeList">change list</button>
</template>
<script>
import { computed, ref } from 'vue'
export default {
setup() {
const list = ref([1, 2, 3, 4, 5, 6])
// 输入大于2的数字
const filterList = computed(() => {
return list.value.filter(item => item > 2)
})
// 修改list的函数
function changeList() {
list.value.push(6, 7, 8)
}
return {
list,
filterList,
changeList
}
}
}
</script>2-4、响应式API - watch
作用:基于响应式的数据执行回调,没有返回值,和vue2中的watch基本一致.他又三个参数(前两个为函数,最后一个为配置对象)
使用步骤:
- 从vue中导入watch
- 在setup函数中执行watch函数开启对响应数据的监听
- 使用watc可传入三个参数
- 第一个参数为函数,return的结果就是你需要监听的数据项
- 第二个参数为响应式的数据变化之后执行回调函数
- 第三个参数为参数对象,可以设置立即侦听,深度监听
代码演示
普通监听
<template>
{{ age }}
<button @click="age++">change age</button>
</template>
<script>
import { ref, watch } from 'vue'
export default {
setup() {
const age = ref(18)
watch(() => {
return age.value
}, () => {
// 数据变化之后的回调函数
console.log('age发生了变化')
})
return {
age
}
}
}
</script>深度监听并开启立即执行和深度监听
<template>
{{ age }}
<button @click="age++">change age</button>
</template>
<script>
import { ref, watch } from 'vue'
export default {
setup() {
const age = ref(18)
watch(() => {
// 返回你想要监听的响应式属性(ref产生的对象必须加.value)
return age.value
}, () => {
// 数据变化之后的回调函数
console.log('age发生了变化')
},{
immediate: true,
deep:true})
return {
age
}
}
}
</script>3、生命周期函数
要想了解vue3中的生命周期首先得回顾下vue的生命周期流程,下面我放置了一张vue官网的生命周期流程图
3-1、 在 setup 函数中使用生命周期钩子函数
使用步骤:
代码演示:
- 先从vue中导入以
on打头的生命周期钩子函数 - 在setup函数中调用生命周期函数并传入回调函数
- 生命周期钩子函数可以调用多次
代码演示:
<template>
<div>生命周期函数</div>
</template>
<script>
import { onMounted } from 'vue'
export default {
setup() {
// 时机成熟 回调函数自动执行
onMounted(() => {
console.log('mouted生命周期执行了')
})
onMounted(() => {
console.log('mouted生命周期函数又执行了')
})
}
}
</script>3-2、vue3对应vue2的生命周期钩子函数:
选项式API下的生命周期函数使用 | 组合式API下的生命周期函数使用 |
| 不需要(直接写到setup函数中) |
| 不需要(直接写到setup函数中) |
|
|
|
|
|
|
|
|
|
|
|
|
3-3、生命周期钩子函数使用场景
生命周期钩子函数 | 应用场景 |
created | 发送ajax请求 / 挂载共用属性 |
mounted | 发送ajax请求 / 依赖于dom的业务,比如地图,图表 |
destroyed | 销毁操作,比如定时器 |
4、组件通信
在vue3的组合式API中,父传子的基础套路完全一样,基础思想依旧为:父传子是通过prop进行传入,子传父通过调用自定义事件完成
子传父实现步骤:
- setup函数提供俩个参数,第一个参数为props,第二个参数为一个对象context
- props为一个对象,内部包含了父组件传递过来的所有prop数据,context对象包含了attrs,slots, emit属性,其中的
emit可以触发自定义事件的执行从而完成子传父
父组件
<template>
//传入自定义属性
<son :msg="msg" @get-msg="getMsg"></son>
</template>
<script>
import { ref } from 'vue'
import Son from './components/son'
export default {
components: {
Son
},
setup() {
const msg = ref('this is msg')
function getMsg(msg) {
console.log(msg)
}
return {
msg,
getMsg
}
}
}
</script>子组件:
<template>
<div>
{{msg}}
<button @click="setMsgFromSon">set</button>
</div>
</template>
<script>
export default {
props: {
msg: {
type: String
}
},
对context进行结构, 拿到emit方法
setup(props,{emit}) {
function setMsgFromSon(){
emit('get-msg','这是一条来自子组件的新的msg信息')
}
return {
setMsgToSon
}
}
}
</script>5、TemplateRef获取dom元素
- 使用ref函数传入null创建 ref对象 =>
const hRef = ref(null) - 模板中通过定义ref属性等于1中创建的ref对象名称建立关联 =>
<h1 ref="hRef"></h1> - 把
hRefreturn出去 - 使用 =>
hRef.value
代码演示:
<template>
<h1 ref="h1Ref">我是普通dom标签</h1>
<ref-component ref="comRef"></ref-component>
</template>
<script>
import { onMounted, ref } from 'vue'
import RefComponent from '@/components/RefComponent'
export default {
components: {
RefComponent
},
setup() {
const h1Ref = ref(null)
const comRef = ref(null)
onMounted(() => {
console.log(h1Ref.value)
console.log(comRef.value)
})
// 必须return
return {
h1Ref,
comRef
}
}
}
</script>6.vue3中废弃的语法
1.实例方法$on移除
2.过滤器filter移除
3..sync语法移除
















