vue3 - 新一代的状态储存仓库 Pinia

在这里插入图片描述

1,什么是 Pinia?

pinia 是由 vue 团队开发的,适用于 vue2 和 vue3 的状态管理库,它允许您跨组件/页面共享状态
主要侧重于vue3的组合式API,当然Vue2也是可以使用的,本篇将介绍的是vue3使用;

与Vuex比较:

Pinia 不需要额外的Map辅助函数;(setup和组合式Api的使用Pinia更容易,因此不需要map helpers 功能);
Pinia 相比vuex的模块少了Mutaions和Modules;只保留了(State、Getters、Actions以及新增了Plugins);
Pinia 是平面结构,没有嵌套,可以任意交叉组合(使用其他模块的状态);

为什么使用Pinia?

  • dev-tools 支持(安装和使用链接)
  • 热更新(在不重新加载页面的情况下修改 Store)
  • 可以使用插件扩展 Pinia 功能
  • 为 JS 用户提供适当的TypeScript支持或自动填充
  • 服务器端渲染支持

2,安装Pinia

yarn add pinia
# 或者使用 npm
npm install pinia

3 ,Pinia 的引入

一般我们在做项目的时候,都会在main.js 或者 main.ts 中引入。
vue3 main.js中引入

import { createPinia } from "pinia";
app.use(createPinia());

app.mount("#app");

4,Pinia的结构

上面也说到 : Pinia 移除了Mutations和modules模块;只有State、Getters、Actions;

Pinia 是平面结构,没有嵌套,可以任意交叉组合 即可以使用其他模块的状态。

在这里插入图片描述

1、State

(1)默认情况下,通过 store 实例访问 state,可以直接读取和写入,store.count++。

(2)通过 store.$reset() 方法可以将 state 重置为初始值。

(3)除了直接通过 store 修改 state,还可以通过 store.$patch() 内置方法提交多个更改。

(4)可以通过 store.$subscribe() 订阅 State 的变化,在 patches 修改之后订阅只会触发一次。

2、Getters

(1)Getters 属性的值是一个函数,接受 state 作为第一个参数,目的是鼓励使用箭头函数。

(2)非箭头函数会可以通过 this来访问store实例或state,this.state.

3、Actions

(1)与 Gettes 一样可以通过 this 访问整个 store 实例。

(2)Actions 可以是异步的或同步的,不管怎样,都会返回一个 Promise。

(3)Actions 可以自由的设置参数和返回的内容,一切将自动推断,不需要定义 TS 类型。

(4)与 State 一样,可以通过 store.$onAction() 订阅 Actions,回调将在执行前触发,并可以通过参数 after() 和 onError() 允许在Action 决议后和拒绝后执行函数。同样的,订阅绑定的是当前组件。

5,Pinia的使用

下图是Demo演示的例子:

大家可以拷贝下来自己运行一下,注释都写的很清楚:

在这里插入图片描述

stores/counter.js (pinia仓库的总体结构-简洁大方)

import { ref, computed } from "vue";
import { defineStore } from "pinia";
// 可以引入其他模块并使用
import { rootSore } from "@/stores/rootState";

