作为一个刚刚入行工作不久的前端菜鸟,Vue2.x都没整熟练。但看着身边人都在学习Vue3,我也不敢怠慢,毕竟Vue3正式版已经发布两个月了,我还是耐着性子好好的阅读了一下Vue3.0的文档。没有其他大佬们上来就看源码的气势,但我还是想做个学习笔记,至少先做个API调用师吧。

为啥又得掉头发,搞学习了?

为什么要学习Vue3.0,它和Vue2.x有哪些异同之处?我带着这个问题,开始了自己的学习。这几天学完后的感受,我总结了一下,大概有如下几点吧。

  1. 首先,Vue3.0使用TypeScript写的,对TypeScript兼容更好,但是对于Vue之前的语法并没有进行颠覆性的改变,你如果使用Vue2.x的语法,各种还能写,但是建议还是不要套着Vue3.0壳,去写Vue2。

  2. Vue3.0最大的升级就是不再限制于Options API,可以使用了Composition API,啥意思呢?以前写一个组件,需要写data、methods、watch、computed,写一个功能需要反复横跳,一会儿去data里找数据,一会儿去methods里找方法。而现在有了组合式API,你可以将data、methods等等搞在一块,单独封装调用,功能的抽离更加方便。

  3. 搞明白了this。以前写的时候不论找谁,都先搞个this.放这里,至于后面的内容何时何地挂在到了this上,摸鱼工程师是不管的。如果是一份祖传代码,还写了一大堆的Mixin混入的话,this就彻底成为了一个黑盒,不去深究谁也不知道里面发生了,但摸鱼工程师还不怕,调就完事了。Vue3.0最重要的API,setup()就可以很好的解决this的问题。

哪些内容最重要?

一、 setup

  1. setup作为Vue3.0组合API的统一入口函数,它的调用是在beforeUpdate生命周期之前,所以在调用setup函数时还没有生成实例,setup里是就没有this可以调用。

  2. setup里有两个参数,一个是props,一个是ctx,props用来获取属性,比如父组件给子组件传值,在子组件中就用props获取,ctx获取方法和其他内容。

  3. 在setup里定义的状态、方法都要用return返回,只有return过才能在组件里进行动态响应。

// 父组件import { ref, defineComponent } from 'vue'import Son from '@/components/provide/Son.vue'export default defineComponent({components: { Son }, setup() {const username = ref('小明')return { username } }})// 子组件import { defineComponent } from 'vue'export default defineComponent({props: ['username'], setup(props) {console.log(props.username) }})

二、 ref、reactive和toRefs

这两个API都是用来设置初始值的,两个用法有点小差异,都需要先解构才能使用。首先说ref,ref直接包含初始值就可以,但是在调用的时候一定记得是.value的形式,如果要在组件中动态响应,那么还要return。比如:

// 可以定义一个nameimoprt {defineComponent, ref} from 'vue'export default defineComponent({  setup() {      const name = ref('青山')        console.log(name.value) // 青山        return {name}  }})

而reactive包裹的是一个对象,使用它之前也需要先从vue中解构,用xx.yy来调用,也要return出去才能使用,但是注意,reactive不能够直接导出,当有多个属性值时,可以使用toRefs来处理,将reactive对象转换成ref类型。如果直接导出,数据是不能响应的。例如:

imoprt {defineComponent, reactive, toRefs} from 'vue'export default defineComponent({  setup() {      const data = reactive({            state: ['青山','隐隐','绿水','悠悠'],            selectState: '',            selectFun: (index: number)=>{                data.selectState = data.state[index];            }        })        const refData = toRefs(data)        return { ...refData }  }})

三、isRef

isRef是用来判断创建的数据是否为ref类型,是的话就是true,如果不是,例如reactive就是false。通过使用toRefs来转换reactive类型,可以把reactive对象中的属性转换为ref,下面的例子可以看出。

const data = reactive({    count : 0})const count = ref(0)console.log(isRef(count))           // trueconsole.log(isRef(data))            // falseconsole.log(isRef(data.count))      // falseconst refData = toRefs(data)console.log(isRef(refData.count))   // true

四、生命周期

1. setup() :开始创建组件之前,在beforeCreatecreated之前执行。创建的是datamethod

2. onBeforeMount() : 组件挂载到节点上之前执行的函数。

3. onMounted() : 组件挂载完成后执行的函数。(以上初始化阶段)

