Vue | Vue.js 全家桶 Pinia状态管理

这篇具有很好参考价值的文章主要介绍了Vue | Vue.js 全家桶 Pinia状态管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🖥️ Vue .js专栏:Node.js Vue.js 全家桶 Pinia状态管理
🧑‍💼 个人简介:一个不甘平庸的平凡人🍬

✨ 个人主页:CoderHing的个人主页

🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️

👉 你的一键三连是我更新的最大动力❤️


目录

一、Pinia和Vuex的对比

什么是Pinia呢?

Pina和Vuex的区别

如何使用Pinia

二、创建Pinia的Store

认识Store

定义一个Store

使用定义的Store

三、Pinia核心概念 State

认识和定义State

操作State(一)

操作State(二)

四、Pinia核心概念 Getters

认识和定义Getters

访问Getters(一)

访问Getters(二)

五、Pinia核心概念 Actions

认识和定义Actions

Actions执行异步操作


一、Pinia和Vuex的对比

什么是Pinia呢?

        Pinia开始于2019年,最初作为一个实验为Vue重新设计状态管理,让它用起来像 组合式API(Composition API)

        从那时到现在,最初的设计原则依然相同,并且同时兼容Vue2 Vue3 也不要求你使用 Composition API

        Pinia本质上 依然是一个 状态管理的库 用于 跨组件 页面进行状态共享(和Vuex Redux一样)

Pina和Vuex的区别

        pinia最初是为了探索Vuex的下一次迭代会是什么样的,结合了Vuex5核心团队讨论中的许多想法

        最终,团队意识到Pinia已经实现了Vuex5中大部分内容,所以决定用Pinia来替代Vuex

        与Vuex比,Pinia提供了一个 更简单的API 具有更少的仪式,提供了CompositionAPI风格的API

        最重要的是,与TypeScript一起使用时具有可靠的类型推断支持;

和Vuex相比,Pinia有很多的优势:

        如:mutation不再存在:

                经常被认为是 非常冗长; 最初带来了devtools集成,但这不再是问题.

        更友好的TypeScript支持,Vuex之前对TS的支持不是很友好

        不再有modules的嵌套结构:

                可以灵活使用每一个store,是通过扁平化的方式来相互使用的

        不再有命名空间的概念,不需要记住它们的复杂关系

如何使用Pinia

安装Pinia

JavaScript
yarn add pinia
// or with npm
npm i pinia

创建一个pinia并且将其传递给应用程序:

JavaScript
import { createPinia } from 'pinia'

const pinia = createPinia()

export default pinia

JavaScript
// main.js文件中定义
import pinia from './stores/index'

createApp(App).use(pinia).mount('#app')

二、创建Pinia的Store

认识Store

什么是Store?

        一个Store(如pinia)是一个实体,它会持有为绑定到你组件树状态和业务逻辑,也就是保存了全局的状态;

        有点像始终存在,并且 每个人都可以读取和写入的组件

        可以在你的应用程序中 定义任意数量的Store来管理你的状态

Store有三个核心概念:

        State getters actions

        等同于组件的 data computed  methods

        一旦store被实例化,就可以直接在store上访问state getters 和 actions中定义的任何属性

定义一个Store

定义一个Store:

        需要知道Store是使用defineStore()定义

        并且需要一个唯一名称,作为第一个参数传递

JavaScript
import { defineStore } from 'pinia'

// defineStore 本身的返回值是一个函数
// 习惯用useXXX来命名 => 规范
const useCounter = defineStore("counter",{
    state:()=> ({
        count:999
    })
})

export default useCounter

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

这个name,也称为id 是必要的的,Pinia使用它来将store连接到devtools

返回的函数统一使用useXXX作为命名方案,这是约定的规范

使用定义的Store

Store在它被使用之前是不会创建的,可以通过调用use函数来使用Store

JavaScript
<template>
  <div class="home">
    <h2>Home view</h2>
    <h2>count: {{ counterStore.count }}</h2>
  </div>
</template>

<script setup>
import useCounter from '@/stores/counter';

const counterStore = useCounter()
</script>

<style scoped>
</style>

注意Store获取到后不能被解构,不然会失去响应式!

        为了从Store中提取属性同时保持其响应式 需要使用storeToRefs()

三、Pinia核心概念 State

认识和定义State

state是store的核心部分,因为store是用来帮助我们管理状态的

在Pinia中,状态被定义为返回初始状态的函数

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

操作State(一)

