如何独立封装vue3选项式Api(重点)和组合式Api的生命周期钩子函数

简介: 相信玩过vue3的同学们,大部分应该都了解或者使用过vue2吧,那么对选项式的api就不会陌生,或者你不熟悉名字,看一下下面的代码就非常清楚了。

image.png


本文主要通过代码来展示,如何封装选项式Api的生命周期钩子函数(骚操作)和组合式Api的生命周期钩子函数,以及他们之间的不同之处。


1、一个组件中同时使用组合式api和选项式api


相信玩过vue3的同学们,大部分应该都了解或者使用过vue2吧,那么对选项式的api就不会陌生,或者你不熟悉名字,看一下下面的代码就非常清楚了。


<template>
  <div>
    Test
  </div>
</template>
<script>
// 选项式api代码
export default {
  name: 'Test',
  mounted() {
    console.log('选项是Api: mounted 第一个')
  },
  mounted() {
    console.log('选项是Api: mounted 第二个')
  },
}
</script>
<script setup>
// 组合式api代码
import { onMounted } from 'vue'
  onMounted(() => {
    console.log('组合式Api:Setup中的onMounted 第一个')
  })
  onMounted(() => {
    console.log('组合式Api:Setup中的onMounted 第二个')
  })
</script>


执行的结果是


// 组合式Api:Setup中的onMounted 第一个
// 组合式Api:Setup中的onMounted 第二个
// 选项是Api: mounted 第二个


可以发现组合式Api的生命周期在Vue3中会顺序执行,而选项式Api的生命周期钩子只会执行最后一个,也就是存在覆盖的问题,但是在选项式Api中可以设置组件的name属性。


2、看一下vue-router中的钩子函数


<template>
  <div>
    <button type="button" class="btn btn-primary" @click="jumpClick">跳转到详情页</button>
  </div>
</template>
<script>
export default {
  name: 'Test',
  beforeRouteEnter(to, from, next) {
    next(vm => {
      console.log('选项式Api:vue-router中的beforeRouteEnter钩子函数')
    });
  },
  // beforeRouteLeave(to, from, next) {
  //   next(vm => {
  //     console.log('选项式Api:vue-router中的beforeRouteEnter钩子函数')
  //   });
  // },
}
</script>
<script setup>
import { onMounted } from 'vue'
import { useRouter, onBeforeRouteLeave } from 'vue-router'
  const router = useRouter()
  onBeforeRouteLeave ((to, from) => {
    console.log('组合式Api:vue-router中的onBeforeRouteLeave')
  })
  const jumpClick = () => {
    router.push('test-detail')
  }
</script>


刷新页面后,页面中只有一个按钮,并查看控制台console.log,你可以发现选项式api中的beforeRouteEnter钩子函数执行了。这个钩子函数比较特殊。在渲染组件前调用,也就是组件实例还没被创建。 点击按钮后跳转到另外一个测试页面,然后可以看到控制台执行了,组合式Api中的 onBeforeRouteLeave钩子函数的console.log。


在选项式Api中我注释了一段代码: 写在这里不执行的,在下面setup生命周期执行是没问题的,现在还不清楚是不是我代码写的那里有什么问题????


3、封装组合式Api中的钩子函数


<script setup>
import { onMounted } from 'vue'
import { useRouter, onBeforeRouteLeave } from 'vue-router'
import { useCompositionHooks } from '@/hooks/useHooks'
  onMounted(() => {
    console.log('在本组件执行,组合式Api: onMounted')
  })
  const router = useRouter()
  onBeforeRouteLeave ((to, from) => {
    console.log('组合式Api:vue-router中的onBeforeRouteLeave')
  })
  useCompositionHooks()
  const jumpClick = () => {
    router.push('test-detail')
  }
</script>


以及useHooks文件中的封装


export function useCompositionHooks() {
  onMounted(() => {
    console.log('封装起来的组合式Api: onMounted')
  })
  onBeforeRouteLeave ((to, from) => {
    console.log('封装起来的组合式Api:vue-router中的onBeforeRouteLeave')
  })
}


就是添加了两个钩子函数的封装,我们来看看执行情况


// 在本组件执行,组合式Api: onMounted
// 封装起来的组合式Api: onMounted


再来看一下点击跳转按钮的执行


//组合式Api:vue-router中的onBeforeRouteLeave
// 封装起来的组合式Api:vue-router中的onBeforeRouteLeave


在组合式api的执行过程中,会根据代码的执行顺序进行,钩子函数可多次注入,但会根据代码前后顺序调用。


4、封装选项式api的钩子函数(骚操作一下)