4. onBeforeUpdate(): 组件更新之前执行的函数。

5. onUpdated(): 组件更新完成之后执行的函数。(更新阶段)

6. onBeforeUnmount(): 组件卸载之前执行的函数。

7. onUnmounted(): 组件卸载完成后执行的函数。(卸载阶段)清除计时器,定时器,清除绑定事件,window、document上的事件,清除第三方实例释放内存。

8. onActivated(): 被包含在中的组件,会多出两个生命周期钩子函数。被激活时执行。

9. onDeactivated(): 比如从 A 组件,切换到 B 组件,A 组件消失时执行。

10. onErrorCaptured(): 当捕获一个来自子孙组件的异常时激活钩子函数。(错误捕获)

五、computed 计算属性

  • 计算属性的基本使用,首先创建一个只读的计算属性。Vue3.0使用计算属性也要先解构出来

import {ref, computed} from 'vue'export default {    setup() {        const state = ref('hello world')        const split = computed(() => state.value.split(''))        return { state, split }    }}
  • 计算属性的get & set方法使用。通过get方法可以获取数据,通过set方法设置。比如下面的例子,可以通过get方法return出computed,可以通过set方法对计算属性进行处理。

姓:"firstName" type="text">名:"lastName" type="text">全名:"fullName" type="text">import {ref, computed} from 'vue'export default {    setup() {        const firstName = ref('');        const lastName = ref('');        const fullName = computed({            get() {                return firstName.value + lastName.value            },            set(val) {                firstName.value = val.slice(0,1)                lastName.value = val.slice(1)            }        })        return { firstName, lastName, fullName }    }}

六、Watch侦听

  • watch的使用也需要解构。

  • 单一数据的侦听,如果是一个ref类型,第一个参数直接写数据名,第二个参数是回调。

import {watch} from 'vue'watch(state,()=>{})
  • 单一数据的侦听,如果是一个reactive类型,第一个参数写成返回某个属性值。

watch(    ()=> state.number,    (number, preNumber) => {        console.log(number, preNumber)    })
  • 侦听多个数据源,第一个参数用数组,两种类型都有的情况下,ref类型和reactive类型的写法同上。

watch(     [number, ()=> state.count],     (number, preNumber) => {         console.log(number, preNumber)     } )
  • 清除侦听,可以给watch定义一个变量,在事件中调用即可。

const watchStop = watch(  [number, ()=> state.count],  (number, preNumber) => {    console.log(number, preNumber)  })const removeWatch = ()=>{  watchStop()}
  • watchEffect,传入的函数会立即执行并侦听依赖值的变化,如果依赖值变化便会执行。

