带你熟练掌握Vue3之Pinia状态管理

yizhihongxing

带你熟练掌握Vue3之Pinia状态管理攻略

什么是Pinia?

Pinia 是一个由 Eduardo San Martin Morote (Vue.js 核心团队成员)开发的 Vue.js3 状态管理库。

相较于 Vuex,在语法上有了很多的优化和改进,个人认为更易于学习使用,这里我们就来看一下如何使用它。

安装

在使用 Pinia 之前,需要确保先安装 Vue.js3 和 Pinia,可以使用以下命令进行安装:

npm install vue@next @pinia/core @pinia/vue3

或是使用 Yarn 进行安装:

yarn add vue@next @pinia/core @pinia/vue3

创建 Pinia 实例

创建一个 Pinia 实例只需要调用 createPinia() 方法即可:

import { createPinia } from '@pinia/core'

const pinia = createPinia()

定义状态

定义状态需要使用 defineStore() 方法,该方法接受一组状态和行为定义,最终返回一个带有 getter 属性和 mutation 方法的对象。

import { defineStore } from '@pinia/core'

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

注册状态

注册状态需要使用 app.use() 方法,并且将其添加到 app 对象中。

import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from '@pinia/core'
import { useCounterStore } from './store'

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

app.use(pinia)
app.use(useCounterStore)

app.mount('#app')

使用状态

最后,通过 useStore() 函数来引用状态存储:

import { useStore } from '@pinia/vue3'
import { useCounterStore } from './store'

export default {
  setup() {
    const store = useStore(useCounterStore)

    const increment = () => {
      store.increment()
    }

    return { store, increment }
  }
}

示例说明

下面是一个简单的使用序:

假设有一个任务列表,任务的状态有 todo、doing 和 done 三种,我们需要记录每个任务的状态并根据状态进行过滤:

// store.js
import { defineStore } from '@pinia/core'

export const useTaskStore = defineStore('task', {
  state: () => ({
    tasks: [
      { id: 1, title: '完成todo状态的任务', status: 'todo' },
      { id: 2, title: '完成doing状态的任务', status: 'doing' },
      { id: 3, title: '完成done状态的任务', status: 'done' }
    ]
  }),
  getters: {
    todoTasks(state) {
      return state.tasks.filter(task => task.status === 'todo')
    },
    doingTasks(state) {
      return state.tasks.filter(task => task.status === 'doing')
    },
    doneTasks(state) {
      return state.tasks.filter(task => task.status === 'done')
    }
  },
  actions: {
    updateTaskStatus(id, status) {
      const task = this.tasks.find(task => task.id === id)

      if (task) {
        task.status = status
      }
    }
  }
})

首先是定义状态,通过 defineStore() 方法定义 task 状态,并包含了它的初始状态和一些 getter 和 action 方法。

在公共组件中,使用 useStore() 方法来获取 $task 状态,并通过 $task.todoTasks 等 getter 方法获取当前任务状态的信息,并渲染到页面上。

接着,通过自定义指令跟踪用户的操作,当用户点击“完成”按钮时,我们触发一个 updateTaskStatus() 行为来更新任务状态:

// App.vue
<template>
  <div>
    <button @click="$task.updateTaskStatus(1, 'doing')">开始任务</button>
    <button @click="$task.updateTaskStatus(1, 'done')">完成任务</button>
    <ul>
      <li v-for="task in $task.todoTasks" :key="task.id">{{ task.title }}</li>
    </ul>
    <ul>
      <li v-for="task in $task.doingTasks" :key="task.id">{{ task.title }}</li>
    </ul>
    <ul>
      <li v-for="task in $task.doneTasks" :key="task.id">{{ task.title }}</li>
    </ul>
  </div>
</template>

<script>
import { useStore } from '@pinia/vue3'
import { useTaskStore } from './store'

export default {
  directives: {
    track: {
      beforeMount(el, binding) {
        const { instance } = el.__vnode
        const task = instance.$task
        const id = binding.value.id
        const status = binding.value.status

        el.addEventListener('click', () => {
          task.updateTaskStatus(id, status)
        })
      }
    }
  },
  setup() {
    const store = useStore(useTaskStore)

    return { store }
  }
}
</script>

至此,我们就实现了一个简单的任务列表,并通过 Pinia 来管理任务状态,方便地实现了任务状态数据和视图的同步。