<script>
import { useOptionsHooks } from "@/hooks/useHooks"
const useOptions = useOptionsHooks('test')
export default {
  beforeRouteEnter(to, from, next) {
    next(vm => {
      console.log('在本组件执行,选项式Api: beforeRouteEnter')
    });
  },
  ...useOptions,
}
</script>


再来看一下useHooks文件中的封装


export function useOptionsHooks(componentName: string) {
  return {
    name: componentName,
    beforeRouteEnter(to: any, from: any, next: any) {
      next(() => {
        console.log('封装选项式Api:vue-router中的beforeRouteEnter钩子函数')
      });
    },
  }
}


执行结果如下,页面刷新后


// 封装选项式Api:vue-router中的beforeRouteEnter钩子函数


骚操作:通过对外封装一个useOptionsHooks, return返回的就是选项式api使用的钩子。然后再export default 中 通过对函数调用后的对象进行解构展开


如果我们将export default中的代码位置进行调换


export default {
  ...useOptions,
  beforeRouteEnter(to, from, next) {
    next(vm => {
      console.log('在本组件执行,选项式Api: beforeRouteEnter')
    });
  },
}


执行结果如下


// 在本组件执行,选项式Api: beforeRouteEnter


会根据当前代码的顺序位置,后面的代码如果包含前面的钩子函数,则会把前面声明的钩子函数内容覆盖掉。


5、总结


  • vue3组合式api,本身封装通用性就更强,现在对钩子函数的独立封装又有了新的认识
  • vue3如果想设置组件的name名称,则可以在该组件位置,添加一个选项式api包裹设置name即可。
  • 如果要使用 vue-router中的 beforeRouteEnter钩子函数,就得在选项式api中进行声明和使用。
  • vue3 选项
目录
相关文章
|
2月前
|
监控 JavaScript 前端开发
vue学习第十二章(生命周期)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。本文深入探讨了Vue实例的生命周期,从初始化到销毁各阶段的关键钩子函数及其应用场景,帮助你更好地理解Vue的工作原理。如果你觉得有帮助,欢迎关注我,将持续分享更多优质内容!🎉🎉🎉
37 1
vue学习第十二章(生命周期)
|
3月前
|
缓存 JavaScript 前端开发
深入理解 Vue 3 的 Composition API 与新特性
本文详细探讨了 Vue 3 中的 Composition API,包括 setup 函数的使用、响应式数据管理(ref、reactive、toRefs 和 toRef)、侦听器(watch 和 watchEffect)以及计算属性(computed)。我们还介绍了自定义 Hooks 的创建与使用,分析了 Vue 2 与 Vue 3 在响应式系统上的重要区别,并概述了组件生命周期钩子、Fragments、Teleport 和 Suspense 等新特性。通过这些内容,读者将能更深入地理解 Vue 3 的设计理念及其在构建现代前端应用中的优势。
56 1
深入理解 Vue 3 的 Composition API 与新特性
|
2月前
|
JavaScript 前端开发 API
Vue 3新特性详解:Composition API的威力
【10月更文挑战第25天】Vue 3 引入的 Composition API 是一组用于组织和复用组件逻辑的新 API。相比 Options API,它提供了更灵活的结构,便于逻辑复用和代码组织,特别适合复杂组件。本文将探讨 Composition API 的优势,并通过示例代码展示其基本用法,帮助开发者更好地理解和应用这一强大工具。
41 2
|
3月前
|
JavaScript
Vue 的父组件和子组件生命周期钩子执行顺序
在 Vue 中,父组件和子组件的生命周期钩子执行顺序如下:
|
3月前
|
JavaScript
|
3月前
|
JavaScript
vue3 生命周期
【10月更文挑战第14天】vue3 生命周期
|
3月前
|
API
《vue3第四章》Composition API 的优势,包含Options API 存在的问题、Composition API 的优势
《vue3第四章》Composition API 的优势,包含Options API 存在的问题、Composition API 的优势
32 0
|
3月前
|
JavaScript 前端开发 API
《vue3第六章》其他,包含:全局API的转移、其他改变
《vue3第六章》其他,包含:全局API的转移、其他改变
26 0
|
3月前
|
JavaScript 前端开发 API
深入探索挖掘vue3 生命周期
【10月更文挑战第10天】
60 0
|
2天前
|
JSON API 数据格式
京东商品SKU价格接口(Jd.item_get)丨京东API接口指南
京东商品SKU价格接口(Jd.item_get)是京东开放平台提供的API,用于获取商品详细信息及价格。开发者需先注册账号、申请权限并获取密钥,随后通过HTTP请求调用API,传入商品ID等参数,返回JSON格式的商品信息,包括价格、原价等。接口支持GET/POST方式,适用于Python等语言的开发环境。
31 11