import { toRefs, reactive, watchEffect } from 'vue'export default { setup () {   const data = reactive({     count: 1,     total: 999   })   const refData = toRefs(data)   /**     1. 传入的函数立即执行     2. 当watchEffect传入的函数依赖值有变化时,会再次触发watchEffect函数   */   watchEffect(() => {     console.log(data.count)   })   setTimeout(() => {     data.count = data.count + 2 // 【会】触发watchEffect函数     data.total = data.total + 2 // 【不会】触发watchEffect函数   }, 2000)   return {     ...refData   } }}

七、Teleport

  • 瞬移组件或者传送组件,可以将组件独立于Vue组件之外,直接挂载在body下,但仍受Vue的控制。大大的提高了组件的可复用性和封装性。

<template>    <teleport to="body">        <div>xxxdiv>    teleport>template>

  • 也可以直接在index.html中留下,组件里to属性绑定id

// index.html<div id="app">div><div id="teleport-modal">div>// teleport组件<template>    <teleport to="#teleport-modal">        <div>xxxdiv>    teleport>template>

八、Suspense

  • suspense的英文是“悬念”,它提供了两个template插槽分别返回异步组件成功或者失败的结果。

<div>    <suspense>      <template #default>        <AsyncComponent />      template>      <template #fallback>        <h1>loading...h1>      template>    suspense>div>

pb调用键盘钩子的例子_搞不动Vue3.0的源码,先做个API调用师也行(新人踩坑初试)...相关推荐

  1. 1-基于单片机的城市轨道交通列车超速防护系统_里程表设计(原理图+PCB+源码+仿真工程+答辩论文)

    1-基于单片机的城市轨道交通列车超速防护系统_里程表设计(原理图+PCB+源码+仿真工程+答辩论文) 文章目录 1-基于单片机的城市轨道交通列车超速防护系统_里程表设计(原理图+PCB+源码+仿真工程 ...

  2. mysql 线程池源码模块_易语言Mysql线程池2.0模块源码

    易语言Mysql线程池2.0模块源码 易语言Mysql线程池2.0模块源码 系统结构:GetThis,初始化,关闭类线程,线程_测试,其他_附加文本,连接池初始化,取mysql句柄,释放mysql句柄 ...

  3. mysql db模块下载_易语言MySql数据库操作类V1.0模块源码

    易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...

  4. c++调用mysql存储过程_C++中ADO调用MySQL存储过程失败,诡异的语法异常,求解中,附源码...

    C++中ADO调用mysql存储过程失败,诡异的语法错误,求解中,附源码 不管怎么调整,死活都出现下面的错误 C++ADO代码我实在找不到什么错误了,难道是MySQL有什么问题,或者有其他需要注意的地 ...

  5. 探索比特币源码4-JSON-RPC接口的其他调用方法

    探索比特币源码4-JSON-RPC接口的其他调用方法 上一文探索比特币源码3-熟悉RPC接口中练习了使用bitcoin-cli客户端调用JSON-RPC接口的方法. 本文探索JSON-RPC接口的其他 ...

  6. 天天有毒_鸡汤文案类小程序源码

    简介: 天天有毒_鸡汤文案类小程序源码 网盘下载地址: http://kekewl.net/oi8WRaw46rq0 图片:

  7. Redis 源码解读之 Rehash 的调用时机

    Redis 源码解读之 Rehash 的调用时机 背景和问题 本文想要解决的问题 什么时机触发 Rehash 操作? 什么时机实际执行 Rehash 函数? 结论 什么时机触发 Rehash 操作? ...

  8. html圣诞树代码_支持手机选择背景音乐圣诞树源码

    html圣诞树代码_支持手机选择背景音乐圣诞树源码小子在本地测试了下,圣诞树会根据音乐变化起来,挺好看的手机打开显示黑屏的问题,已经修复适配,上传服务器即可,如果加载慢就把远程js和css本地化或者更 ...

  9. v45.05 鸿蒙内核源码分析(Fork) | 一次调用 两次返回 | 百篇博客分析HarmonyOS源码

    孔子于乡党,恂恂如也,似不能言者.其在宗庙朝廷,便便言,唯谨尔. <论语>:乡党篇 百篇博客系列篇.本篇为: v45.xx 鸿蒙内核源码分析(Fork篇) | 一次调用 两次返回 进程管理 ...

最新文章

  1. RHEL8 配置光盘源和yum源
  2. EF 如何更新多对多关系的实体
  3. 深入分析Flex [Bindable] 【转】
  4. linux lvm 简介之二 扩充空间
  5. rr计算机专业英语,《计算机专业英语》电子教本8.pdf
  6. 在web项目启动时,使用监听器来执行某个方法
  7. Linux文件、文件内容搜索大全(find,grep命令)
  8. BZOJ 3098: Hash Killer II(新生必做的水题)
  9. Selenium电脑上怎么下载-Selenium下载和安装图文教程[超详细]
  10. css3多变形,CSS3 clip-path polygon图形构建与动画变换二三事
  11. 对联广告html,Js对联广告代码示例(入门)
  12. EEMD、EMD去噪原理
  13. mixamo进不去_酷站推荐!3D人物动画工具
  14. ssh 提示Connection closed by * 的解决方案
  15. android的反调试方法,Android平台融合多特征的APP反调试方法与流程
  16. 【Linux】动态库与静态库
  17. 【万字干获】阿里妈妈搜索推荐广告预估模型2021思考与实践
  18. 这64所大学官方公布考研【专业课真题】可以直接下载!
  19. linux7team,Centos7 –Team配置
  20. 8000字详解微信生态内的5款增长工具(2019版)

热门文章

  1. 创办私营企业必做的16件事
  2. 程序员的进阶课-架构师之路(11)-最容易理解的红黑树
  3. LightGCN:用于推荐任务的简化并增强的图卷积网络 SIGIR 2020
  4. keras 官方文档
  5. python学习中软件开发知识点_Python 学习知识点总结归纳
  6. C++语言学习(十九)——C++类型识别
  7. intellij idea jdk language level
  8. 微信小程序入门第一天
  9. 在QML应用中实现threading多任务
  10. 乐观锁与悲观锁的应用场景