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

带你熟练掌握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日

相关文章

  • vsCode中vue文件无法提示html标签的操作方法

    针对vsCode中vue文件无法提示html标签的情况,可以按照以下步骤进行操作: 安装Vetur插件 Vetur是一款vsCode的插件,主要提供语法高亮、格式化、代码片段和错误提示等功能,适用于Vue.js开发。因此,在使用vsCode编辑Vue文件时,我们需要安装并启用Vetur插件,这样就能够解决无法提示html标签的问题。 具体操作如下: 在vsC…

    Vue 2023年5月28日
    00
  • 关于console.log打印结果是 [object Object]的解决

    当我们在使用console.log()输出对象时,会发现输出的结果是 [object Object],而不是显示对象的属性和方法。这是因为console.log()默认将对象toString(),得到的结果就是[object Object]。 要解决这个问题,我们需要用到JSON.stringify()方法将对象转换成字符串输出。 下面是两个示例说明: 示例…

    Vue 2023年5月27日
    00
  • vue路由$router.push()使用query传参的实际开发使用

    关于vue路由$router.push()使用query传参的实际开发使用,我将从以下几个方面进行详细讲解。 1. 路由传参 在vue开发中,路由传参是一个非常重要的概念。路由传参可以使我们的组件之间传递数据,可以实现多个组件之间的动态交互。 我们可以通过以下两种方式进行路由传参进行传参: params:通过路由路径匹配传递的参数,通常用于传递必须的参数,如…

    Vue 2023年5月27日
    00
  • Vue开发常用方法详解

    Vue开发常用方法详解 什么是Vue? Vue是一款流行的JavaScript框架,用于构建用户界面。它采用了MVVM(Model-View-ViewModel)设计模式,可以将页面与数据相分离,同时也可以更好地管理页面的状态。Vue的特点是易于上手,同时也提供了强大的工具,例如组件化、响应式数据和虚拟DOM等。 常用方法详解 1. 数据绑定 Vue提供了一…

    Vue 2023年5月27日
    00
  • vue实现记事本功能

    下面详细讲解“Vue 实现记事本功能”的完整攻略: 准备工作 在使用 Vue 实现记事本功能之前,需要先安装 Vue 和其他依赖项。可以使用 npm 或 yarn 来安装。下面是在项目中使用 npm 安装所需依赖项的命令行: npm install vue npm install vue-router npm install vuex 添加路由 在 Vue …

    Vue 2023年5月29日
    00
  • vue-cli3添加模式配置多环境变量的方法

    介绍:vue-cli 3 是 Vue 官方提供的脚手架工具,使用 vue-cli3 可以快速搭建 Vue 项目,添加模式配置多环境变量,常用于项目的部署环境切换、前后端资源访问地址等的切换。本篇攻略介绍 vue-cli3 添加模式配置多环境变量的方法,包括两种示例说明。 准备工作 在使用 vue-cli3 添加模式配置多环境变量之前我们需要准备以下环境和工具…

    Vue 2023年5月28日
    00
  • vue项目使用定时器每隔几秒运行一次某方法代码实例

    针对这个问题,我来为您进行详细讲解。 首先,我们需要了解Vue在处理定时器时的基础知识。在Vue中使用定时器的方法有两种,一种是使用Vue提供的计时器(它基于window.setInterval),另一种是直接使用window.setInterval。这两种方法都可以达到定时器的效果,但是在Vue项目中使用Vue提供的计时器更为合适,因为它能够与Vue实例进…

    Vue 2023年5月29日
    00
  • VUE中使用HTTP库Axios方法详解

    下面我将为你详细讲解“VUE中使用HTTP库Axios方法详解”的完整攻略。 简介 Axios是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。它能够从服务器获取数据,也能将数据发送到服务器。Axios 支持各种请求方式,如 GET、POST、PUT、DELETE、HEAD 等。 在 Vue.js 项目中,我们可以通过 ax…

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