Vue3:使用 Composition API 不需要 Pinia?

在 Vue.js 开发的动态环境中,在单个组件中处理复杂的业务逻辑可能会导致笨重的文件和维护噩梦。虽然 Pinia 提供集中式状态管理,但仅依赖它来处理复杂的业务逻辑可能会导致代码混乱。本文探讨了使用 Composition API 的替代方法,说明开发人员如何将数据和逻辑封装在自定义 hooks 中以实现高效的状态管理。

驾驭复杂的业务逻辑

在日常开发中,经常会出现功能变得过于复杂而无法限制在单个 Vue.js 组件中的情况。分解组件是合乎逻辑的解决方案,但这带来了在组件之间共享数据和业务逻辑的挑战。虽然 Pinia 在这方面很受欢迎,但如果广泛用于所有复杂的业务逻辑,它就会变得不堪重负。

拥抱 Composition API 和自定义 Hook

一个引人注目的替代方案是利用 Composition API 将数据和业务逻辑封装在自定义 hooks 中。这些钩子(以 useStore 函数为例)成为状态定义、更新和特定业务逻辑的中心。反过来,组件只需要与这些钩子公开的状态和方法进行交互,从而抽象出内部的复杂性。

ini 复制代码
// 使用 Composition API 自定义 hook
import { computed, ref } from "vue";

// 在 useStore 函数外部定义 count 变量
const count = ref(0);
const doubleCount = computed(() => {
  return count.value * 2;
});

export const useStore = () => {
  function increment() {
    count.value = count.value + 1;
  }

  function decrement() {
    count.value = count.value - 1;
  }

  return {
    count,
    doubleCount,
    increment,
    decrement,
  };
};

孤立的 Hook 调用的陷阱

CountValueCountBtn 等组件在其 setup 函数中独立调用 useStore 挂钩时,就会出现挑战。本文揭示了每次调用时创建 count 变量的独立实例的陷阱,从而导致组件之间的状态更新不一致。

javascript 复制代码
// CountValue.vue component
<template>
  <p>count's value is {{ count }}</p>
  <p>doubleCount's value is {{ doubleCount }}</p>
</template>

<script setup lang="ts">
import { useStore } from "./store";

// 对 useStore 的独立调用创建独立的 count 实例
const { count, doubleCount } = useStore();
</script>

// CountBtn.vue component
<template>
  <button @click="decrement">count--</button>
  <button @click="increment">count++</button>
</template>

<script setup lang="ts">
import { useStore } from "./store";

// 对 useStore 的独立调用创建独立的 count 实例
const { decrement, increment } = useStore();
</script>

协调组件之间的状态

为了克服这一挑战,一种优化方法是将 count 变量的定义重新定位到 useStore 函数之外。这可确保调用 useStore hook 的所有组件共享 count 变量的同一实例,从而促进同步状态管理。

ini 复制代码
// 将计数定义移至 useStore 函数之外
import { computed, ref } from "vue";

const count = ref(0);
const doubleCount = computed(() => {
  return count.value * 2;
});

export const useStore = () => {
  function increment() {
    count.value = count.value + 1;
  }

  function decrement() {
    count.value = count.value - 1;
  }

  return {
    count,
    doubleCount,
    increment,
    decrement,
  };
};

在 Pinia 似乎难以应对复杂业务逻辑的各个方面的情况下,Composition API 提供了一个干净、有组织的替代方案。通过将数据和逻辑封装在自定义钩子中,开发人员可以在 Vue.js 应用程序中的模块化和高效状态管理之间取得平衡。

本文强调了 Composition API 在构建 Vue.js 解决方案中的多功能性,以最大限度地提高灵活性和可维护性。通过采用自定义钩子,开发人员可以编写符合 Vue.js 原则的有组织、可读的代码。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

相关推荐
时清云31 分钟前
【算法】合并两个有序链表
前端·算法·面试
小爱丨同学38 分钟前
宏队列和微队列
前端·javascript
持久的棒棒君1 小时前
ElementUI 2.x 输入框回车后在调用接口进行远程搜索功能
前端·javascript·elementui
2401_857297911 小时前
秋招内推2025-招联金融
java·前端·算法·金融·求职招聘
一 乐1 小时前
租拼车平台|小区租拼车管理|基于java的小区租拼车管理信息系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·微信·notepad++·拼车
undefined&&懒洋洋2 小时前
Web和UE5像素流送、通信教程
前端·ue5
大前端爱好者4 小时前
React 19 新特性详解
前端
小程xy4 小时前
react 知识点汇总(非常全面)
前端·javascript·react.js
随云6324 小时前
WebGL编程指南之着色器语言GLSL ES(入门GLSL ES这篇就够了)
前端·webgl
随云6324 小时前
WebGL编程指南之进入三维世界
前端·webgl