热门标签 | 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插槽分别返回异步组件成功或者失败的结果。


 


推荐阅读
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 深入解析 Vue3 中的响应式 API:shallowReactive、shallowRef、triggerRef 和 customRef 的使用与原理
    深入解析 Vue3 中的响应式 API:shallowReactive、shallowRef、triggerRef 和 customRef 的使用与原理 ... [详细]
  • 大家好,我是梅巴哥er。本文将深入探讨Redux框架中的第三个实战案例,具体实现每两秒自动点击按钮以触发颜色变化的功能。该案例中,一个关键点在于是否需要使用异步操作来处理定时任务,我们将详细分析其必要性和实现方式。通过这一实例,读者可以更好地理解Redux在实际项目中的应用及其异步处理机制。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • 本文介绍了 Vue 开发的入门指南,重点讲解了开发环境的配置与项目的基本搭建。推荐使用 WebStorm 作为 IDE,其下载地址为 。安装时请选择适合您操作系统的版本,并通过 获取激活码。WebStorm 是前端开发者的理想选择,提供了丰富的功能和强大的代码编辑能力。 ... [详细]
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • Vue 实战基础教程第9讲:深入理解计算属性与侦听器的高效使用
    Vue 实战基础教程第9讲:深入理解计算属性与侦听器的高效使用 ... [详细]
  • 在深入研究 React 项目的过程中,特别是在探索 react-router 源码时,我发现了其中蕴含的中间件概念。这激发了我对中间件的进一步思考与整理。本文将详细探讨 Redux 中间件的原理及其在实际项目中的应用,帮助读者更好地理解和使用这一强大工具。通过具体示例和代码解析,我们将揭示中间件如何提升应用的状态管理和异步操作处理能力。 ... [详细]
  • React项目基础教程第五课:深入解析组件间通信机制 ... [详细]
  • 在使用 `useSelector` 选择器时,发现分派操作后状态未能实时更新。这可能是由于 React 组件的渲染机制或 Redux 的状态管理问题导致的。建议检查 `useSelector` 的依赖项和 `dispatch` 的调用时机,确保状态变化能够正确触发组件重新渲染。此外,可以考虑使用 `useEffect` 钩子来监听状态变化,以确保及时更新。 ... [详细]
  • React组件是构成用户界面的基本单元,每个组件都封装了特定的功能和逻辑,具备高度的独立性和可复用性。通过将不同大小和功能的组件组合在一起,可以构建出复杂且功能丰富的页面,类似于拼图游戏中的各个部分,最终形成一个完整的视觉效果。 ... [详细]
  • 这篇文章将揭示 Vue 和 React 组件库中五个鲜为人知的强大工具。这些工具均以纯 JavaScript 实现,功能卓越。其中,async-validator 是一个数据验证插件,不仅预置了 URL 和电子邮件的验证规则,还支持异步验证功能。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • React 实现 Post 请求下载 PDF 文件的解决方案
    在 React 应用中实现通过 POST 请求下载 PDF 文件的功能,本文提供了完整的代码示例。具体实现包括设置状态以显示加载提示,并通过控制台日志记录下载索引,确保请求的正确性和用户体验。此外,还详细介绍了如何处理响应流并将其转换为可下载的 PDF 文件,适用于需要安全传输数据的场景。 ... [详细]
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社区 版权所有