// Store 是使用 defineStore() 定义的,并且它需要一个唯一名称,作为第一个参数传递:"myStore""
export const useStore = defineStore("myStore", {

  /* =================================State================================ */
  state: () => { // state 推荐用箭头函数的方式 利于类型推断
    return {
      counter: 100,
      name: "Eula", //尤菈
      isAdmin: true,
      items:[]
    };
  },

  /* =================================Getters================================ */
  getters: {
    /* 1,第一种使用 参数的方式访问 state */
    doubleCount: (state) => {
      return state.counter * 2;
    },
    /* 2,第二种使用 常规函数用this访问整个store的实例,不能使用箭头函数 因为箭头函数绑定的是外部this */
    trebleCount() {
      return this.counter * 3;
    },

    /* 3,需要将参数传递给getter 因为getter是计算属性 只能返回一个函数以接收任何参数*/
    receiveParams: (state) => {
      // params 是你调用的时候传进来的值
      return (params) => {
        return String(params) + state.name; // 我的优菈
      };
    },

    /* 4,可以访问其他store模块的 state 上面先引用 再使用*/
    useOtherStateOfModules: (state) => {
      // 实例化其他模块
      const otherStore = rootSore();
      return state.name + "-" + otherStore.age;
    },
  },

  /* =================================Actions================================ */
  actions: {  //  这里使用常规函数 可以通过this进行访问store实例
    /* 自减函数 */
    induce() {
      this.counter--;
    },
    /* 随机数*/
    randomizeCounter() {
      this.counter = Math.round(100 * Math.random());
    },
  },
});


PiniaDemo.vue / 组价中使用(setup 语法糖)

<template>
  <div class="demo">
    <h2>This is a Demo Of Pinia To Used</h2>

    <p class="store">store数据:{{ store.counter }}</p>

    <!--下面了使用了pinia里面的计算属性 -->
    <p class="store">双倍数据:{{ store.doubleCount }}</p>
    <!-- 下面是传参的 getter -->
    <p class="store">传参的计算属性:{{ store.receiveParams("我的") }}</p>
    <!-- 下面是使用了其他模块数据的 getter -->
    <p class="store">
      使用其他模块数据的计算属性:{{ store.useOtherStateOfModules }}
    </p>

    <div class="btnContent">
      <button class="btn" @click="add">点击加一</button>
      <button class="btn" @click="reduce">点击减一</button>
      <button class="btn" @click="reset">重置Pinia状态</button>
      <button class="btn" @click="patch">同时修改多个数据</button>
    </div>
  </div>
</template>

<script setup>
import { reactive, ref, createApp, onMounted } from "vue";
/*  为了从 Store 中提取属性同时保持其响应式,您需要使用storeToRefs()。 它将为任何响应式属性创建 refs。 */
import { storeToRefs } from "pinia";

/* 1,引入对应的store模块 */
import { useStore } from "@/stores/counter";
/* 2,实例化 */
let store = useStore();
/* 3,使用 直接改变状态 */
const add = () => {
  // 此处可以直接通过赋值语句改变 state的值;不需要向vuex那样调用actions
  store.name = "Wendi";
  store.counter++;
  console.log("name:", store.name); //改动成功
};

/* 4,通过acions改变状态 */
const reduce = () => {
  // 每次点击 就减一
  store.induce();
  // console.log(store.induce);
  console.log("counter:", store.counter);
};

/* 点击重置状态 
如果想要将数据重置到最开始更新数据的时候,pinia提供了一个方法:$reset()
*/
const reset = () => {
  store.$reset(); // 重置成功
};

/* 6,使用内置的 $patch 同时修改多个属性 */
const patch = () => {
  // 第一种 直接修改
  store.$patch({
    counter: store.counter + 1,
    name: "Abalam",
  });

  // 第二种 再回调函数中修改  可以拿到state 推荐使用这种
  store.$patch((state) => {
    state.items.push({ name: "shoes", quantity: 1 }); // push属性
    state.hasChanged = true;
  });
};

/* 7,订阅状态 使用 $subscribe 内置方法可以监听到状态的变化 */
store.$subscribe(
  () => {
    console.log("subscribe监听到了数据改变");
  },
  { detached: true }
);
</script>

<style scoped>
.btnContent {
  margin-top: 10px;
}
.btn {
  margin-left: 10px;
}
.store {
  margin-left: 10px;
}
</style>


stores/rootState.js (这是另一个模块,在counter.js模块会用到的)

import { defineStore } from "pinia";
/* 这里是rootState的仓库 */
export const rootSore = defineStore("rootId", {
  state: () => {
    return {
      age:18,
    };
  },
});

6,总结

