当前位置: 首页 > news >正文

vue3 pinia状态管理

文章目录

    • 安装 Pinia
    • 创建 Pinia 实例
    • 定义 Store
    • 在组件中使用 Store
    • pinia 增删改查
    • 在组件中使用
    • 响应式和插件
      • 1. 安装插件
      • 2. 配置 Pinia 插件
      • 3. 在 Store 中启用持久化
      • 4. 自定义持久化配置

安装 Pinia

首先,你需要安装 Pinia。可以通过 npm 或 yarn 来进行安装:

npm install pinia
yarn add pinia

创建 Pinia 实例

在你的 Vue 应用程序中创建 Pinia 实例,并将其传递给 Vue 应用。通常在 main.js 或 main.ts 文件中进行:

// main.js
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';

const app = createApp(App);
const pinia = createPinia();

app.use(pinia);
app.mount('#app');

定义 Store

Pinia 的核心概念是“store”。你可以创建一个 store 来管理相关状态。下面是一个简单的示例:

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

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0,
  }),
  getters: {
    doubleCount: (state) => state.count * 2,
  },
  actions: {
    increment() {
      this.count++;
    },
    decrement() {
      this.count--;
    },
  },
});

在组件中使用 Store

一旦定义了 store,你可以在任何组件中使用它。下面是如何在组件中使用 useCounterStore 的示例:

<template>
  <div>
    <h1>{{ count }}</h1>
    <h2>{{ doubleCount }}</h2>
    <button @click="increment">Increment</button>
    <button @click="decrement">Decrement</button>
  </div>
</template>

<script>
import { useCounterStore } from '@/stores/counter';

export default {
  setup() {
    const counterStore = useCounterStore();
    
    return {
      count: counterStore.count,
      doubleCount: counterStore.doubleCount,
      increment: counterStore.increment,
      decrement: counterStore.decrement,
    };
  },
};
</script>

pinia 增删改查

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

export const useTaskStore = defineStore('task', {
  state: () => ({
    tasks: [],
  }),
  actions: {
    addTask(task) {
      this.tasks.push(task);
    },
    removeTask(taskId) {
      this.tasks = this.tasks.filter(task => task.id !== taskId);
    },
    updateTask(updatedTask) {
      const index = this.tasks.findIndex(task => task.id === updatedTask.id);
      if (index !== -1) {
        this.tasks[index] = updatedTask;
      }
    },
    getTask(taskId) {
      return this.tasks.find(task => task.id === taskId);
    },
  },
});

在组件中使用

<template>
  <div>
    <h1>任务管理</h1>
    <input v-model="newTask" placeholder="新任务名称" />
    <button @click="addNewTask">添加任务</button>
    
    <ul>
      <li v-for="task in taskStore.tasks" :key="task.id">
        {{ task.name }}
        <button @click="removeTask(task.id)">删除</button>
        <button @click="updateTask(task)">更新</button>
      </li>
    </ul>
  </div>
</template>

<script>
import { ref } from 'vue';
import { useTaskStore } from '../stores/taskStore';

export default {
  setup() {
    const taskStore = useTaskStore();
    const newTask = ref('');

    const addNewTask = () => {
      if (newTask.value.trim()) {
        taskStore.addTask({ id: Date.now(), name: newTask.value });
        newTask.value = ''; // 清空输入框
      }
    };

    const removeTask = (taskId) => {
      taskStore.removeTask(taskId);
    };

    const updateTask = (task) => {
      const updatedName = prompt('更新任务名称:', task.name);
      if (updatedName !== null) {
        taskStore.updateTask({ ...task, name: updatedName });
      }
    };

    return { taskStore, newTask, addNewTask, removeTask, updateTask };
  },
};
</script>

响应式和插件

Pinia 的状态是响应式的,因此当你更新状态时,任何依赖于该状态的组件都会自动重新渲染。

同时,你也可以为 Pinia 添加插件来实现诸如持久化状态、日志等功能。例如,如果你想要持久化状态,可以使用 pinia-plugin-persistedstate 插件。

1. 安装插件

首先,你需要在项目中安装 pinia-plugin-persistedstate。可以使用 npm 或 yarn 进行安装

# 使用 npm 安装
npm install pinia-plugin-persistedstate

# 使用 yarn 安装
yarn add pinia-plugin-persistedstate

2. 配置 Pinia 插件

在创建 Pinia 实例时,需要将 pinia-plugin-persistedstate 作为插件添加进去。以下是一个示例代码:

// main.js 或 main.ts
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
import App from './App.vue';

// 创建 Pinia 实例
const pinia = createPinia();
// 使用持久化插件
pinia.use(piniaPluginPersistedstate);

const app = createApp(App);
// 将 Pinia 实例挂载到应用中
app.use(pinia);
app.mount('#app');

3. 在 Store 中启用持久化

在定义 Pinia store 时,可以通过 persist 选项来启用持久化。以下是一个简单的 store 示例:

// store/counter.js 或 store/counter.ts
import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0
  }),
  actions: {
    increment() {
      this.count++;
    }
  },
  // 启用持久化
  persist: true
});

4. 自定义持久化配置

你还可以对持久化进行更详细的配置,例如指定存储方式(localStorage 或 sessionStorage)、存储的键名等。以下是一个自定义配置的示例:

// store/counter.js 或 store/counter.ts
import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0
  }),
  actions: {
    increment() {
      this.count++;
    }
  },
  persist: {
    // 存储方式,默认为 localStorage
    storage: localStorage, 
    // 存储的键名,默认为 store 的 id
    key: 'my-counter-store', 
    // 只持久化指定的状态
    paths: ['count'] 
  }
});

在上述示例中,通过 storage 选项指定了存储方式为 localStorage,通过 key 选项指定了存储的键名,通过 paths 选项指定了只持久化 count 状态。

相关文章:

  • 动态规划----------完全背包问题
  • Android Studio:键值对存储sharedPreferences
  • Qt接入deepseekv3 API 提供openssl 1.1.1g安装包
  • 【matlab】大小键盘对应的Kbname
  • 新产品来袭~适用于新能源电力的霍尔传感器
  • 简述deepseek创始人的创业之路
  • 第三次作业
  • 【详细指南】如何在银河麒麟操作系统上使用DeepSeek?
  • flutter 打包mac应用并安装过程
  • 42.水果销售系统(springbootvue的Java项目[含微信小程序])
  • LabVIEW外腔二极管激光器稳频实验
  • 基于SpringBoot的电影院售票管理系统
  • nextjs的基础了解
  • 【C/C++算法】从浅到深学习--- 二分查找(图文兼备 + 源码详解)
  • 第十一篇:EMC的“电磁护盾”——三电系统干扰抑制实战
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十四节】
  • 庞氏骗局(Ponzi Scheme):金融投资与公司经营中的隐形陷阱(中英双语)
  • 恒创科技:如何重新启动 Windows 服务器
  • Windows电脑笔记软件多 推荐几款好用的笔记工具
  • Android图片加载框架Coil,Kotlin
  • 加强学校网站建设的通知/百度指数是啥
  • 上城网站建设/自己如何开网站
  • 网站建设销售一个月开几个单/seo有哪些优化工具
  • 银医网站建设方案/北京seo网站推广
  • 现在做网站怎么赚钱/百度平台客服电话
  • z怎么做优惠券网站/国家重大新闻