众所周知,前端技术一直更新很快,这不 vue3 也问世这么久了,今天就来给大家分享下vue3中值得注意的知识点。喜欢的话建议收藏,点个关注!


1、createApp

vue2 和 vue3 在创建实例时,有很大的区别,具体对比如下:

//Vue 2
Vue.use({
router,
store,
render:h=>h(App)
}).$mount("#app") //Vue 3
createApp(App).use(router).use(store).mount("#app")

vue2 创建实例,使用的是 new Vue() 对应的 router、store 都是其中一部分参数。

而 vue3 中,使用 createApp 创建应用实例,router、store 被当作插件通过链式调用。

在 vue2 中,创建多个实例的话,如果有 mixin、prototype 等时,容易造成实例污染。而 createApp 方法创建的是一个全新的实例,可以有效地避免这个问题。所以在vue3中,可以任意地创建多个实例。

2、setup

vue2 中选项式开发的,而 vue3 采用组合式开发,也可以向下兼容选项式开发。

setup 函数就是 vue3 中 Composition API 的入口,是处于生命周期钩子函数 beforeCreate 和 created 两个函数之间,所以 setup 中的属性和方法无法在外部使用。如果需要使用的话,必须 return 暴露出去。

对比一下 vue2 和 vue3 中 data 和 method 使用区别:

// vue2
export default{
data(){
return{
name:"热爱前端的小姐姐"
},
methods:{
print(){
console.log("打印")
}
}
}
} // vue3
export default{
setup(){
const name="热爱前端的小姐姐"
function print(){
console.log("打印")
}
return { name , print }
}
}

vue2 中,this 是我们的常客,随处可见它的踪影。我们在 setup 中加入 this 的打印,试着查看下结果,发现运行结果是 undefined。

所以在 setup 内无法使用 this 以及挂载 this 相关的东西。

所以 setup 函数提供了两个参数:

setup(props,context){
//props 是响应式数据,不能直接解构赋值
//context 非响应式对象,可以直接解构使用 // Attribute (非响应式对象)
console.log(context.attrs) // 插槽 (非响应式对象)
console.log(context.slots) // 触发事件 (方法)
console.log(context.emit)
}

3、script setup 语法糖

简化上述 setup 组合式 API 的写法,属于 vue3 的新语法糖。

特点:

  1. 定义的属性和方法无需 return,可以直接使用。
  2. 自动注册组件,不再需要 components 内注册组件。

大大简化上述 setup() 的代码。

4、钩子函数

vue2 使用生命周期函数时,直接使用就好了。如:

// vue2
export default{
beforeCreate(){
},
mounted(){ }
}

但是在 vue3 组合式 API 中,通过生命周期钩子前面加 on 来访问,使用之前必须引入。如:

// vue3
<script setup>
import { onMounted } from "vue"
onMounted(()=>{ })
</script>

由于 setup 是围绕 beforeCreate 和 created 生命周期钩子运行的,所以在 setup 内不需要这两个钩子函数,剩余的都是一样的。

官方提供生命周期钩子:

5、teleport 传送门

teleport 传送门可以把内部的元素绑定到任意父元素上,使用方式简单灵活。

使用方式:

<teleport to="body"></teleport>

to 属性是指定 teleport 中内容加入的 DOM 元素,可以是标签名、类名或 id 。

//标签名  。上述实例就是加入body元素内,使用的是标签名。
<teleport to="body"></teleport> //类名。如:to=".className"
<teleport to=".className"></teleport> //id名
<teleport to="#idName"></teleport>

优点:多个组件嵌套层次过多时,样式层级处理麻烦,使用 teleport 可以把元素剥离出来,设置样式方便,同时 vue 控制状态也方便。

6、mixin 混入

mixin 对象会把多个组件公用的选项提取出来,需要的组件内引入,管理方便。在 vue3 中 mixin 使用较少。

使用方式:

<script>
const myMixin = {
data(){
return {name:'热爱前端的小姐姐'}
}
}
export default {
mixins:[myMixin],
data(){
return {
qdr:"前端人"
}
}
}
</script>

