Pinia 中的选项式与组合式写法

举报
周杰伦本人 发表于 2025/06/28 19:06:09 2025/06/28
【摘要】 Pinia 中的选项式与组合式写法在 Pinia 中,你可以使用两种主要的方式来定义 Store:选项式写法 和 组合式写法。这两种写法各有优缺点,选择哪种取决于你的个人偏好和项目需求。1. 选项式写法(Options API)选项式写法是 Pinia 默认的写法,类似于 Vue 2 中的选项式 API。它通过一个对象来定义 Store 的结构,包括 state、getters 和 acti...

Pinia 中的选项式与组合式写法

在 Pinia 中,你可以使用两种主要的方式来定义 Store:选项式写法组合式写法。这两种写法各有优缺点,选择哪种取决于你的个人偏好和项目需求。

1. 选项式写法(Options API)

选项式写法是 Pinia 默认的写法,类似于 Vue 2 中的选项式 API。它通过一个对象来定义 Store 的结构,包括 stategettersactions

示例代码

// stores/talk.js
import { defineStore } from 'pinia';

export const useTalkStore = defineStore('talk', {
  state: () => ({
    talkList: [
      { id: 1, content: '我爱你' },
      { id: 2, content: '我也爱你' }
    ]
  }),
  actions: {
    getTalk() {
      // 模拟从 API 获取数据
      this.talkList.push({ id: Date.now(), content: '新的情话' });
    }
  }
});

优点

  1. 结构清晰:所有状态、派生状态和动作都集中在一个对象中,易于理解和管理。

  2. 适合初学者:如果你熟悉 Vue 2 的选项式 API,这种写法会很容易上手。

缺点

  1. 灵活性较低:所有逻辑都写在一个对象中,可能会导致代码冗长,尤其是在大型项目中。

  2. 难以复用:逻辑分散在 stateactions 中,难以提取和复用。

2. 组合式写法(Composition API)

组合式写法是 Vue 3 引入的一种新写法,它允许你通过函数组合的方式来定义 Store。这种方式更加灵活,适合复杂逻辑的拆分和复用。

示例代码

// stores/talk.js
import { defineStore, reactive } from 'pinia';

export const useTalkStore = defineStore('talk', () => {
  // 定义响应式状态
  const talkList = reactive([
    { id: 1, content: '我爱你' },
    { id: 2, content: '我也爱你' }
  ]);

  // 定义动作
  function getTalk() {
    // 模拟从 API 获取数据
    talkList.push({ id: Date.now(), content: '新的情话' });
  }

  // 返回状态和动作
  return { talkList, getTalk };
});

数据直接用reactive来定义

优点

  1. 灵活性高:可以自由组合逻辑,适合复杂项目的拆分和复用。

  2. 代码清晰:逻辑和状态分开定义,代码更加清晰。

  3. 与 Vue 3 的 Composition API 一致:如果你熟悉 Vue 3 的 Composition API,这种写法会更加自然。

缺点

  1. 需要返回值:必须在函数中返回所有需要暴露的状态和动作。

  2. 学习曲线稍高:对于初学者来说,可能需要一些时间来适应这种写法。

3. 使用组合式写法的注意事项

在组合式写法中,你需要手动返回所有需要暴露的状态和动作。如果忘记返回,这些状态或动作将无法在组件中使用。

4. 组件中的使用

无论使用哪种写法,组件中的使用方式都是一样的:

<template>
  <div>
    <ul>
      <li v-for="talk in talkStore.talkList" :key="talk.id">{{ talk.content }}</li>
    </ul>
    <button @click="talkStore.getTalk">获取新情话</button>
  </div>
</template>

<script setup>
import { useTalkStore } from '@/stores/talk';

const talkStore = useTalkStore();
</script>

5. 总结

  • 选项式写法:结构清晰,适合初学者,但灵活性较低。

  • 组合式写法:灵活性高,适合复杂项目,但需要手动返回状态和动作。

选择哪种写法取决于你的个人偏好和项目需求。如果你更喜欢清晰的结构,可以选择选项式写法;如果你需要更高的灵活性和复用性,可以选择组合式写法。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。