# 有序的写组合式API

<script setup>
    // import 语句
    // Props (defineProps);
    // Emits (defineEmits);
    // 响应式变量定义
    // computed 
    // Watchers
    // 函数
    // 生命周期
    // Expose (defineExpose);
</script>

# 最终解决方案

我们不如将前面的方案进行融合一下,抽取出多个 useCount 函数放在当前vue组件内,而不是抽成单个Hooks文件。并且在多个 useCount 函数中我们还是按照前面约定的规范,按照顺序去写ref变量、computed、函数的代码。

最终得出的最佳实践如下图

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

    const { count1, doubleCount1, increment1 } = useCount1();
    const { count2, doubleCount2, increment2 } = useCount1();
    const { count3, doubleCount3, increment3 } = useCount1();
    const { count4, doubleCount4, increment4 } = useCount1();
    const { count5, doubleCount5, increment5 } = useCount1();

    function useCount1() {
        const count1 = ref(0);
        const doubleCount1 = computed(() => count1.value * 2);

        function increment1() {
            count1.value++;
        }

        return { count1, doubleCount1, increment1 }
    }
    function useCount2() {
        // 省略
    }
    function useCount3() {
        // 省略
    }
    function useCount4() {
        // 省略
    }
    function useCount5() {
        // 省略
    }
</script>

上面这种写法有几个优势

  • 我们将每个 count 的逻辑都抽取成单独的 useCount 函数,并且这些函数都在当前vue文件中,没有将其抽取成hooks文件。如果哪天 useCount1 中的逻辑需要给其他组件使用,我们只需要新建一个 useCount文件,然后直接将 useCount1 函数的代码移动到新建的文件中就可以了
  • 如果我们想查看 doubleCount1 和 increment1 中的逻辑,只需要找到 useCount1 函数,关于count1 相关的逻辑都在这个函数里面,无需像之前那样翻山越岭几十行代码才能从 doubleCount1 的代码跳转到 increment1 的代码

# 总结

本文介绍了使用 Composition API 的最佳实践,规则如下

  • 首先约定了一个代码规范,Composition API 按照约定的顺序进行书写(书写顺序可以按照公司代码规范适当调整)。并且同一种组合式API的代码写在同一个地方,比如所有的porps放在一块、所有的emits放在一块、所有的computed放在一块
  • 如果逻辑能够多个组件复用就抽取成单独的hooks文件。
  • 如果逻辑不能给多个组件复用,就将逻辑抽取成useXXX函数,将useXXX函数的代码还是放到当前组件中

第一个好处是如果某天useXXX函数中的逻辑需要给其他组件复用,我们只需要将useXXX函数的代码移到新建的hooks文件中即可。

第二个好处是我们想查看某个业务逻辑的代码,只需要在对应的useXXX函数中去找即可。无需在整个vue文件中翻山越岭从computed模块的代码跳转到function函数的代码。