以上就是关于 Pinia 的使用介绍,相信通过上面的示例,大家已经初步了解了它的基本使用方式,有一些基础的知识储备之后就可以开始使用它啦!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:带你熟练掌握Vue3之Pinia状态管理 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue3中hooks的简介及用法教程

    下面是关于vue3中hooks的详细讲解及用法教程。 什么是hooks? 在Vue3中,引入了一种新的特性——hooks(钩子函数)。Hooks可以让我们在函数组件中使用state和其他React特性,而不需要使用类组件。与Vue2中options-API不同的是,hooks是基于函数式编程的,它通过函数的方式提供了组件内状态的维护和实现状态的逻辑复用。 h…

    Vue 2023年5月28日
    00
  • vue实现时间倒计时功能

    以下是“vue实现时间倒计时功能”的完整攻略,希望能对您有所帮助。 基本思路 Vue 实现时间倒计时功能的基本思路是:获取倒计时的起始时间和结束时间,然后通过 setInterval 函数计算时间差并更新视图上的倒计时剩余时间。 具体步骤 1.在Vue组件中定义起始时间和结束时间。 data() { return { startTime: new Date(…

    Vue 2023年5月28日
    00
  • JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查

    “JS组件系列之MVVM组件vue 30分钟搞定前端增删改查”是一篇介绍Vue MVVM组件的文章,主要讲解Vue框架在实现前端增删改查功能中的应用。 在文章中,作者首先详细讲解了Vue框架的MVC和MVVM两种架构模式的区别和原理。随后,以一个todoList为例子,讲解了Vue框架中的组件化和数据绑定的操作方式,包括创建实例,定义数据和方法,绑定数据和事…

    Vue 2023年5月28日
    00
  • vue-cli npm如何解决vue项目中缺失core-js的问题

    当我们创建一个Vue项目时,通常会使用vue-cli来进行项目初始化和配置。但是,在某些情况下,会在编译或运行Vue应用程序期间遇到缺少“core-js”的错误。这时,我们可以使用npm来安装“core-js”,以解决这个问题。 下面是解决“vue-cli npm如何解决vue项目中缺失core-js的问题”的完整攻略: 步骤1:检查缺少“core-js”的…

    Vue 2023年5月28日
    00
  • 解决在Vue中使用axios用form表单出现的问题

    当在Vue项目中使用axios进行POST请求时,经常会遇到使用表单提交数据的情况,但是,表单需要以特定格式进行编码,否则服务器无法正常解析表单内容。本文将为大家详细讲解如何解决这一问题。 问题描述 我们在使用axios进行POST请求时,一般需要将数据封装在一个对象参数中,如下所示: axios.post(‘/api/login’, { username:…

    Vue 2023年5月28日
    00
  • Vue中的同步和异步调用顺序详解

    Vue中的同步和异步调用顺序详解 前言 在Vue的开发过程中,同步和异步调用顺序经常是我们需要关注的问题。本篇文章主要讲解同步和异步调用的概念,并通过示例来详细说明Vue中同步和异步调用的顺序。 同步和异步调用的概念 在JavaScript中,同步调用是指函数按照代码的顺序依次执行,执行完一个函数后才能执行下一个函数。异步调用则是指函数不按照代码的顺序执行,…

    Vue 2023年5月28日
    00
  • Vue路由模块化配置的完整步骤

    当使用Vue.js开发单页面应用程序时,路由管理通常是必不可少的功能之一。Vue Router是Vue.js官方提供的路由管理器,它可以轻松地集成到Vue.js应用中,并且在开发过程中为我们提供了许多有用的功能。 Vue Router支持模块化配置,我们可以将路由配置拆分为多个独立的模块,以便更好地组织和管理我们的代码。下面是Vue路由模块化配置的完整步骤:…

    Vue 2023年5月28日
    00
  • vue3.2中的vuex使用详解

    下面是关于vue3.2中的vuex使用详解的完整攻略。 1. 什么是Vuex Vuex是Vue.js应用程序的状态管理模式。它通过一个集中的存储管理所有组件的状态,并以相应的规则保证状态以可预测的方式发生变化。 2. 如何使用Vuex 2.1 安装Vuex 在vue项目中使用Vuex,需要先安装Vuex。使用npm安装: npm install vuex -…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部