Pinia 极速入门

本文详细介绍了如何在Vue项目中安装并使用Pinia状态管理库,包括挂载、数据定义、状态修改的不同方法、getters的使用以及Store间的相互调用。同时提到了安装VueDevTools进行调试的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 安装pinia

 npm install pinia -D

2.挂载

import { createApp } from "vue";
import App from "./App.vue";
import { createPinia } from "pinia";

const pinia = createPinia();
const app = createApp(App);
app.use(pinia);
app.mount("#app");

2.定义及使用数据

  • 定义数据–index.ts
import { defineStore } from "pinia";

export const mainStore = defineStore("main", {
  state: () => {
    return {
      helloWord: "Hello World",
      count: 0,
    };
  },
  getters: {},
  actions: {
    changeState() {
      this.count++;
      this.helloWord = "path";
    },
  },
});

  • 使用状态
<template>
    <div>{{ store.helloWord }}</div>
    <div>{{ store.count }}</div>
    <div>{{ helloWord }}</div>
    <div>{{ count }}</div>
</template>

<script setup lang='ts'>
import { mainStore } from "../store/index";
import { storeToRefs } from "pinia";
const store = mainStore();

const { helloWord, count } = storeToRefs(store)

</script>
<style scoped></style>

3. 四种修改状态方法

<template>
    <div>
        <button @click="handleClick">修改状态数据(1)</button>
        <button @click="handleClickPath">修改状态数据(2-path)</button>
        <button @click="handleClickMethod">修改状态数据(3-path)</button>
        <button @click="handleClickActions">修改状态数据(4-actions)</button>
    </div>
</template>

<script setup lang='ts'>
import { mainStore } from "../store/index";
const store = mainStore();

//第一种方式
const handleClick = () => {

    store.count++
    store.helloWord = store.helloWord === 'Hello World' ? "Path" : "Hello World"

}
//第二种方式$path 好处:多数据修改,官方宣称 有优化,比第一种方式快一点
const handleClickPath = () => {
    store.$patch({
        count: store.count + 2,
        helloWord: store.helloWord === 'Hello World' ? "Path" : "Hello World"
    })
}
//第三种方法$patch 传递函数 这种方式更适合处理 复杂业务处理逻辑
const handleClickMethod = () => {
    store.$patch((state) => {
        state.count++;
        state.helloWord = state.helloWord === 'Hello World' ? "Path" : "Hello World";
    });
}
//第四种,actions形式,直接在index.ts编写
const handleClickActions = () => {
    store.changeState();//这里纯粹是为了记笔记

}
</script>
<style scoped></style>

4. pinia中的Getters使用

getters 类似vue中计算属性,有缓存功能

import { defineStore } from "pinia";

export const mainStore = defineStore("main", {
  state: () => {
    return {
      helloWord: "Hello World",
      count: 0,
      phone: "13255683632",
    };
  },
  getters: {
    phoneHidden(): string {
      console.log("getters 被调用了");

      return this.phone.toString().replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2"); //正则表达式
    },
  },
  actions: {
    changeState() {
      this.count++;
      this.helloWord = "path";
    },
  },
});

  • 调用地方
<template>
    <div>{{ store.helloWord }}</div>
    <div>{{ store.count }}</div>
    <div>{{ store.phoneHidden }}</div>
    <hr />
    <div>{{ helloWord }}</div>
    <div>{{ count }}</div>
    <div>{{ phoneHidden }}</div>
</template>

5. pinia中Store的相互调用

` 先引入 import { otherStore } from “./other”;

actions: {
    changeState() {
      this.count++;
      this.helloWord = "path";
    },
    getList() {
      console.log(otherStore().list);
    },
  },

6. 安装vue-devtools

devtools效果,方便调试

### Pinia 入门教程与示例代码 #### 安装 Pinia 要开始使用 Pinia,首先需要将其安装到项目中。可以通过 `yarn` 或 `npm` 来完成安装: ```bash yarn add pinia # 或者 npm install pinia ``` 接着,在项目的入口文件中引入并初始化 Pinia 实例,并挂载到 Vue 应用上。 ```javascript import { createApp } from 'vue'; import { createPinia } from 'pinia'; const app = createApp(App); const pinia = createPinia(); app.use(pinia).mount('#app'); ``` --- #### 创建 Store 通过 `defineStore` 方法来定义一个新的 Store。以下是创建一个简单的计数器 Store 的例子: ```typescript // stores/counter.ts import { defineStore } from 'pinia'; export const useCounterStore = defineStore('counter', { state: () => ({ count: 0, }), getters: { doubleCount(): number { return this.count * 2; }, }, actions: { increment() { this.count++; }, }, }); ``` 在这里: - **State**: 存储应用的状态数据。 - **Getters**: 类似于 Vuex 中的计算属性,用于派生状态。 - **Actions**: 处理异步逻辑或复杂的状态变更[^2]。 --- #### 在组件中使用 Store 在 Vue 组件中可以轻松地调用已定义的 Store 并与其交互。下面是一个完整的组件示例: ```html <template> <div> <p>当前计数值:{{ counterStore.count }}</p> <p>双倍计数值:{{ counterStore.doubleCount }}</p> <button @click="increment">+1</button> </div> </template> <script setup lang="ts"> import { useCounterStore } from './stores/counter'; const counterStore = useCounterStore(); function increment() { counterStore.increment(); } </script> ``` 在这个示例中: - 使用了 `useCounterStore` 获取 Store 实例。 - 显示了 `count` 和 `doubleCount` 数据。 - 添加了一个按钮触发 `increment` 动作以增加计数器值[^4]。 --- #### 修改状态的方式 Pinia 支持多种方式修改状态,具体如下: 1. **直接修改**:可以直接赋值给 State 属性。 ```typescript counterStore.count += 1; ``` 2. **$patch 对象方式**:批量更新多个字段。 ```typescript counterStore.$patch({ count: 5 }); ``` 3. **$patch 函数方式**:提供回调函数动态修改。 ```typescript counterStore.$patch((state) => { state.count += 1; }); ``` 4. **$state 替换**:完全替换整个 State。 ```typescript counterStore.$state = { count: 10 }; ``` 5. **$reset 重置**:恢复初始状态。 ```typescript counterStore.$reset(); ``` 这些方法使得状态管理更加灵活和高效[^5]。 --- #### 更多功能扩展 除了基本的功能外,Pinia 还支持以下高级特性: - **持久化存储**:利用插件实现本地缓存。 - **模块化设计**:按功能划分不同的 Store 文件。 - **TypeScript 支持**:内置强大的类型推断能力[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值