vue3探索——pinia高阶使用

这篇具有很好参考价值的文章主要介绍了vue3探索——pinia高阶使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下是一些 Pinia 的其他高阶功能:

  1. storeToRefs():响应式解构仓库,保证解构出来的数据是响应式的数据。
  2. 状态持久化:Pinia 并没有内置的状态持久化功能,但你可以使用第三方库或自定义插件来实现状态的持久化。例如,你可以使用 localStorage 或 sessionStorage 来将状态保存在客户端。
  3. 插件系统:Pinia 允许你编写自定义插件,以扩展和定制状态管理功能。你可以创建插件来处理持久化、日志记录、错误处理等任务,以适应你的特定需求。

响应式解构storeToRefs()

背景

在组件中访问仓库state,getters,actions时,总要在变量名前面带上仓库实例名,像下面这样,每个变量都这么写就会显得很代码很累赘。而直接解构的话,数据会丢失响应式。

import store from '@/store/senior.ts';
const userStore = store();
// 访问state中的money,需要敲上'userStore.'
console.log(userStore.money);

// 直接解构,会丢失响应式
const { age } = userStore;

vue3探索——pinia高阶使用

使用

在组件中使用storeToRefs可以保证解构出来的数据是响应式的数据。

import { storeToRefs } from 'pinia';
// ......
const { age } = storeToRefs(userStore);
console.log(age.value); // 别忘了 .value 这个小尾巴~

vue3探索——pinia高阶使用

状态持久化插件pinia-plugin-persist

pinia本身不提供持久化存储状态,这里我们使用插件pinia-plugin-persist 进行持久化存储。

npm: pinia-plugin-persist

Pinia Plugin Persist

1-安装

  • yarn
yarn add pinia-plugin-persist
  • npm
npm install pinia-plugin-persist
  • pnpm
pnpm add pinia-plugin-persist

2-配置

src/store/index.ts中进行pinia的配置

import { createPinia } from 'pinia';
// 1-引入包
import piniaPersist from 'pinia-plugin-persist';

const pinia = createPinia();
// 2-使用pinia-plugin-persist插件
pinia.use(piniaPersist);

export default pinia;

src/main.ts

// ......
import { createApp } from 'vue';
import App from './App.vue';
// 1-引入pinia配置文件
import pinia from '@/store/index.ts';

const app = createApp(App);
// 2-使用pinia配置文件
app.use(pinia);

app.mount('#app');

打开项目下的ts配置文件tsconfig.json

{
  "compilerOptions": {
    "types": [
      "pinia-plugin-persist"
    ]
  },
}

3-使用

组合式API写法

在仓库中的defineStore() 第三个参数进行配置。

src/store/senior.ts

export const store = defineStore(
    'senior',
    () => {
        const age = ref(18);
        const money = ref(100);

        return {
            age,
            money
        }
    },
    {
        persist: {
            enabled: true, // 启用持久化存储
            // 存储策略,可以配置多个存储策略,一条策略对应一个存储
            strategies: [
                {
                    key: 'local_age', // 存储的key名
                    storage: localStorage, // 存储方式
                    paths: ['money'] // 指定state字段进行存储
                },
                {
                    key: 'session_age',
                    storage: sessionStorage
                }
            ]
        }
    }
);

vue3探索——pinia高阶使用

vue3探索——pinia高阶使用

persist参数说明:

  • enabled:(true) 开启持久化存储。
  • strategies:(Array) 配置存储策略,一条策略对应一个存储。
    • key:(String) 存储的key名。
    • storage:(Storage) 存储方式,默认值是sessionStorage,可以是localStorage,也可以自定义存储方式。
    • paths:(Array<string>) 指定某些state字段进行存储。若不配置,默认对整个state进行存储。

选项式API写法

src/store/senior.ts

export const store = defineStore('senior', {
    state() {
        return {
            age: 18,
            money: 100,
        }
    },
    persist: {
        enabled: true,
        strategies: [
            {
                key: 'local_age',
                storage: localStorage,
                paths: ['money']
            },
            {
                key: 'session_age',
                storage: sessionStorage
            }
        ]
    }
})

4-自定义存储方式(cookie)

以下示例是对官方示例,进行优化的版本。

(1)安装js-cookie

  • yarn
yarn add js-cookie
  • npm
npm install js-cookie
  • pnpm
pnpm add js-cookie

(2)定义仓库

src/store/senior.ts

import { defineStore } from "pinia";
import { ref } from 'vue';
import Cookies from 'js-cookie';

