iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue生态的新成员Pinia的详细介绍
  • 292
分享到

Vue生态的新成员Pinia的详细介绍

2024-04-02 19:04:59 292人浏览 安东尼
摘要

目录安装和配置Store核心StateGettersActionsVue Devtools最后结论参考文献Pinia是Vue应用程序的状态管理方案,是Vuex核心团队成员开发。感觉更

Pinia是Vue应用程序的状态管理方案,是Vuex核心团队成员开发。感觉更像是常规的旧 javascript 导入模块,实现了很多Vuex5的提案。

Pinia同时支持Vue2和vue3,不过下面展示的例子都是使用Vue3,Pinia的版本是Pinia@2.0.9。

Vue2和Vue3使用的Pinia版本有一点不同,因此请查看官方 Pinia 文档以获取更多信息。

安装和配置

可以使用npm或者yarn安装Pinia

yarn add pinia@next
# 或者 使用npm
npm install pinia@next

安装完毕后,找到Vue应用程序的文件 main.js (vue-cli初始化的项目,一般都命名为main.js)。从Pinia的npm包中导入createPinia,然后使用Vue的use方法作为插件使用

//main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import { createPinia } from 'pinia'

createApp(App)
  .use(router)
  .use(createPinia())
  .mount('#app')

接下来,我们去创建一个 store

Store核心

Pinia的Store不同于Vuex的Store。使用Vuex的时候,整个应用程序只有一个主要Store(虽然你可以拆成不同的模块,但是还是一个主存储出口)。然而,今天的主角Pinia则是开箱即用的模块化设计,不在需要一个主要的Store,可以创建不同的Store。例如,我们可以创建一个登录用户Store。

// store/loggedInUser.js
import { defineStore } from 'pinia'

export const useLoggedInUserStore = defineStore({
// id 是必填的,并且所有 Store 中唯一。因为Pinia会将它在devtools显示
  id: 'loggedInUser',
  state () {
    return {
      name: '太凉',
      age: 18,
      email: 'fake@email.com'
    }
  },
  getters: {},
  actions: {}
})

上面我们创建了一个登录用户Store,接下来我们可以直接在组件中引用,然后在setup函数中调用useLoggedInUserStore

<template>
  <div>PiniaApage</div>
  <div>姓名:{{user.name}}</div>
  <div>年龄:{{user.age}}</div>
</template>

<script>
import { useLoggedInUserStore } from '@/store/loggedInUser.js'
export default {
  name: 'PiniaDemoPage1',
  setup () {
    const user = useLoggedInUserStore()
    return {
      user
    }
  }
}
</script>

这与 Vuex 有很大不同,Vuex 的Store  会自动挂载到 当前Vue的实例,可以通过this.$store的方式调用。然而,Pania 方式也让开发人员 更清楚Store来自哪里,因为它是标准的 Javascript 模块导入,可以看到是从哪个文件导入的。

假如,你不用  Composition api的方式,你仍然可以借助一些辅助函数使用Pinia,下面将会详细说,这里先提一嘴。

State

我们将 Store 中的 state 属性设置为一个函数,该函数返回一个包含不同状态值的对象。这与我们在组件中定义data的方式非常相似。事实上,唯一的区别是属性名称:状态与数据

import { defineStore } from 'pinia'
export const useLoggedInUserStore = defineStore({
// id 是必填的,并且所有 Store 中唯一。因为Pinia会将它在devtools显示
  id: 'loggedInUser',
  state () {
    return {
      name: '太凉',
      age: 18,
      email: 'fake@email.com'
    }
  },
  getters: {},
  actions: {}
})

现在,为了从组件中访问 loginUserStore 的状态,我们只需要引用我们需要的Store,这种方式非常优雅。完全不需要像Vuex那样从嵌套对象中找到我们需要的Store。

<template>
  <div>PiniaApage</div>
  <div>姓名:{{user.name}}</div>
  <div>年龄:{{user.age}}</div>
</template>

<script>
import { useLoggedInUserStore } from '@/store/loggedInUser.js'
export default {
  name: 'PiniaDemoPage1',
  setup () {
    //不用在想以前那个 user.state.name的方式获取了
    const user = useLoggedInUserStore()
    return {
      user
    }
  }
}
</script>

