vue  composition-api 封装组合式函数的操作方法

 更新时间:2022年10月10日 11:14:17   作者:前端迷悟  
在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数,这篇文章主要介绍了vue  composition-api 封装组合式函数的操作方法,需要的朋友可以参考下

介绍

在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。

Composables 函数就是利用 Vue3 提出的 Composition API ,封装出的一些可以复用的组合式函数,目前 Vue2 也可以使用(2.7 版本可以直接使用,2.6 需要引入另外composition-api的插件)。还没写过这种风格代码的同学,可以先看引用的官方文档的两个链接,介绍的比较详细。

下面我简单介绍一下: 组合式 API 的灵感来自Hooks,也是目前流行的函数式编程的思想,便于逻辑复用、测试以及类型推导,编写Vue业务代码的时候会更加的灵活。但组合式 API 不等于函数式编程,组合式 API 的特点是基于Vue数据响应系统的,而函数式编程通常强调数据不可变的。 组合式API 包括:

  • 响应式相关(ref、reactive、computed、watch 等)
  • 生命周期钩子(onMounted 和 onUnmounted 等)
  • provide、inject 等

一个简单的组合式函数示例和使用:

import { computed } from 'vue'

export function useAdd(a,b) {
 return computed(() => a.value + b.value)
}
import { ref } from 'vue'
import { useAdd } from './add.js
const a = ref(1)
const b = ref(2)
const c = useAdd(a,b)

最佳实践

像写工具函数一样,组合式函数也要设计好函数的接口,设计函数入参的类型以及默认值和返回值是什么样,以及后期的可扩展性。

1. options对象化

编写组合式函数时如果传入一些配置参数,可以把配置参数设计为 options 对象,好处就是不需要记住参数的位置,以及方便后期的扩展,可通过 TS 类型提示。如 Lodash 的防抖节流函数,配置项也是放在 options 对象里的。 函数内部实现通过解构获取 options 的配置项,可以赋值默认值

export function useTitle(newTitle = null, options = {}) {
  const {
    document = defaultDocument,
    observe = false,
    titleTemplate = '%s',
  } = options
  // ...
}

2. 动态返回

通过 options 的配置项,可以动态返回不同的值

export default useNow(options) {
  const { controls = false } = options;

  // ...

  if (!controls) {
    return value;
  } else {
     return { value, controlAction1, controlAction2 };
  }
}

如:useNow vueuse.org/core/useNow…

import { useNow } from '@vueuse/core'

const now = useNow()

// 返回控制暂停/恢复的函数
const { now, pause, resume } = useNow({ controls: true })

3. 灵活地使用ref

入参在使用的过程中可能是普通类型或 ref 类型:

type MaybeRef<T> = Ref<T> | T

如果函数内部期待入参是普通类型,但是使用者可能传入响应式的 Ref 类型,可以使用 unref 函数获取值,兼容 ref类型:

import { unref } from 'vue'

function useFeature(maybeRef) {
  const value = unref(maybeRef)
  //...
}

unref 的实现:

function unref <T> (r:Ref<T>|T): T) {
  return isRef(r) ? r.value : r
}

如果函数内部入参是 ref 类型的,可以再使用 ref 函数包裹,该函数如果传入一个ref类型的参数会原样返回。

import { ref, watch } from 'vue'
export function useTitle(newTitle) {
  const title = ref(newTitle || document.title)
  watch(title, (t) => {
    if (t != null) document.title = t}, 
        { immediate: true }
  )
  return title
}

4. 异步变同步

通过响应式数据的连接,不必使用await,在等待异步请求返回后将数据进行更新。如:

const { res } = useFetch('https://xxx.com/').json()
const data = computed(() => res.value?.data)
import { shallowRef } from 'vue'

export function useFetch<>(url) {
    const data = shallowRef(null)
    const error = shallowRef(null)
    fetch(unref(url)).then(r => r.json())
    .then(r => data.value = r)
    .catch(e => error.value = e)

  return {
        data,
        error
    }
}

5. 简单的状态管理

由于响应性系统与组件层是解耦的,简单的场景下我们可以使用 reactive 创建一个响应式对象,在多个组件实例间共享数据。

// store.js
import { reactive } from 'vue'

export const store = reactive({
  a: 0,
  b: 1
})

复杂场景则需要使用 pinia 进行状态管理

参考资料

到此这篇关于vue composition-api 封装组合式函数的操作方法的文章就介绍到这了,更多相关vue composition-api 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-i18n使用$t导致的Typescript报错问题及解决

    vue-i18n使用$t导致的Typescript报错问题及解决

    在Vue3项目中使用vue-i18n v9.14.0时,$t属性可能因类型未声明导致TS报错,解决方案是创建src/vue-i18n.d.ts文件,添加至tsconfig.json的include项中,声明$t属性类型
    2025-08-08
  • 非Vuex实现的登录状态判断封装实例代码

    非Vuex实现的登录状态判断封装实例代码

    这篇文章主要给大家介绍了关于非Vuex实现的登录状态判断封装的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • 详解在vue使用weixin-js-sdk常见使用方法

    详解在vue使用weixin-js-sdk常见使用方法

    这篇文章主要介绍了 详解在vue使用weixin-js-sdk常见使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Vue混入mixins分发组件可复用功能

    Vue混入mixins分发组件可复用功能

    混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项
    2022-09-09
  • 关于Vue3使用axios的配置教程详解

    关于Vue3使用axios的配置教程详解

    道axios是一个库,并不是vue中的第三方插件,下面这篇文章主要给大家介绍了关于Vue3使用axios的配置教程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Vue3 全局使用按钮截流指令示例代码

    Vue3 全局使用按钮截流指令示例代码

    这篇文章主要介绍了Vue3 全局使用按钮截流指令示例代码,Vue2与Vue3中的自定义指令实现方式略有不同,但实现的按钮截流功能是类似的,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • vue和uniapp页面实现自动滚动到最底部

    vue和uniapp页面实现自动滚动到最底部

    这篇文章主要介绍了vue和uniapp页面实现自动滚动到最底部方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Vue结合echarts实现绘制水滴图

    Vue结合echarts实现绘制水滴图

    这篇文章主要为大家详细介绍了Vue如何结合echarts实现水滴图的绘制,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • 深入了解Vue3模板编译原理

    深入了解Vue3模板编译原理

    这篇文章主要介绍了深入了解Vue3模板编译原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • element-ui中this.$confirm提示文字中部分有颜色自定义方法

    element-ui中this.$confirm提示文字中部分有颜色自定义方法

    this.$confirm是一个Vue.js中的弹窗组件,其样式可以通过CSS进行自定义,下面这篇文章主要给大家介绍了关于element-ui中this.$confirm提示文字中部分有颜色的自定义方法,需要的朋友可以参考下
    2024-02-02

最新评论