热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

搞不动Vue3.0的源码,先做个API调用师也行(新人踩坑初试)

作为一个刚刚入行工作不久的前端菜鸟,Vue2.x都没整熟练。但看着身边人都在学习Vue3,我也不敢怠慢,毕竟Vue3正式版已经发布两个月了

作为一个刚刚入行工作不久的前端菜鸟,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。比如:

// 可以定义一个name
imoprt {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

四、生命周期


  • setup() :开始创建组件之前,在beforeCreatecreated之前执行。创建的是datamethod
  • onBeforeMount() : 组件挂载到节点上之前执行的函数。
  • onMounted() : 组件挂载完成后执行的函数。(以上初始化阶段)
  • onBeforeUpdate(): 组件更新之前执行的函数。
  • onUpdated(): 组件更新完成之后执行的函数。(更新阶段)
  • onBeforeUnmount(): 组件卸载之前执行的函数。
  • onUnmounted(): 组件卸载完成后执行的函数。 (卸载阶段)清除计时器,定时器,清除绑定事件,window、document上的事件,清除第三方实例释放内存。
  • onActivated(): 被包含在中的组件,会多出两个生命周期钩子函数。被激活时执行。
  • onDeactivated(): 比如从 A 组件,切换到 B 组件,A 组件消失时执行。
  • 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方法对计算属性进行处理。

姓:
名:
全名: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的控制。大大的提高了组件的可复用性和封装性。



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

// index.html


// teleport组件


八、Suspense


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


 


推荐阅读
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
author-avatar
卡吉米国际早教_763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有