警告,不能结构user,因为那样会失去响应式。下面的方式是错误的。

❌ const {name, email} = useLoggedInUserStore()

如果你使用的不是Composition API的方式,而是Option API的方式。可以通过Pinia的mapState函数获取 State数据。Pinia的mapState函数 和Vuex的mapState虽然名字相同,但是使用方式完全不同。

Pinia的mapState函数的第一个参数是必须是之前创建的Store,第二个参数是Store中的state的属性值。看代码

//PageComponent.vue
<template>
  <h1>你好, 我是 {{name}},我来自地球</h1>
  <h2>联系邮箱:{{email}}</h2>
</template>
<script>
import {mapState} from 'pinia'
export default{
  computed:{
    ...mapState(useLoggedInUserStore, ['name','email'])
  }
}
</script>

总结

  • 定义Pinia的state,和组件的data的方式是一样
  • 需要在组件间中手动导入我们需要的Store模块,这样做的好处是明确知道数据的来源,更符合标准的 Javascript

Getters

Pinia中的getters和Vuex中的getters 的作用是相同的,都是作为组件的计算属性(computed)。
创建getters的方式有两种,一种是通过this关键字,一种是通过state具体看代码

//store/usePostsStore.js
import { defineStore } from 'pinia'

export const usePostsStore = defineStore({
  id: 'PostsStore',
  state: ()=>({ posts: ['post 1', 'post 2', 'post 3', 'post 4'] }),
  getters:{

    // 传统函数方式
    postsCount: function(){
      return this.posts.length
    },
    // 传统函数简写方式
    postsCount2(){
      return this.posts.length
    },
    // 箭头函数
    postsCount3:(state)=>state.posts.length,

    // ❌ 不能用箭头函数+this的方式,这种方式this指向不对
    // postsCount: ()=> this.posts.length
  }
})

接下来看Composition API方式的组件中如何使用创建的getters,其实用法和state相同。看代码

<template>
  <div>Piniabpage</div>
  <div> 总数:{{postsStore.postsCount}}</div>
</template>

<script>
import { usePostsStore } from '@/store/usePostsStore.js'
export default {
  name: 'PiniaBpage',
  setup () {
    const postsStore = usePostsStore()
    return {
      postsStore
    }
  }
}
</script>

如果是Option API 的组件,不能像Vuex那样通过mapGetters辅助函数获取。因为Pinia没有mapGetters辅助函数,Pinia中消费getters还是借助 mapState辅助函数

<template>
  <div> 总数:{{postsCount}}</div>
</template>

<script>
import { mapState } from 'pinia'
import { usePostsStore } from "@/store/PostsStore";

export default {
  computed:{
    ...mapState(usePostsStore, ['postsCount'])
  }
};
</script>

Actions

Pinia不同于Vuex,Pinia提供了单一的方式更改state的值,在Pinia中没有mutations,只有action方式。先来看一下Pinia的action怎么用吧。上代码

  • 直接通过this找到对应的state修改
  • 通过.$patch 函数方法
  • 通过.$patch 对象方法
import { defineStore } from 'pinia'

export const usePostsStore = defineStore({
  id: 'PostsStore',
  state: () => ({
    posts: ['post 1', 'post 2', 'post 3', 'post 4'],
    user: { postsCount: 2 },
    age:18,
    errors: []
  }),
  getters: {
    postsCount: function () {
      return this.posts.length
    },
    postsCount2 () {
      return this.posts.length
    },
    // 箭头函数
    postsCount3: (state) => state.posts.length
  },
  actions: {
    insertPost () {
      //方式1:直接通过this找到对应的state修改
      this.posts.push(`post_${Date.now()}`)
      this.user.postsCount++
    },
    removePost () {
      //方式2:通过.$patch 函数方法
      this.$patch((state) => {
        state.posts.shift()
        state.user.postsCount++
      })
      
      //通过.$patch 对象方法
      this.$patch({
        age:30
      });
    }
  }
})

以上展示了三种更改Pinia的State方式。

如果是 Composition API使用方式