使用时,可以引入多个 mixin 对象。使用注意事项:

  1. mixin 对象与组件包含相同选项时,会自动合并。
  2. mixin 对象与组件相同选项内拥有相同属性时,就近原则,优先继承实例内的值。
  3. mixin 和组件包含相同的钩子函数时,会合并执行,优先执行 mixin 中的钩子函数。
  4. mixin 自定义属性与实例中冲突时,可以通过 optionMergeStrategies 定义优先级。

7、自定义指令

全局自定义指令:

vue2 的 directive 挂载到 Vue 对象上。

vue3 的 directive 挂载到 app 上,如:

//Vue 2
Vue.directive('name',opt) //Vue 3
const app = createApp(App)
app.directive("name",options)
app.mount("#app")

局部自定义指令:与 vue2 写法相同。

在 vue3 中自定义指令生命周期钩子函数有一部分改变,钩子函数分别为:

  • created
  • beforeMounted
  • mounted
  • beforeUpdate
  • updated
  • beforeUnmounted
  • unmounted

8、ref、reactive

ref 作用是让基础类型数据具备响应式。

reactive 让引用数据类型具备响应式能力。

ref 和 reactive 包裹数据,使数据具备响应式,在使用之前需要先引入。

使用方法如:

<script setup>
import { ref , reactive } from "vue"
let mood = ref("value")
let me = reactive({
str:value,
})
</script>
 

setup + ref + reactive 就可以实现 vue2 中 data 的响应式功能,所以 setup 能够替换掉 data 。

9、toRefs、toRef

toRefs 解构 props 传递的数据,由于父向子组件通过 props 传值是响应式的,使用 ES6 解构会消除响应特性,所以使用 toRefs 。

<script setup>
const props = defineProps({
selectNum:Number,
allNum:Number,
})
const { selectNum, allNum } = toRefs(props)
</script>

toRef 也是解构数据,主要是对可选参数处理,运行时先检查 解构的数据中是否存在该属性,如果存在就继承,不存在则会创建一个属性,这样就不会报错了。

const str = toRef( props, 'str' )

10、watch、watchEffect 新用法

watch 、watchEffect 都是侦听器。

watch 会监听某个基础类型数据或引用数据类型的某个具体属性。

vue3 使用 watch 之前,必须引入。