// 1-定义存储方式cookiesStorage
const cookiesStorage: Storage = {
    setItem(key, state) {
        // 判断是值,还是整个仓库
        const isKey = Object.keys(JSON.parse(state)).includes(key);
        if (isKey) {
            // 值
            return Cookies.set(key, JSON.stringify(JSON.parse(state)[key]), { expires: 3 });
        }
        else {
            // 仓库state
            return Cookies.set(key, state, { expires: 3 });
        }

    },
    getItem(key) {
        // 判断键值是否存在
        let value = Cookies.get(key);

        // 这里应该需要判断是整个仓库state、还是值
        // 但目前没有发现较好的判断方法,所以persist必须配置paths
        /*
            // 如果是整个仓库state
            return value;
        */

        return value ?
            // 存在,返回对应的值(parse处理,保证和原类型一致)
            JSON.stringify({ [key]: JSON.parse(value) })
            :
            // 不存在,不做parse处理,防undefined报错
            JSON.stringify({ [key]: value });
    }
}

export const store = defineStore('senior', () => {
    const age = ref(123456);

    return {
        age,
    }
}, {
    persist: {
        enabled: true,
        strategies: [
            {
                storage: cookiesStorage, // 2-使用cookiesStorage存储方式
                key: 'age',
                paths: ['age'] // 3-必须配置paths指定state字段,否则数据会错乱
            },
        ]
    }
});

!!!注意:目前,根据官方文档的示例以及笔者的实践,使用cookie进行持久化存储,persist.strategies必须要配置paths 属性,即无法默认存储整个state,否则数据会出现错乱(文章中就不演示了,有兴趣的小伙伴儿可自行尝试)。

插件系统

介绍

Pinia 插件是一个函数,函数接收一个参数context(上下文对象),可以获取pinia实例、app应用等。

export functionmyPiniaPlugin(context) {
  context.pinia // 使用 `createPinia()` 创建的 pinia
  context.app // 使用 `createApp()` 创建的当前应用程序(仅限 Vue 3)
  context.store // 插件正在扩充的 store
  context.options // 定义存储的选项对象传递给`defineStore()`
	// ...
};

然后使用 pinia.use() 将此函数传递给 pinia

pinia.use(myPiniaPlugin);

插件仅适用于在 将pinia传递给应用程序后创建的 store,否则将不会被应用。

功能

pinia官网描述pinia插件的功能:

  • 向 Store 添加新属性
  • 定义 Store 时添加新选项
  • 为 Store 添加新方法
  • 包装现有方法
  • 更改甚至取消操作
  • 实现本地存储等副作用
  • 适用于特定 Store
  • ……

向 Store 添加新属性

自定义插件函数返回(return)一个对象,对象中就是需要增加的属性。

src/store/index.ts中,配置pinia插件。

import { createPinia } from 'pinia';
import { ref } from 'vue';
const pinia = createPinia();

// 1-定义插件:向store增加属性
const expandStore = () => {
    // 2-这里把需要增加的属性return出去即可
    return {
        hello: ref(123) // 在所有store上添加'hello'状态
    };
}
// 3-使用插件
pinia.use(expandStore);

export default pinia;

vue3探索——pinia高阶使用

读取 Store 配置项

可以通过插件函数context.options 来获取每个store的额外配置,以便根据每个仓库的功能进行区别开发。

1-定义 Store 时添加新选项

  • 在组合式API中,defineStore() 的第三个参数就是仓库的配置项。
  • 在选项式API中,直接在defineStore() 的第二个参数(一个对象)中添加属性作为配置项。

src/store/senior.ts

组合式API

import { defineStore } from "pinia";
export const store = defineStore('senior',
    () => {
        return {}
    },
    {
        haha: {
            option1: '123'
        }
    }
);

选项式API

import { defineStore } from "pinia";
export const store = defineStore('senior',
    {
        state: () => ({}),
        getters: {},
        actions: {},
        haha: {
            option1: '123'
        }
    }
);

2-插件中获取每个store的选项

src/store/index.ts

// 这里使用解构赋值,把options从context中解构出来
const expandStore = ({ options }) => {
    console.log('options', options);
}
pinia.use(expandStore);

vue3探索——pinia高阶使用

监听仓库变化$subscribe()和$onAction()

在插件中使用 store.$subscribe()和 store.$onAction(),可以监听仓库的变化。

pinia.use(({ store }) => {
  store.$subscribe(() => {
    // 在存储变化的时候执行
  })
  store.$onAction(() => {
    // 在 action 的时候执行
  })
})