<template>
  <div>PiniaBpage</div>
  <div> 总数:{{postsStore.postsCount}}</div>
  <ul>
    <li
      v-for="item in postsStore.posts"
      :key="item"
    >
      {{item}}
    </li>
  </ul>
  <button @click="handleAdd">新增</button>
  <button @click="handleRemove">删除</button>
  <button @click="handleBeforeAdd">新增到前面</button>
</template>

<script>
import { usePostsStore } from '@/store/usePostsStore.js'
  
export default {
  name: 'PiniaBpage',
  setup () {
    const postsStore = usePostsStore()

    // 新增
    const handleAdd = () => {
      postsStore.insertPost()
    }

    // 删除
    const handleRemove = () => {
      postsStore.removePost()
    }
    // 新增到前面,也可以在这里通过$patch修改,同样这里也可以直接修改
   const  handleBeforeAdd=()=>{
     postsStore.$patch((state) => {
        state.posts.shift()
        state.user.postsCount++
     })
   }
    return {
      postsStore,
      handleAdd,
      handleRemove,
      handleBeforeAdd
    }
  }
}
</script>

如果是 Options API使用方式,需要借助 辅助函数 mapActions

// PostEditorComponent.vue
<template>
  <input type="text" v-model="post" />
  <button @click="insertPost(post)">保存</button>
</template>
<script>
import {mapActions} from 'pinia'
import { usePostsStore } from '@/store/PostsStore';
export default{
  data(){
    return { post: '' }
  }, 
  methods:{
    ...mapActions(usePostsStore, ['insertPost'])
  }
}
</script>

其实Pinia的action使用非常灵活

  • 可以在组件或者其他actions里面调用
  • 可以在其他的Store的actions里面调用
import { useAuthStore } from './auth-store'

export const useSettingsStore = defineStore('settings', {
  state: () => ({
    // ...
  }),
  actions: {
    async fetchUserPreferences(preferences) {
      const auth = useAuthStore()
      if (auth.isAuthenticated) {
        this.preferences = await fetchPreferences()
      } else {
        throw new Error('User must be authenticated')
      }
    },
  },
})
  • 支持同步和异步
  • 可以支持灵活的参数
  • ...............

Vue Devtools

在 Vue 2 中,Pania 支持在 Vuex 选项卡中查看状态,甚至可以看到时间轨迹。时间轨迹的标签几乎没有在 Vuex 中使用时那么好。
至于 Vue 3,Pania 仅支持在 devtools 中查看状态,不支持时间轨迹功能。然而,这实际上比 Vuex 为 Vue 3 提供的要多,因为它在最新的开发工具中根本不支持。

最后

快速回顾一下 Pinia 最显着的功能,以帮助你去快速了解Pinia,并应用于项目中

  • vue.js 核心团队成员维护
  • 感觉更像是常规的旧 javascript 导入模块,将操作为方法调用,直接在store上访问状态等。
  • 不再mutations
  • 与 Vue Devtools 集成

结论

Pinia虽然是Vue生态的新成员,但是事实证明Pinia是最优前途的状态管理解决方案,具有直观的API,模块化,清晰导入来源。

参考文献

Pinia, an Alternative Vue.js Store
官网

到此这篇关于Vue生态的新成员Pinia的详细介绍的文章就介绍到这了,更多相关Vue Pinia内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue生态的新成员Pinia的详细介绍

