我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue新的状态管理Pinia怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue新的状态管理Pinia怎么使用

今天小编给大家分享一下Vue新的状态管理Pinia怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    为什么有 Vuex 了还要再开发一个 Pinia ?

    先来一张图,看下当时对于 Vuex5 的提案,就是下一代 Vuex5 应该是什么样子的

    Vue新的状态管理Pinia怎么使用

    Pinia 就是完整的符合了他当时 Vuex5 提案所提到的功能点,所以可以说 Pinia 就是 Vuex5 也不为过,因为它的作者就是官方的开发人员,并且已经被官方接管了,只是目前 Vuex 和 Pinia 还是两个独立的仓库,以后可能会合并,也可能独立发展,只是官方肯定推荐的是 Pinia

    因为在 Vue3 中使用 Vuex 的话需要使用 Vuex4,还只能作为一个过渡的选择,存在很大缺陷,所以在 Componsition API 诞生之后,也就设计了全新的状态管理 Pinia

    Pinia 和 Vuex

    VuexStateGettesMutations(同步)、Actions(异步)

    PiniaStateGettesActions(同步异步都支持)

    Vuex 当前最新版是 4.x

    • Vuex4 用于 Vue3

    • Vuex3 用于 Vue2

    Pinia 当前最新版是 2.x

    • 即支持 Vue2 也支持 Vue3

    就目前而言 Pinia 比 Vuex 好太多了,解决了 Vuex 的很多问题,所以笔者也非常建议直接使用 Pinia,尤其是 TypeScript 的项目

    Pinia 核心特性

    Pinia 没有 Mutations

    Actions支持同步和异步

    没有模块的嵌套结构

    Pinia 通过设计提供扁平结构,就是说每个 store 都是互相独立的,谁也不属于谁,也就是扁平化了,更好的代码分割且没有命名空间。当然你也可以通过在一个模块中导入另一个模块来隐式嵌套 store,甚至可以拥有 store 的循环依赖关系

    更好的 TypeScript 支持

    不需要再创建自定义的复杂包装器来支持 TypeScript 所有内容都类型化,并且 API 的设计方式也尽可能的使用 TS 类型推断

    不需要注入、导入函数、调用它们,享受自动补全,让我们开发更加方便

    无需手动添加 store,它的模块默认情况下创建就自动注册的

    Vue2 和 Vue3 都支持

    除了初始化安装和SSR配置之外,两者使用上的API都是相同的

    支持 Vue DevTools

    • 跟踪 actions, mutations 的时间线

    • 在使用了模块的组件中就可以观察到模块本身

    • 支持 time-travel 更容易调试

    • 在 Vue2 中 Pinia 会使用 Vuex 的所有接口,所以它俩不能一起使用

    • 但是针对 Vue3 的调试工具支持还不够完美,比如还没有 time-travel 功能

    模块热更新

    • 无需重新加载页面就可以修改模块

    • 热更新的时候会保持任何现有状态

    支持使用插件扩展 Pinia 功能

    支持服务端渲染

    Pinia 使用

    Vue3 + TypeScript 为例

    安装

    npm install pinia

    main.ts 初始化配置

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

    在 store 目录下创建一个 user.ts 为例,我们先定义并导出一个名为 user 的模块

    import { defineStore } from 'pinia'export const userStore = defineStore('user', {    state: () => {        return {             count: 1,            arr: []        }    },    getters: { ... },    actions: { ... }})

    defineStore 接收两个参数

    第一个参数就是模块的名称,必须是唯一的,多个模块不能重名,Pinia 会把所有的模块都挂载到根容器上

    第二个参数是一个对象,里面的选项和 Vuex 差不多

    • 其中 state 用来存储全局状态,它必须是箭头函数,为了在服务端渲染的时候避免交叉请求导致的数据状态污染所以只能是函数,而必须用箭头函数则为了更好的 TS 类型推导

    • getters 就是用来封装计算属性,它有缓存的功能

    • actions 就是用来封装业务逻辑,修改 state

    访问 state

    比如我们要在页面中访问 state 里的属性 count

    由于 defineStore 会返回一个函数,所以要先调用拿到数据对象,然后就可以在模板中直接使用了

    <template>    <div>{{ user_store.count }}</div></template><script lang="ts" setup>import { userStore } from '../store'const user_store = userStore()// 解构// const { count } = userStore()</script>

    比如像注释中的解构出来使用,是完全没有问题的,只是注意了,这样拿到的数据不是响应式的,如果要解构还保持响应式就要用到一个方法 storeToRefs(),示例如下

    <template>    <div>{{ count }}</div></template><script lang="ts" setup>import { storeToRefs } from 'pinia'import { userStore } from '../store'const { count } = storeToRefs(userStore())</script>

    原因就是 Pinia 其实是把 state 数据都做了 reactive 处理,和 Vue3 的 reactive 同理,解构出来的也不是响应式,所以需要再做 ref 响应式代理

    getters

    这个和 Vuex 的 getters 一样,也有缓存功能。如下在页面中多次使用,第一次会调用 getters,数据没有改变的情况下之后会读取缓存

    <template>    <div>{{ myCount }}</div>    <div>{{ myCount }}</div>    <div>{{ myCount }}</div></template>

    注意两种方法的区别,写在注释里了

    getters: {    // 方法一,接收一个可选参数 state    myCount(state){        console.log('调用了') // 页面中使用了三次,这里只会执行一次,然后缓存起来了        return state.count + 1    },    // 方法二,不传参数,使用 this    // 但是必须指定函数返回值的类型,否则类型推导不出来    myCount(): number{        return this.count + 1    }}

    更新和 actions

    更新 state 里的数据有四种方法,我们先看三种简单的更新,说明都写在注释里了

    <template>    <div>{{ user_store.count }}</div>    <button @click="handleClick">按钮</button></template><script lang="ts" setup>import { userStore } from '../store'const user_store = userStore()const handleClick = () => {    // 方法一    user_store.count++        // 方法二,需要修改多个数据,建议用 $patch 批量更新,传入一个对象    user_store.$patch({        count: user_store.count1++,        // arr: user_store.arr.push(1) // 错误        arr: [ ...user_store.arr, 1 ] // 可以,但是还得把整个数组都拿出来解构,就没必要    })        // 使用 $patch 性能更优,因为多个数据更新只会更新一次视图        // 方法三,还是$patch,传入函数,第一个参数就是 state    user_store.$patch( state => {        state.count++        state.arr.push(1)    })}</script>

    第四种方法就是当逻辑比较多或者请求的时候,我们就可以封装到示例中 store/user.ts 里的 actions 里

    可以传参数,也可以通过 this.xx 可以直接获取到 state 里的数据,需要注意的是不能用箭头函数定义 actions,不然就会绑定外部的 this 了

    actions: {    changeState(num: number){ // 不能用箭头函数        this.count += num    }}

    调用

    const handleClick = () => {    user_store.changeState(1)}

    支持 VueDevtools

    打开开发者工具的 Vue Devtools 就会发现 Pinia,而且可以手动修改数据调试,非常方便

    Vue新的状态管理Pinia怎么使用

    模拟调用接口

    示例:

    我们先定义示例接口 api/user.ts

    // 接口数据类型export interface userListType{    id: number    name: string    age: number}// 模拟请求接口返回的数据const userList = [    { id: 1, name: '张三', age: 18 },    { id: 2, name: '李四', age: 19 },]// 封装模拟异步效果的定时器async function wait(delay: number){    return new Promise((resolve) => setTimeout(resolve, delay))}// 接口export const getUserList = async () => {    await wait(100) // 延迟100毫秒返回    return userList}

    然后在 store/user.ts 里的 actions 封装调用接口

    import { defineStore } from 'pinia'import { getUserList, userListType } from '../api/user'export const userStore = defineStore('user', {    state: () => {        return {            // 用户列表            list: [] as userListType // 类型转换成 userListType        }    },    actions: {         async loadUserList(){            const list = await getUserList()            this.list = list        }    }})

    页面中调用 actions 发起请求

    <template>    <ul>        <li v-for="item in user_store.list"> ... </li>    </ul></template><script lang="ts" setup>import { userStore } from '../store'const user_store = userStore()user_store.loadUserList() // 加载所有数据</script>

    跨模块修改数据

    在一个模块的 actions 里需要修改另一个模块的 state 数据

    示例:比如在 chat 模块里修改 user 模块里某个用户的名称

    // chat.tsimport { defineStore } from 'pinia'import { userStore } from './user'export const chatStore = defineStore('chat', {    actions: {         someMethod(userItem){            userItem.name = '新的名字'            const user_store = userStore()            user_store.updateUserName(userItem)        }    }})

    user 模块里

    // user.tsimport { defineStore } from 'pinia'export const userStore = defineStore('user', {    state: () => {        return {            list: []        }    },    actions: {         updateUserName(userItem){            const user = this.list.find(item => item.id === userItem.id)            if(user){                user.name = userItem.name            }        }    }})

    以上就是“Vue新的状态管理Pinia怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Vue新的状态管理Pinia怎么使用

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

    下载Word文档

    猜你喜欢

    Vue新的状态管理Pinia怎么使用

    今天小编给大家分享一下Vue新的状态管理Pinia怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。为什么有 Vuex
    2023-07-06

    Vue全新状态管理Pinia怎么用

    这篇文章给大家分享的是有关Vue全新状态管理Pinia怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Vuex 作为一个老牌 Vue 状态管理库,大家都很熟悉了Pinia 是 Vue.js 团队成员专门为 V
    2023-06-29

    Vue3状态管理之Pinia怎么使用

    这篇文章主要介绍“Vue3状态管理之Pinia怎么使用”,在日常操作中,相信很多人在Vue3状态管理之Pinia怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3状态管理之Pinia怎么使用”的疑
    2023-06-30

    一文带你上手Vue新的状态管理Pinia

    Vuex作为一个老牌Vue状态管理库,大家都很熟悉了,Pinia是Vue.js团队成员专门为Vue开发的一个全新的状态管理库,本文就来讲讲它的具体使用吧
    2023-05-15

    Vue项目新一代状态管理工具Pinia的使用教程

    pinia是一个轻量级的状态管理库,属于vue3生态圈新的成员之一,下面这篇文章主要给大家介绍了关于Vue项目新一代状态管理工具Pinia的使用教程,需要的朋友可以参考下
    2022-11-13

    Vue之Pinia状态管理的方法是什么

    这篇文章主要介绍“Vue之Pinia状态管理的方法是什么”,在日常操作中,相信很多人在Vue之Pinia状态管理的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue之Pinia状态管理的方法是什么
    2023-07-05

    Vue状态管理库Pinia和Vuex使用哪个好

    今天小编给大家分享一下Vue状态管理库Pinia和Vuex使用哪个好的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Vuex
    2023-07-05

    浅析Vue项目中怎么用Pinia状态管理工具

    Vue项目中怎么用Pinia状态管理工具?下面本篇文章带大家聊聊Vue项目中Pinia状态管理工具的使用,希望对大家有所帮助!
    2022-11-22

    Vue3状态管理库Pinia如何使用

    这篇文章主要介绍“Vue3状态管理库Pinia如何使用”,在日常操作中,相信很多人在Vue3状态管理库Pinia如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3状态管理库Pinia如何使用”的疑
    2023-07-04

    Vue项目中如何用Pinia状态管理工具

    这篇文章主要介绍“Vue项目中如何用Pinia状态管理工具”,在日常操作中,相信很多人在Vue项目中如何用Pinia状态管理工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue项目中如何用Pinia状态管
    2023-07-04

    Pinia怎么实现简单的用户状态管理

    这篇“Pinia怎么实现简单的用户状态管理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Pinia怎么实现简单的用户状态管理
    2023-07-04

    Vue怎么使用pinia管理数据

    这篇文章主要讲解了“Vue怎么使用pinia管理数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么使用pinia管理数据”吧!Vue使用pinia管理数据Vue3 + TS步骤:在
    2023-07-05

    Vue生态的新成员Pinia怎么用

    小编给大家分享一下Vue生态的新成员Pinia怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Pinia是Vue应用程序的状态管理方案,是Vuex核心团队成员
    2023-06-26

    vue怎么使用Vuex状态管理模式

    这篇“vue怎么使用Vuex状态管理模式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么使用Vuex状态管理模式”文
    2023-06-29

    聊聊两个Vue状态管理库Pinia和Vuex,该用哪个?

    本篇文章带大家聊聊Vue状态管理,介绍一下两个Vue状态管理库:Pinia和Vuex,希望对大家有所帮助!
    2023-05-14

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录