读取和写入state:

        默认情况下,可以通过store实例访问状态来直接读取和写入状态

JavaScript
const counterStore = useCounter()

counterStore.count++
counterStore.name = "xiong"

重置State:

        可以通过调用store上的$reset()方法将状态 重置 到其初始值;

JavaScript
const counterStore = useCounter()
counterStore.$reset()

操作State(二)

改变State:

        除了直接使用store.counter++修改store,还可以调用$patch方法

        它允许你使用部分"state"对象 同时应用多个更改

JavaScript
function changeStateClick(){
    // 1 一个一个修改状态
    // userStore.name = "xiaoxiong"
    // userStore.age = 18
    // userStore.level = 9999

    // 2 一次性修改多个状态
    userStore.$patch({
      name:"xx",
      age:20
    })
  }

替换State:

        可以通过将其$state属性设置为新对象来替换Store的整个状态

JavaScript
counterStore.$state = {
    counter:1,
    name:"xxiong"
}

四、Pinia核心概念 Getters

认识和定义Getters

Getters相当于Store的计算属性:

        可以用defineStore()中的getters属性定义

        getters中可以定义接受一个state作为参数的函数

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

JavaScript
const useCounter = defineStore("counter",{
    state:()=> ({
        count:999,
        friends:[
            { id:1,name:"xiong" },
            { id:2,name:"xx" },
            { id:3,name:"xxiong" },
        ]
    }),
    getters:{
        // 1 基本使用
        doubleCount(state){
            return state.count * 2
        },
        // 2 一个getter引入另外一个getter
        doubleCountAddOne(){
            // 通过this访问 this绑定store实例
            return this.doubleCount + 1
        },
        // 3 getters也支持返回一个函数
        getFriendById(state){
            return function(id) {
                // 高阶js写法
                return state.friends.find(item => item.id === id )

                // 普通写法
                // for(let i = 0;i<state.friends.length;i++){
                //     const friend = state.friends[i]
                //     if(friend.id === id){
                //         return friend
                //     }
                // }
            }
        },
        // 4 getters中使用到别的store中的数据
        showMsg(state){
            // 展示 count  和 user内的信息
            // 在上面 导入 user包
            // 1 获取user信息
            const useStore = useUser()
            // 2 获取自己信息 state

            // 3 拼接信息
            return `name:${useStore.name}-count:${state.count}`
        }
        
    }
})

访问Getters(一)

访问当前Store的Getters:

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

JavaScript
<h2>doubleCount: {{ countStore.doubleCount }}</h2>
<h2>doubleCountAddOne: {{ countStore.doubleCountAddOne }}</h2>
<h2>friend-2: {{ countStore.getFriendById(2) }}</h2>
<h2>拼接counter里面的count和user里面的名字: showMsg:{{ countStore.showMsg }}</h2>

Getters中访问自己的其他Getters:

        可以通过 this来访问到当前store实例的所有其他属性:

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

JavaScript
doubleCountAddOne(){
    // 通过this访问 this绑定store实例
    return this.doubleCount + 1
},

访问其他store的Getters:

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

JavaScript
// 4 getters中使用到别的store中的数据
showMsg(state){
    // 展示 count  和 user内的信息
    // 在上面 导入 user包
    // 1 获取user信息
    const useStore = useUser()
    // 2 获取自己信息 state

    // 3 拼接信息
    return `name:${useStore.name}-count:${state.count}`
}

访问Getters(二)

Getters也可以返回一个函数

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

JavaScript
 // 3 getters也支持返回一个函数
getFriendById(state){
    return function(id) {
        // 高阶js写法
        return state.friends.find(item => item.id === id )

        // 普通写法
        // for(let i = 0;i<state.friends.length;i++){
        //     const friend = state.friends[i]
        //     if(friend.id === id){
        //         return friend
        //     }
        // }
    }
},

五、Pinia核心概念 Actions

认识和定义Actions

Actions相当于组件中的methods

        使用defineStore()中的actions属性定义,且它们非常适合业务逻辑

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

vue pina,教你16天学会Vue,vue.js,javascript,前端,前端框架,node.js

和getters一样,在actions中可以通过this访问整个store实例的所有操作;

JavaScript
actions:{
    // 用来定义方法,这里不会给我们传进来一个state,
    // 他用来传递参数
    increment() {
        this.count++
    },
    // 如:下示例
    incrementAdd(num){
        this.count += num
    }
}

Actions执行异步操作