本文链接: https://www.lsjlt.com/news/162384.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue生态的新成员Pinia的详细介绍
    目录安装和配置Store核心StateGettersActionsVue Devtools最后结论参考文献Pinia是Vue应用程序的状态管理方案,是Vuex核心团队成员开发。感觉更...
    99+
    2024-04-02
  • Vue生态的新成员Pinia怎么用
    小编给大家分享一下Vue生态的新成员Pinia怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Pinia是Vue应用程序的状态管理方案,是Vuex核心团队成员...
    99+
    2023-06-26
  • Vue替代vuex的存储库Pinia详细介绍
    目录前言Pinia介绍1. 创建一个Pinia store2. 访问State3. Pinia修改数据的四种方法4. 重置State5. 替换state6. 订阅状态7. Gette...
    99+
    2024-04-02
  • vue视图响应式更新详细介绍
    目录概述思路第一步统一封装更新函数第二步监听并触发视图更新引入Dep管家实现下语法糖v-model概述 前面两篇文章已经实现了对数据的变化的监听以及模板语法编译初始化,但是当数据变化...
    99+
    2024-04-02
  • CSS新特性contain的详细介绍
    本篇内容主要讲解“CSS新特性contain的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS新特性contain的详细介绍”吧!contain 为...
    99+
    2024-04-02
  • seata的部署和集成详细介绍
    目录seata的部署和集成1.部署Seata的tc-server1)下载2)解压3)修改配置4)在nacos添加配置5)创建数据库表6)启动TC服务2.微服务集成seata 1)引入...
    99+
    2023-05-15
    Java seata部署和集成 seata部署 seata集成
  • Flink的详细介绍
    这篇文章主要介绍“Flink的详细介绍”,在日常操作中,相信很多人在Flink的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flink的详细介绍”的疑惑有所帮助!接...
    99+
    2024-04-02
  • rabbitMQ的详细介绍
    1.概述 RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。...
    99+
    2023-09-05
    rabbitmq npm linux java 分布式
  • Python类的继承与多态详细介绍
    目录概念类的创建类的继承多态的使用概念 类(Class): 用来描述具有相同的属性和方法的对象的集合。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类...
    99+
    2024-04-02
  • Vue数据变化后页面更新详细介绍
    首先会通过module.hot.accept监听文件变化,并传入该文件的渲染函数: module.hot.accept( "./App.vuevue&type=templat...
    99+
    2022-11-13
    Vue页面更新 Vue数据变化后页面更新
  • Vue新的状态管理Pinia怎么使用
    今天小编给大家分享一下Vue新的状态管理Pinia怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。为什么有 Vuex ...
    99+
    2023-07-06
  • Java探索之Hibernate主键生成策略详细介绍
    1.increment     由Hibernate从数据库中去除主键的最大值(每个session只取一次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。&l...
    99+
    2023-05-30
    java hibernate ava
  • SpringCloud新一代网关Gateway的详细介绍
    本篇内容介绍了“SpringCloud新一代网关Gateway的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、概述简介1.1、简...
    99+
    2023-06-20
  • Java NIO的详细介绍
    这篇文章主要讲解了“Java NIO的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO的详细介绍”吧!首先,我们需要弄清楚几个概念:同步和异步,阻塞和非阻塞。同步和异步...
    99+
    2023-06-16
  • Vue新的状态管理库Pinia入门教程
    目录前沿使用教程1、安装2、vue中引入3、基本使用4、也可以像vuex一样使用为什么最近Pinia会火起来呢,主要在于Vue3推出来的时候,Vuex对于Vue3的组合式Api支持的...
    99+
    2024-04-02
  • Vue自定义指令的使用详细介绍
    目录1. 概述2. 钩子函数3. 自定义全局指令4. 自定义局部指令5. 使用自定义指令实现权限管理6. 使用自定义指令实现表单验证1. 概述 除了核心功能默认内置的指令,Vue也允...
    99+
    2024-04-02
  • Flutter有无状态类与State及生命周期详细介绍
    目录无状态类有状态类状态State生命周期Flutter中的生命周期类似于Vue、React中的生命周期一样,有初始化、状态更新、停用、销毁等。 在React中,组件分为函数式组件和...
    99+
    2024-04-02
  • SpringBoot静态资源的访问方法详细介绍
    目录一. 静态资源二. 静态资源访问目标三. 静态资源访问前缀1. 默认访问路径为 /2. 配置访问前缀3. 配置静态资源默认访问位置四. 欢迎页及网页图标设置1. 欢迎页的设置2....
    99+
    2024-04-02
  • Ajax状态码的生成顺序以及含义介绍
    Ajax状态码: 在创建Ajax对象,配置Ajax对象,发送请求,以及接收完服务器响应数据,这个过程中的每一个步骤都会有一个数值,这个数值就是Ajax的状态码。 根据xhr.read...
    99+
    2024-04-02
  • Java中CompletableFuture 的详细介绍
    目录1.概述1.0 创建 CompletableFuture 的对象的工厂方法1.1 non-async 和 async 区别1.1.1 non-async 示例:注册 action...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作