//vue2
watch:{
mood(curVal,preVal){
console.log('cur',curVal);//最新值
console.log('pre',preVal);//修改之前的值
}
} //vue3
import { watch } from "vue"
watch(
name ,
( curVal , preVal )=>{ //业务处理 },
options
)

watchEffect 监听的是引用数据类型的所有属性,不需要指定是哪个具体的属性,一旦运行,就会立刻执行。

watchEffect 使用之前也必须引入。

import { watchEffect } from "vue"
let obj = reactive({ name:'qq',sex:'女'})
watchEffect(() => {
console.log('name',obj.name);
console.log('sex' , obj.sex);
})

watch 与 watchEffect 对比:

  1. watch 运行的时候不会立刻执行, watchEffect 立即执行。
  2. watch 更加具体,需要指定监听的谁,watchEffect 不要执行具体监听谁,回调函数内直接使用就可以,比较抽象。
  3. watch 回调内可以访问到修改之前的值,watchEffect 只能访问最新的值。
  4. watch 可通过配置实现 watchEffect 的前两个特性。

11、computed 新用法

computed 计算属性

选项式 API 中 vue2 和 vue3 使用相同。

组合式 API 中,使用之前需要引入。

// 选项式
computed:{
sum(){
return this.num1+ this.num2
}
} //组合式
import { ref, computed } from "vue"
export default{
setup(){
const num1 = ref(1)
const num2 = ref(1)
let sum = computed(()=>{
return num1.value + num2.value
})
}
}

或者,它可以使用一个带有 get 和 set 函数的对象来创建一个可写的对象。

let mul = computed({
get:()=>{
return num1.value *10
},
set:(value)=>{
return num1.value = value/10
}
})

在vue3.2+内,computed 可接受一个带有 onTrack 和 onTrigger 选项的对象作为第二个参数:

  • onTrack 会在某个响应式 property 或 ref 作为依赖被追踪时调用。
  • onTrigger 会在侦听回调被某个依赖的修改触发时调用。

12、provide / inject

provide/inject 类似于消息的订阅和发布,provide 提供或发送数据或方法, inject 接收数据或方法。

优点:组件嵌套层级较多,父组件向子组件、多个孙组件传值时,传递数据需要一级一级向下传递,比较麻烦,使用 project 和 inject 很方便地解决了这个问题。

//vue2
export default{
provide:{
info:"提供数据"
}
}
//接收数据
export default{
inject:['info'],
mounted(){
console.log("接收数据:", this.info) // 接收数据:提供数据
}
} //vue3
<script setup>
import { provide } from "vue"
provide( 'info', "值" )
</script>
//接收数据
<script setup>
import { inject } from "vue"
const info = inject( 'info', "设置默认值" )
</script>

13、readonly

readonly 只读函数,使用之后该数据只能使用,不能修改,修改时会有警告。

父子组件之间传值时,如果传递的是响应式数据,子组件修改的时候,父组件的也会更新,这样就容易造成状态混乱,不符合 vue 的单项数据流。

如果使用 readonly ,保证数据在其他组件内只能使用,并不能修改,规避混乱。

14、获取真实DOM

vue2 使用 $ref 获取真实DOM。

vue3 使用 ref 获取真实DOM。与上述的 ref 不同。

<div ref="box" class="test" id="boxtest">获取真实DOM</div>

//vue2
<script>
export default{
mounted(){
console.log('box', this.$refs.box);
}
}
</script> //vue3
<script setup>
const box = ref(null)
onMounted(()=>{
console.log('box',box.value);
})
</script>

15、vue3 中的 vuex4

createStore 函数创建新的 store 实例。使用之前需要先引入。

import { createApp } from 'vue'
import App from './App.vue'
import { createStore } from "vuex" const store = createStore({
state(){
return{
num:1,
}
}
}) const app = createApp(App)
app.use(store)
app.mount('#app')

组件内使用 store 时,通过 useStore 引入,使用之前也需要引入。

import { useStore } from "vuex"
const store = useStore()

使用的时候,与低版本都是一样的。使用 state 内数据时,可以通过 toRefs 解构。

16、v-slot

v-slot 指令只能用在 template 或组件上,否则就会报错。

简化 slot、slot-scope 作用域插槽的功能,相比更加强大,代码效率更高。

使用:

<child-com>
<template v-slot:header>
头部
</template>
<template v-slot:body>
内容
</template>
</child-com>

简写:

<child-com>
<template #header>
头部
</template>
<template #body>
内容
</template>
</child-com>

17、vue3 中的 vue-router4

createRouter 创建 router 实例,之前的 mode 改为 history 。

import { createRouter,createWebHashHistory } from "vue-router";

const routes = []

const router = createRouter({
history:createWebHashHistory('/'),
routes
}) export default router

在 main.js 内引入的时候,通过 use 引用。

import { createApp } from 'vue'
import App from './App.vue'
import router from "./router/index" const app = createApp(App)
app.use(router)
app.mount('#app')

关于 vue-router4 更新挺多的,更多知识请阅读《 vue-router 4 你真的熟练吗?》文章。

18、render

在 vue3 中,render 函数的参数发生了改变,之前的 h 去掉,变成全局引入,虚拟节点具备扁平的属性结构。

vue3中 render 应用

import { h } from "vue"
export default {
render(){
return h("div", {}, content)
}
}

好了小编今天的文章就到此结束了,喜欢我的可以点个关注哦

Vue3 中有哪些值得深究的知识点?的更多相关文章

  1. 爬虫--requests讲解

    什么是requests? Requests是用Python语言编写,基于urllib,采用Apache2 Licensed 开源协议的HTTP库.它比urllib更加方便,可以节约我们大量的工作,完全 ...

  2. poscms仿站知识点总结(一)

    最近在做基于poscms系统的企业站仿站项目,这个系列用于总结项目中遇到的一些前端问题,至于poscms,待我摸透之后再总结... 进入正题吧,仿站,首先是用仿站小工具把要仿的模板站扒下来,有时候会出 ...

  3. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  4. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  5. Java - 收藏集 -

    Java - 收藏集 -   Java 基础思维导图,让 Java 不再难懂 - 工具资源 - 掘金思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具.了解了思维导图的作用之后, ...

  6. dyld

    一.介绍 在 MacOS 和 iOS 上,可执行程序的启动依赖于 xnu 内核进程运作和动态链接加载器 dyld. dyld 全称 the dynamic link editor,即动态链接器,其本质 ...

  7. 也说python的类--基于python3.5

    在面向对象的语言中,除了方法.对象,剩下的一大重点就是类了,从意义上来讲,类就是对具有相同行为对象的归纳.当一个或多个对象有相同属性.方法等共同特征的时候,我们就可以把它归纳到同一个类当中.在使用上来 ...

  8. [操作系统实验lab3]实验报告

    [感受] 这次操作系统实验感觉还是比较难的,除了因为助教老师笔误引发的2个错误外,还有一些关键性的理解的地方感觉还没有很到位,这些天一直在不断地消化.理解Lab3里的内容,到现在感觉比Lab2里面所蕴 ...

  9. sqoop1.99.4安装与简介

    1.什么是sqoop clouder公司开发的一个在关系数据库和hdfs,hive之间数据导入导出的一个工具 2.版本及其区别 现在分为sqoop1和sqoop2 1)架构图(sqoop1和hadoo ...

随机推荐

  1. [转]浅谈电路设计中应用DDR3处理缓存问题

    本文转自:浅谈电路设计中应用DDR3处理缓存问题_若海人生的专栏-CSDN博客 DDR系列SDRAM存储芯片的高速率.高集成度和低成本使其理所当然成为存储芯片中的一霸.在PC和消费电子领域自是如此,它 ...

  2. SpringBoot中使用@ConfigurationProperties提示:Configuration Annotation Processor not found in classpath

    问题 Springboot1.5以上版本,在使用 @ConfigurationProperties注解的时候会提示Spring Boot Configuration Annotation Proces ...

  3. Alpha冲刺.2李霆政

    一.基本情况 队名:不行就摆了吧 组长博客:https://www.cnblogs.com/Microsoft-hc/p/15534079.html 小组人数: 8 二.冲刺概况汇报 谢小龙 过去两天 ...

  4. Java 关键字之 final

    欢迎学习 Java 基础文章系列之 final 关键字 final 代表什么意思? final 通常是指无法被改变或者不能被改变的,什么情况下不想被改变呢? 不想改变可能有两种原因:设计或者效率. 在 ...

  5. LOTO示波器实测——光照强度传感器

    loto最近推出了很多的周边传感器模块的实测案例,本文介绍和演示LOTO示波器实测光照强度传感器的使用. 下图就是主角感光模块,可以用来测量光照强度. 这个模块也很简单,只有3个引脚,一个电源,3.3 ...

  6. 菜鸡的Java笔记 第十九 - java 继承

    继承性的主要目的,继承的实现,继承的限制                继承是面向对象中的第二大主要特点,其核心的本质在于:可以将父类的功能一直沿用下去                为什么需要继承? ...

  7. NOIP2021游记(退役记)

    11月 13日 停课了 学了一上午+一晚上的分块. 下午月赛切掉两道题之后xzh发现E题是道树剖,果断开始切E. 结果: 做了快两个小时还是0分. 11月 14日 上午把黄题冲上了100,绿题冲上了5 ...

  8. Java的脚本机制、编译器API

    学习 xxl-job 定时任务时了解到基于 JVM 的 Grovvy 脚本语言.搭建 Jenkins 时知道了编译API 1. Java 脚本机制 Java 的脚本 API 可以让我们调用 JavaS ...

  9. vite2 + vite.config.js 比较坑的环境变量,vite2模式的使用

    想在vite.config.js 里面判断一下环境,看看是不是开发环境,查了一下官网(https://cn.vitejs.dev/guide/env-and-mode.html),说是 可以使用 im ...

  10. [atAGC052D]Equal LIS

    令$f_{i}$表示以$i$为结尾的最长上升子序列,显然可以快速预处理 令$L=\max_{i=1}^{n}f_{i}$,当$L$为偶数,考虑如下构造-- 将所有$f_{i}\le \frac{L}{ ...