Vue3基础(25)___初尝pinia,相比于vuex轻量、好用

简介: 本文介绍了Pinia在Vue 3中的使用,相比于Vuex,Pinia更轻量且易于使用。文章详细解释了Pinia的基本概念、优势,并提供了安装和使用Pinia的步骤,包括定义状态、getters、actions和如何在组件中使用Pinia进行状态管理。

初尝pinia,相比于vuex轻量、好用

pinia官网入口:pinia官网

Pinia 最初是在 2019 年 11 月左右重新设计使用 Composition API 。从那时起,最初的原则仍然相同,但 Pinia 对 Vue 2 和 Vue 3 都有效,并且不需要您使用组合 API。 除了安装和 SSR 之外,两者的 API 都是相同的,并且这些文档针对 Vue 3,并在必要时提供有关 Vue 2 的注释,以便 Vue 2 和 Vue 3 用户可以阅读

为什么要使用 Pinia?
Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 如果您熟悉 Composition API,您可能会认为您已经可以通过一个简单的 export const state = reactive({}).
这对于单页应用程序来说是正确的,但如果它是服务器端呈现的,会使您的应用程序暴露于安全漏洞。 但即使在小型单页应用程序中,您也可以从使用
Pinia 中获得很多好处:

dev-tools 支持 跟踪动作、突变的时间线 Store 出现在使用它们的组件中 time travel 和 更容易的调试 热模块更换
在不重新加载页面的情况下修改您的 Store 在开发时保持任何现有状态 插件:使用插件扩展 Pinia 功能 为 JS 用户提供适当的
TypeScript 支持或 autocompletion 服务器端渲染支持
与 Vuex 3.x/4.x 的比较
Vuex 3.x 是 Vuex 的 Vue 2 而 Vuex 4.x 是 Vue 3
Pinia API 与 Vuex ≤4 有很大不同,即:
mutations 不再存在。他们经常被认为是 非常 冗长。他们最初带来了 devtools 集成,但这不再是问题。
无需创建自定义复杂包装器来支持 TypeScript,所有内容都是类型化的,并且 API 的设计方式尽可能利用 TS 类型推断。
不再需要注入、导入函数、调用函数、享受自动完成功能!
无需动态添加 Store,默认情况下它们都是动态的,您甚至都不会注意到。请注意,您仍然可以随时手动使用 Store 进行注册,但因为它是自动的,您无需担心。
不再有 modules 的嵌套结构。您仍然可以通过在另一个 Store 中导入和 使用 来隐式嵌套 Store,但 Pinia 通过设计提供平面结构,同时仍然支持 Store 之间的交叉组合方式。 您甚至可以拥有 Store 的循环依赖关系。
没有 命名空间模块。鉴于 Store 的扁平架构,“命名空间” Store 是其定义方式所固有的,您可以说所有 Store 都是命名空间的。

使用:
1.安装 pinia

npm i pinia

2.在main.js中引入根pinia

import {
    createApp } from 'vue'
import App from './App.vue'
import {
    createPinia } from 'pinia'
createApp(App).use(createPinia()).mount('#app')

3.创建单独文件夹存储所有需要的store对象,js、ts文件
在这里插入图片描述

import {
    defineStore } from 'pinia'

export const useHomeStore = defineStore('useHomeStore', {
   
  state() {
   
    return {
   
      name: "六卿",
      age: "18",
      habby: [{
    key: "1", value: "跳舞" }]
    }
  },
  getters: {
   
    getAge(state) {
   
      return Number(state.age) + 10
    }
  },
  actions: {
   
    // 第一个参数就是 调用的时候传入的参数
    changeNewAge(age) {
   
      console.log(this, 'this')
      console.log(age, 'ageageageage')
      this.age = age
    }
  },
})

这样我们就已经创建了一个简单的piniaStore对象,
4.使用:
在这里插入图片描述

<template>
  <div>
    <p style="color: red">Children showTime</p>
    <div class="hello">currentName: {
   {
    name }}</div>
    <div class="hello">currentAge: {
   {
    age }}</div>
    <div class="hello">currentHabby: {
   {
    habby }}</div>
    <button @click="changeNameFun">changeNameFun</button>
  </div>
</template>

<script>
// 需要使用 storeToRefs 将store转化为ref响应式对象
import {
    storeToRefs } from 'pinia';
import {
    useHomeStore } from '../store/home.ts'