Actions中是支持异步操作的,我们可以编写异步函数,在函数中使用await

JavaScript
 actions:{
    async fetchHomeMultidata(){
        const res = await fetch("http://xxxx:8000/home/")
        const data = await res.json()
        // console.log(data) // 拿到数据
        this.banners = data.data.banner.list
        this.recommends = data.data.recommend.list
    }
}文章来源地址https://www.toymoban.com/news/detail-794277.html

到了这里,关于Vue | Vue.js 全家桶 Pinia状态管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue状态管理库-Pinia

    Pinia 是 Vue 的专属状态管理库,它允许支持跨组件或页面共享状态,即共享数据,他的初始设计目的是设计一个支持组合式API的 Vue 状态管理库(因为vue3一个很大的改变就是组合式API),当然这并不是说Pinia只支持vue3,他是同时支持vue2和vue3的, 本文倾向于拥抱Vue3,所以代码语

    2024年02月22日
    浏览(41)
  • Vue--》探索Pinia:Vue状态管理的未来

    目录 Pinia的讲解与使用 Pinia的安装与使用 store数据操作 解构store数据

    2024年02月05日
    浏览(32)
  • vue全家桶进阶之路39:Vue3 状态管理

    Vue3 的状态管理主要是通过 Vuex 4 来实现。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 在Vue3的状态管理中,以下是各个属性的作用: state :存储应用程序中的状

    2023年04月18日
    浏览(36)
  • vue全家桶进阶之路37:Vue3 状态管理

    Vue3 的状态管理主要是通过 Vuex 4 来实现。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 在Vue3的状态管理中,以下是各个属性的作用: state :存储应用程序中的状

    2023年04月18日
    浏览(33)
  • Vue使用 Pinia 进行状态管理

    Pinia 是一个适用于 Vue.js 的状态管理库,它采用了组合式 API 的理念,使得状态管理变得更加简单、直观和灵活。与传统的 Vuex 相比,Pinia 提供了更好的 TypeScript 支持,同时也更加适合大型应用程序和复杂状态逻辑的管理。 首先,我们需要在 Vue 项目中安装 Pinia。你可以通过

    2024年02月13日
    浏览(47)
  • vue3学习-Pinia状态管理

    定义一个Store 这个 name ,也称为 id ,是必要的,Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use… 是跨可组合项的约定,以使其符合你的使用习惯。 使用 store 一旦 store 被实例化,你就可以直接在 store 上访问 state 、 getters 和 actions 中定义的任何属性 store 是一

    2024年02月14日
    浏览(31)
  • vue3 快速入门系列 —— 状态管理 pinia

    其他章节请看: vue3 快速入门 系列 vue3 状态管理这里选择 pinia。 虽然 vuex4 已支持 Vue 3 的 Composition API,但是 vue3 官网推荐新的应用使用 pinia —— vue3 pinia redux、mobx、vuex、pinia都是集中式状态管理工具。与之对应的就是分布式。 Pinia 符合直觉 的 Vue.js 状态管理库 甚至让你忘

    2024年04月26日
    浏览(30)
  • Vue最新状态管理工具Pinia——彻底搞懂Pinia是什么

    知识专栏 专栏链接 Vuex知识专栏 https://blog.csdn.net/xsl_hr/category_12158336.html?spm=1001.2014.3001.5482 Vuex官方文档 https://vuex.vuejs.org/zh/ Pinia官方文档 https://pinia.web3doc.top/ 最近在 前端的深入学习过程 中,接触了与 状态管理 相关的内容,涉及到 与vue2适配的vuex 和 与vue3适配的pinia ,因此

    2024年02月03日
    浏览(40)
  • vue:状态管理库及其部分原理(Vuex、Pinia)

    多组件的状态共享问题: 当多个组件需要访问和修改相同的数据时,我们需要在组件之间传递 props或者使用事件总线。当,应用就会变得难以维护和调试。 多组件状态同步问题: 当一个组件修改了状态,其他组件可能无法立即得知该变化。 状态变更的追踪问题: 无法追踪

    2024年01月19日
    浏览(40)
  • Vue2向Vue3过度Vue3状态管理工具Pinia

    Pinia 是 Vue 的专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品 后面在实际开发项目的时候,Pinia可以在项目创建时自动添加,现在我们初次学习,从零开始: 使用 Vite 创建一个空的 Vue3项目 按照官方文档安装 pinia 到项目中 定义store 组件使用store Pinia中的 getters 直接使

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包