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

【Vue】Pinia

系列文章目录

第八章 Pinia


文章目录

  • 系列文章目录
  • 前言
  • 一、安装和配置:
  • 二、基本使用
  • 三、一个更真实的例子


前言

Pinia是Vue.js应用程序的状态管理库。它提供了一种简单,轻量级的解决方案,用于在Vue应用程序中管理和维护状态。Pinia库的特点是易于使用和集成,可以使开发者在不牺牲性能的情况下更有效地处理和维护状态。pinia中有三个概念,分别是:state、getter、action,对应于Vue组件中的:data、computed、methods。


一、安装和配置:

安装:通过命令:npm install pinia@2.1.7 ,或者在创建vue项目的时候勾选使用Pinia。
配置:在main.js中,需要创建pinia对象,并与app对象进行绑定,示例代码如下:

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'

const app = createApp(App)
app.use(createPinia())
app.mount('#app')

二、基本使用

通常在src目录下创建一个stores文件夹,然后在里面按需创建js文件。假设要创建一个用于管理counter全局变量的库文件,那么可以创建counter.js文件,然后填入以下代码:

import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  function increment() {
    count.value++
  }

  return { count, increment }
})

或者使用选项式API:

import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {
  state: () => {
    return { count: 0 }
  },
  // 也可以这样定义
  // state: () => ({ count: 0 })
  actions: {
    increment() {
      this.count++
    },
  },
})

这样就定义好了一个count变量,以后在组件中可以通过以下三种方式修改:

<script setup>
import { useCounterStore } from '@/stores/counter'
const counterStore = useCounterStore()
// 1. 直接修改
counterStore.count++
// 2. 使用$patch批量修改
counterStore.$patch({ count: counterStore.count + 1 })
// 3. 使用action修改
counterStore.increment()
</script>
<template>
  <!-- 直接从 store 中访问 state -->
  <div>Current Count: {{ counter.count }}</div>
</template>

以上三种修改方式的应用场景如下:

  1. 如果只要修改一个状态变量,并且不需要额外的操作,那么推荐使用第一种方法。
  2. 如果要一次性修改多个状态变量,那么推荐使用$patch方法,效率更高。
  3. 如果在修改状态变量的同时要做一些额外的操作,那么推荐第三种方法。

三、一个更真实的例子

import { defineStore } from 'pinia'
export const useTodos = defineStore('todos', {
  state: () => ({
    /** @type {{ text: string, id: number, isFinished: boolean }[]} */
    todos: [],
    /** @type {'all' | 'finished' | 'unfinished'} */
    filter: 'all',
    // 类型将自动推断为 number
    nextId: 0,
  }),
  getters: {
    finishedTodos(state) {
      return state.todos.filter((todo) => todo.isFinished)
    },
    unfinishedTodos(state) {
      return state.todos.filter((todo) => !todo.isFinished)
    },
    /**
     * @returns {{ text: string, id: number, isFinished: boolean }[]}
     */
    filteredTodos(state) {
      if (this.filter === 'finished') {
        // 调用其他带有自动补全的 getters ✨
        return this.finishedTodos
      } else if (this.filter === 'unfinished') {
        return this.unfinishedTodos
      }
      return this.todos
    },
  },
  actions: {
    // 接受任何数量的参数,返回一个 Promise 或不返回
    addTodo(text) {
      // 你可以直接变更该状态
      this.todos.push({ text, id: this.nextId++, isFinished: false })
    },
  },
})


http://www.kler.cn/news/319276.html

相关文章:

  • 【AI创作组】Matlab中进行符号计算
  • HTML与JavaScript结合实现简易计算器
  • Leetcode面试经典150题-94.二叉树的中序遍历
  • Java面试篇基础部分- 锁详解
  • 数据结构——概论
  • CNN网络训练WISDM数据集:模型仿真及可视化分析
  • 人工智能:重塑未来的技术力量
  • ubuntu22.04取消开机输入密码(实测)
  • 一文说清楚ETL与Kafka如何实现集成
  • Windows 快捷键大全:提升工作效率的小技巧
  • 华为HarmonyOS地图服务 7- 在地图上绘制标记
  • HTTP(超文本传输协议)基础
  • Redis——持久化策略
  • 网络威慑战略带来的影响
  • 智谱清影 - CogVideoX-2b-部署与使用
  • 30个GPT提示词天花板,一小时从大纲到终稿
  • JavaScript类型判断(总结)
  • F5研究显示:企业加速IT发展,以充分挖掘生成式AI潜力
  • 基于 RealSense D435相机实现手部姿态检测
  • Imagen与其他生成模型的对比:DALL-E、Stable Diffusion、MidJourney
  • Markdown书写技巧深度解析
  • 赋能未来工厂:EasyCVR视频平台助力装备制造业迈向智能制造
  • Unity实现原始的发射子弹效果
  • Python+appium自动化+夜神模拟器inspector部署验证
  • TypeScript系列:第四篇 - typeof 与 keyof
  • 微信小程序06-综合项目点餐系统
  • 京准电钟:NTP网络校时服务器助力校园体育场馆
  • MySQL 8.0 与 8.4 主主同步
  • E+H超声波物位仪FMU42-ATB2A22A
  • 企业内训|华为昇腾智算中心深度技术研修-某智算厂商研发中心