包装或重写现有方法

重写$reset方法

可以参考上一篇博文,重写了$reset方法:vue3探索——5分钟快速上手大菠萝pinia

import { createPinia } from 'pinia';
const pinia = createPinia();
 
// 1-使用pinia自定义插件
pinia.use(({ store }) => {
    // 2-获取最开始的State
    const initialState = JSON.parse(JSON.stringify(store.$state));
    // 3-重写$reset()方法
    store.$reset = () => {
        // 4-利用$patch()批量变更state,达到重置state的目的
        store.$patch(initialState);
    }
});
 
export default pinia;

暂时没有更多辣~文章来源地址https://www.toymoban.com/news/detail-709819.html

到了这里,关于vue3探索——pinia高阶使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • pinia在vue3中的使用

    总结: 在store文件夹中建一个pinia的文件userStore.js 1.要想使用pinia必须先引入defineStore  这里我们使用es6的模块化语法导出的   import { defineStore } from \\\'pinia\\\' 2.然后使用export const useUserStore = defineStore(\\\'user\\\',{})   defineStore 方法有两个参数,第一个参数是模块化名字(也就相当于身份

    2024年02月15日
    浏览(36)
  • Vue3 store+pinia 基本使用

    pinia是一个 状态管理的库 ,用于 跨组件、页面进行状态共享 (这和Vuex、Redux一样),用起来像组合式API Pinia和Vuex有什么区别 1、PInia的最初是为了探索Vuex的下一次迭代会是什么样子,结合了Vuex核心团队讨论中的许多想法; 2、最终,团队意识到Pinia已经实现了Vuex5中大部分内

    2024年02月07日
    浏览(53)
  • vue3使用pinia和pinia-plugin-persist做持久化存储

    插件和版本 src/store/home.js(可直接复制) 参考文章1 参考2 参考3

    2024年02月13日
    浏览(41)
  • Vue3中的pinia使用(收藏版)

    💂 个人网站:【紫陌】【笔记分享网】 💅 想寻找共同学习交流、共同成长的伙伴,请点击【前端学习交流群】 pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。就是和vuex一样的实现数据共享。 依据Pinia官方文档,Pinia是2019年由vue.js官方成员重新设计的新一代状态管理

    2024年01月25日
    浏览(35)
  • 在vue3中使用pinia完整流程图文

    使用vite创建好一个vue3项目,开发语言选择ts 使用 npm i pinia -s 安装最新版本的pinia 这里我的版本安装的是 2.1.4 1.在main中注册pinia 2.在store中创建index.ts和store-name.ts文件 index.ts内容如下: store-name.ts内容如下: app.vue文件的内容如下: 页面输出如下内容则一次简单的pinia的调用完

    2024年02月10日
    浏览(43)
  • 使用 Vite + Vue3 + Element-Plus + Pinia + Ts 搭建 Vue3 项目

    Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。 首先 npm 输入: Project name :项目名称 Select a framework :选择一个框架 Select a variant :选择 ts 或者 js 输入项目名称后选择 vue 选择

    2024年02月09日
    浏览(64)
  • Vue3+Vite+Pinia+Naive项目搭建之二:scss 的安装和使用

    前言 如果对 vue3 的语法不熟悉的,可以移步 Vue3.0 基础入门,快速入门。 github 开源库:Vue3-Vite-Pinia-Naive-Js gitee   开源库:Vue3-Vite-Pinia-Naive-Js 1. 安装依赖  2. 新增 src/assets/style/reset.scss 页面样式初始化 3. 新增 src/assets/style/common.scss 共用样式 4. 新增 src/assets/style/utils.scss 工

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

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

    2024年02月05日
    浏览(41)
  • 使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架

    本文主要将如何利用搭建一个初始化的商城H5项目框架。初始化阶段使用的技术栈有:vue3.2、vue-router、 TS 、 Pinia 、 Vant4、Less、vite                         node -v 检测是否有安装node.js,未安装请先去官网安装node.js         终端输入: npm init vite         自定

    2024年02月12日
    浏览(65)
  • vue3中的pinia

    pinia官网 main.ts中引入 创建store文件夹,创建index.ts App.vue中引入 store  是一个用 reactive  包裹的对象,这意味着不需要在getter 之后写 .value ,但是,就像 setup  中的 props  一样, 我们不能对其进行解构 为了从 Store 中提取属性同时保持其响应式,您需要使用 storeToRefs() 。 它将

    2024年02月10日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包