export default {
   
  name: 'Children-my',
  setup() {
   
    // 函数 需要调用
    console.log(useHomeStore, 'useHomeStore')
    const storeHome = useHomeStore()
    const {
    name, age, habby } = storeToRefs(storeHome)
    const changeNameFun = () => {
   
      storeHome.name = 'name --- > children ooooo'
    }
    return {
    name, age, habby, changeNameFun }
  },
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.hello {
   
  width: 500px;
  text-align: left;
}
</style>

上面我们用到了一个新的API_____storeToRefs :可以看看官网如何解释
在这里插入图片描述

在这里插入图片描述
解构之后不再具有响应式,需要使用storeToRefs:
为了从 Store 中提取属性同时保持其响应式,您需要使用storeToRefs()。 它将为任何响应式属性创建 refs。 当您仅使用 store 中的状态但不调用任何操作时,这很有用
5.改变store的值
点击 changeNameFun 按钮的时候,执行

    const changeNameFun = () => {
   
      storeHome.name = 'name --- > children ooooo'
    }

会发现页面直接进行了改变,达到了效果,但是想要批量进行改变的时候,可能有些麻烦,我们可以使用$patch进行批量更改:

    const changeAllFun = () => {
   
      // 批量修改数据1
       storeHome.$patch({
   
         name: "batchName",
         age: "222"
       });
       // 批量修改数据2
       storeHome.$patch((state) => {
   
         state.age = 888
         // state.habby.push({ value: 'shoes', key: '3' })
       })
    }

6.使用getter
home.ts

  getters: {
   
    getAge(state) {
   
      return Number(state.age) + 10
    }
  },

页面:

  setup() {
   
    // 函数 需要调用
    console.log(useHomeStore, 'useHomeStore')
    const storeHome = useHomeStore()
    const {
    name, age, habby, getAge } = storeToRefs(storeHome)
    return {
    name, age, habby, getAge}
  },

7.使用actions
home.ts

  actions: {
   
    // 第一个参数就是 调用的时候传入的参数
    changeNewAge(age) {
   
      console.log(this, 'this')
      console.log(age, 'ageageageage')
      this.age = age
    }
  },

页面使用:

  setup() {
   
    // 函数 需要调用
    console.log(useHomeStore, 'useHomeStore')
    const storeHome = useHomeStore()
    const {
    name, age, habby, getAge } = storeToRefs(storeHome)
    const changeAllFun = () => {
   
      storeHome.changeNewAge('9999')
    }
    return {
    name, age, habby, getAge,  changeAllFun }
  },

改变store数据有三种方法
1.store.name
2.store.$patch
3.store.actionsFun
store也有重置方法

store.$reset()

这是知乎的以为大佬的文章,写的着实很详细啊:一文搞懂pinia状态管理(保姆级教程)

全部代码:
页面:
在这里插入图片描述

main.js

import {
    createApp } from 'vue'
import App from './App.vue'
import {
    createPinia } from 'pinia'
createApp(App).use(createPinia()).mount('#app')

app.vue

<template>
  <Bottom />
</template>

<script>
import Bottom from './components/Bottom.vue'

export default {
   
  name: 'App',
  components: {
   
    Bottom,
  }
}
</script>

home.ts

import {
    defineStore } from 'pinia'

export const useHomeStore = defineStore('useHomeStore', {
   
  state() {
   
    return {
   
      name: "六卿",
      age: "18",
      sex:"男",
      habby: [{
    key: "1", value: "跳舞" }]
    }
  },
  getters: {
   
    getAge(state) {
   
      return Number(state.age) + 10
    }
  },
  actions: {
   
    // 第一个参数就是 调用的时候传入的参数
    changeNewAge(age) {
   
      console.log(this, 'this')
      console.log(age, 'ageageageage')
      this.age = age
    }
  },
})

bottom.vue:

<template>
  <div>
    <p style="color: red">Children1 showTime</p>
    <div class="hello">currentName: {
   {
    name }}</div>
    <div class="hello">currentAge: {
   {
    age }}</div>
    <div class="hello">currentSex: {
   {
    sex }}</div>
    <div class="hello">currentHabby: {
   {
    habby }}</div>
    <div class="hello">getAge: {
   {
    getAge }}</div>
    <button @click="changeNameFun">改名称</button>
    <button @click="changeAllFun">changeAllFun</button>
    <button @click="changeResetFun">重置</button>
  </div>
</template>

<script>
// 需要使用 storeToRefs 将store转化为ref响应式对象
import {
    storeToRefs } from 'pinia';
import {
    useHomeStore } from '../store/home.ts'
// import { onMounted, ref, watch } from 'vue'
export default {
   
  name: 'Children1-my',
  setup() {
   
    // 函数 需要调用
    console.log(useHomeStore, 'useHomeStore')
    const storeHome = useHomeStore()
    const {
    name, age, sex, habby, getAge } = storeToRefs(storeHome)
    const changeNameFun = () => {
   
      storeHome.name = 'name --- > children111 ooooo'
    }
    const changeResetFun = () => {
   
      // 将数据重置到最初状态
      storeHome.$reset();
    }
    const changeAllFun = () => {
   
      // sex 被包装成 ref  需要.value支持
      storeHome.sex = sex.value === '男' ? '女' : '男'
      // 批量修改数据
      storeHome.$patch({
   
        habby: "hahahahha"
      });
      // storeHome.$patch((state) => {
   
      //   state.age = 888
      //   // state.habby.push({ value: 'shoes', key: '3' })
      // })
      // 直接替换整个state
      storeHome.$state = {
   
        name: "1233333"
      }
      storeHome.changeNewAge('9999')
    }
    return {
    name, age, sex, habby, getAge, changeNameFun, changeResetFun, changeAllFun }
  },
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.hello {
   
  width: 500px;
  text-align: left;
}
</style>

目录结构:
在这里插入图片描述

目录
相关文章
|
2月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
505 139
|
2月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
218 1
|
7月前
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
966 5
|
3月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
381 11
|
2月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
260 0
|
4月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
438 1
|
4月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
253 0
|
5月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
136 0
|
7月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
600 17
|
7月前
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
1758 0