首页 > 其他分享 >Vue.js 状态管理库 Pinia

Vue.js 状态管理库 Pinia

时间:2023-06-03 18:56:44浏览次数:50  
标签:Vue const Pinia defineStore js pinia store

概述

Pinia 是一个用于 Vue.js 应用程序的状态管理库。它是由 Vue Storefront 团队开发的,旨在提供简单、可扩展且高效的状态管理解决方案。

Pinia 基于 Vue 3 的新响应式系统,并通过使用 TypeScript 提供了强类型支持。它提供了一个类似于 Vuex 的 API,但在某些方面更加简洁和直观。

使用 Pinia,你可以定义和管理应用程序的状态,将其存储在一个或多个 store 中。每个 store 代表
了一部分应用程序的状态和相关的操作方法。

官方网站 Github

特点

  1. 基于 Vue 3:Pinia 利用了 Vue 3 的响应式系统,并与其无缝集成。它能够充分利用 Vue 3 的性能优势和改进的开发体验。

  2. TypeScript 支持:Pinia 提供了对 TypeScript 的内置支持,可以提供类型检查和智能提示,使开发者能够更轻松地编写类型安全的代码。

  3. 简洁的 API:Pinia 的 API 设计简单且直观,类似于 Vuex,但更加精简。它提供了一组易于理解和使用的方法,使状态管理变得简单而高效。

  4. 插件生态系统:Pinia 支持插件系统,可以通过插件扩展和增强其功能。这使得开发者可以根据项目的需要添加自定义逻辑和功能。

  5. 开箱即用的特性:Pinia 提供了一些常用的特性,如模块化组织、状态持久化、插件支持等。这些功能可以帮助开发者更好地组织和管理应用程序的状态。

开始

安装

npm install pinia

在 Vue 3 中使用

// Vue 3
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

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

app.use(pinia)
app.mount('#app')
// stores/main.ts
import { defineStore } from 'pinia'

// main 是 store 的名称,在整个应用程序中必须是唯一的,将显示在开发者工具中
export const useMainStore = defineStore('main', {
  // 一个返回新状态的函数
  state: () => ({
    counter: 0,
    name: 'Eduardo',
  }),
  // 可选的 getter
  getters: {
    // getters 的第一个参数是状态对象
    doubleCounter: (state) => state.counter * 2,
    // 在其他 getter 中使用 getter
    doubleCounterPlusOne(): number {
      return this.doubleCounter + 1
    },
  },
  // 可选的 action
  actions: {
    reset() {
      // `this` 是 store 实例
      this.counter = 0
    },
  },
})

在 Nuxt 3 中使用

npm install @pinia/nuxt -D
// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    [
      "@pinia/nuxt",
      {
        autoImports: [
          // 自动引入 `defineStore()`
          "defineStore",
          // 自动引入 `defineStore()` 并重命名为 `definePiniaStore()`
          ["defineStore", "definePiniaStore"],
        ],
      },
    ],
  ]
});
// stores/counter.ts
export const useCounterStore = defineStore("counter", {
    state: () => ({ count: 2 }),
    getters: {
      double: (state) => state.count * 2,
    },
  
    actions: {
      increment() {
        this.count++;
      },
    },
  });

组件调用

App.vue

<template>
  <p>{{ store.count }}</p>
  <button @click="store.increment">加一</button>
</template>

<script setup lang="ts">
import { useCounterStore } from "@/stores/counter";
const store = useCounterStore();
</script>

如果你需要用解构赋值语法来命名变量,请先使用 storeToRefs 将其变回为响应式。

// 不要这样写,因为这样会破坏响应式
// 这与从 `props` 进行解构赋值是相同的
const { name, doubleCount } = store;

✔️

import { storeToRefs } from "pinia";
const { name, doubleCount } = storeToRefs(store);

标签:Vue,const,Pinia,defineStore,js,pinia,store
From: https://www.cnblogs.com/mydyxy/p/17454387.html

相关文章

  • 记录--手把手教你Vue+ECharts+高德地图API实现天气预报数据可视化
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言所谓数据可视化,我们可以理解为从宏观角度来看一眼就能看出来整个数据的占比,走向。对于数据可视化,很多互联网公司是很看重这一块的,包括大厂;就比如阿里的淘宝,双十一的时候往往就需要将消费者的一些数据通过图的......
  • 打字动画 Typed.js
    概述Typed.js是一个JavaScript库,用于在网页上创建打字动画效果。它使您能够模拟打字机或逐字显示文本的效果,从而为用户提供逐渐展示文本的视觉体验。Typed.js提供了丰富的选项和配置,可以自定义打字动画的速度、暂停时间、删除效果等。您可以使用HTML元素或JavaScript调......
  • 模板引擎 Handlebars.js
    概述Handlebars.js是一个简单而强大的JavaScript模板引擎。它允许开发者通过定义模板和数据来生成动态的HTML页面。Handlebars.js基于Mustache模板语法,它提供了一些扩展和增强功能。并且开发者可以创建可重用的模板,并通过将数据传递给模板来生成最终的输出。这种分离数......
  • 使用 Node.js 连接 MySQL
    概述当使用Node.js开发Web应用程序时,经常需要与数据库进行交互来存储和检索数据。MySQL是一个流行的关系型数据库管理系统,它提供了强大的功能和性能。本文将介绍如何使用Node.js连接MySQL数据库,并展示一些常见的操作示例。开始在这里我们将使用Node.js的mysql2库来连......
  • vue 按列合并单元格
    要求使用vue对每页表格进行单元格合并,每列纵向一致的内容合并,但要参照第一列合并情况,后面的列不能跨列合并,第二列和最后一列不合并。思路将首列进行合并单元格计算,然后依次将后面列按照首列合并结果进行分组,然后依次给每个分组进行合并单元格计算,最后依次将该列的多个分组内容......
  • 【由浅到深】聊聊 Vue 和 React 的区别,看看你在哪个段位
    大家好,我是沐华。最近部门招人,捞了一批简历至少都是5年以上的前端来面试,其中不乏360的,腾讯的,简历上写的基本都是熟练使用Vue2、Vue3、React并阅读源码对其实现原理有自己的理解,实际问起来却不免让人唏嘘比如:既然两个框架都用过,那能说一下你觉得这俩有什么区别吗毕竟是两个框架,不......
  • Vue插值语法,文本指令,事件指令v-on,属性指令v-bind
    Vue插值语法:总结:插值语法使用{{}}传入变量,相当于形参  script中data中传入变量值,相当于实参,vue将data的值传给{{}}中html中:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scr......
  • c# xml、json相互转换
    stringjsonString="{\"Table\":{\"Row\":[{\"Name\":\"张三\",\"Age\":\"20\"},{\"Name\":\"李四\",\"Age\":\"25\"}]}}";......
  • json结构比较问题
    两个json字符串结构一样,但是单纯比较字符串不一样解决:fastjson2这个依赖亲测直接equals方法就可以比较出来,但是json得要JSON.parseObject或者parseArrary解析出来的对象,如果是自己造的对象,可以先转字符串再转对象......
  • 大件货运系统源码,技术架构:spring boot、mybatis、redis、vue、element-ui
    网络货运平台源码网络货运平台的功能网络货运是指利用互联网平台,通过物流配送的方式进行商品销售和物流运输的一种新型商业模式。这种模式将传统的货运模式与互联网技术相结合,通过网络平台进行交易、物流配送和结算等一系列流程,从而实现货物的快速、高效、便捷地运输。技术架构:spr......