组合式函数

浮生半日闲 发布于 2023-09-30 23 次阅读


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

组合式函数约定用驼峰命名法命名,并以“use”作为开头。

一个组合式函数可以调用一个或多个其他的组合式函数。

示例

在组件中使用组合式api实现鼠标跟踪功能,方法如下:

<template>
    鼠标位置: {{ x }},{{ y }}
</template>

<script setup lang="ts">
import { onUnmounted, onMounted, ref } from 'vue';

const x = ref(0)
const y = ref(0)

// 监听鼠标移动事件,并更新x和y的值
function update(e: MouseEvent) {
    x.value = e.clientX
    y.value = e.clientY
}

// 监听mounted和unmounted事件,分别添加和移除鼠标移动事件监听器
onMounted(() => document.addEventListener('mousemove', update));
onUnmounted(() => document.removeEventListener('mousemove', update));
</script>

现在,我们想要在多个组件中使用鼠标跟踪功能,那么就可以把这个逻辑通过组合式函数的方法提取到外部文件中:

// mouse.ts
import { onUnmounted, onMounted, ref } from 'vue';

/**
 * 跟踪鼠标的组合式函数
 * @returns 
 */
export function useMouse() {
    const x = ref(0)
    const y = ref(0)

    // 监听鼠标移动事件,并更新x和y的值
    function update(e: MouseEvent) {
        x.value = e.clientX
        y.value = e.clientY
    }

    // 监听mounted和unmounted事件,分别添加和移除鼠标移动事件监听器
    onMounted(() => document.addEventListener('mousemove', update));
    onUnmounted(() => document.removeEventListener('mousemove', update));

    return {x, y}
}

在组件中进行使用:

<template>
    鼠标位置: {{ x }},{{ y }}
</template>

<script setup lang="ts">
import { useMouse } from './mouse'

const { x, y } = useMouse()
</script>

组合式函数的核心逻辑和组合式api完全一致,我们做的只是把它移到一个外部函数中去,并返回需要暴露的状态。