Pinia相对于vuex来说,确实减少的代码量,尤其删除了Mutations模块,在Pinia可以直接对状态进行修改;优化了原先多层嵌套的模块化,使每个模块都能任意访问,交叉组合;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue3是Vue.js的最新版本,它带来了许多新的特性和改进,例如更快的渲染速度和更好的TypeScript支持。 Vite是一个新的构建工具,它可以快速地构建现代化的Web应用程序。它使用ES模块作为构建系统的基础,可以实现快速的热重载和快速的开发体验。 TypeScript是一种静态类型语言,它可以帮助开发者在编写代码时发现潜在的错误,并提供更好的代码提示和自动补全功能。 Vue Router是Vue.js的官方路由管理器,它可以帮助开发者构建单页应用程序。它提供了许多有用的功能,例如路由参数、路由导航守卫和动态路由。 Pinia是一个新的状态管理库,它可以帮助开发者管理Vue.js应用程序中的状态。它提供了一种简单的方式来定义和使用状态,并且可以与Vue.js的生命周期钩子和Vue Router集成。 ### 回答2: Vue3是基于Vue2的改进版本,它在性能和开发体验方面有很大的提升。其中最重要的特点是它的虚拟DOM模型改进了响应式数据的渲染,使得性能得到了提高。同时,Vue3还引入了Composition API,这是一个函数式的API,将逻辑分离开来,使得代码更加简洁易懂。 Vite是一款基于ESM构建工具,并使用原生ES模块作为开发时的静态编译器,它不需要像Webpack那样将所有的文件都打包在一起,因此在开发时可以更加快速地编译和构建项目。同时,Vite还支持热重载,这使得开发和调试过程更加高效。 TypeScript是一种静态类型的语言,它可以在开发时提供更好的代码提示和类型检查,帮助开发者在编写代码时避免常见的错误。由于Vue3是使用TypeScript编写的,因此它对TypeScript提供了更好的支持。 Vue Router是Vue官方提供的路由管理器,它可以帮助开发者对单页应用进行路由管理。Vue3对Vue Router进行了改进,现在它可以使用Composition API来编写路由逻辑,并且支持动态路由。 Pinia则是Vue官方推出的状态管理库,与Vuex不同,它使用了新的API,并且更加轻量级。Pinia也允许使用Composition API进行编写,这样可以在处理状态管理方面更加灵活和高效。 综上所述,Vue3、Vite、TypeScript、Vue Router和Pinia都是当前最流行、最优秀的前端开发工具和库,它们的使用可以让开发者更加高效、简洁地进行开发。同时,它们都是基于Vue生态的,因此可以很好地与Vue进行整合,从而使得Vue前端开发领域中的地位更加稳固、重要。 ### 回答3: Vue3是一个用于构建用户界面的渐进式框架,它具有更快、更轻量级、更易学习等特点。Vite是一个基于浏览器原生ES模块热更新启动的构建工具,它能够快速而且高效地打包项目,并且拥有快速的热重载和源码分割。 在Vue3中使用TypeScript可以提供更好的类型推导和编辑器支持,使开发更加高效、可靠。Vue-Router是Vue3的路由管理器,它能够方便地处理路由并且支持动态路由、嵌套路由、路由拦截等功能。而Pinia是一个状态管理库,可以更好地管理Vue3应用程序中的状态,它使用类似于Vuex的API,提供了状态管理和响应式数据持久化方案。 使用Vite集成Vue3和TypeScript可以让我们快速构建Vue3项目并且享受到TypeScript的类型检查和Vue3的新特性,同时还能使用热重载和源码分割。在应用程序中使用Vue-Router和Pinia可以更好地管理路由和状态,提升应用的性能和可维护性。 总之,Vue3、Vite、TypeScript、Vue-Router和Pinia这五种技术可以很好的组合在一起,为我们带来高效、可靠、灵活的开发体验,助力我们更好地构建出高质量的Vue3应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值