国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue 全局狀態(tài)管理(簡單的store模式、使用Pinia)

這篇具有很好參考價值的文章主要介紹了vue 全局狀態(tài)管理(簡單的store模式、使用Pinia)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

為什么使用狀態(tài)管理

多個組件可能會依賴同一個狀態(tài)時,我們有必要抽取出組件內(nèi)的共同狀態(tài)集中統(tǒng)一管理,存放在一個全局單例中,這樣任何位置上的組件都可以訪問其中的狀態(tài)或觸發(fā)動作

簡單的store模式

通過自定義一個store模式實現(xiàn)全局的狀態(tài)管理,實例如下
有兩個組件a、b共享store和store2兩個狀態(tài),我們將其抽離在一個全局單例中,代碼如下:

import { reactive } from "vue";
export const store = reactive({
  count: 0
});
export const store2 = {
  count: 0
};

a組件中:

<script setup>
import { store, store2 } from "./store.js";
console.log(store, store2);
</script>

<template>
  <div @click="store.count++">From A: {{ store.count }}</div>
</template>

b組件中:

<script setup>
import { store, store2 } from "./store.js";
console.log(store, store2);
</script>

<template>
  <div @click="store2.count++">From B: {{ store.count }}</div>
</template>

這樣,a、b組件共享了store和store2兩個值,在一個組件中對值進(jìn)行更新,在其他組件中對應(yīng)的值也會發(fā)生改變。

同時關(guān)閉a、b組件后,值依然保存,重新加載兩個組件,原來的狀態(tài)值存在。

重新刷新后,store和store2會變?yōu)槌跏贾?,如果需要做持久化,則需要再使用localstorage等進(jìn)行存儲。

服務(wù)器渲染(SSR)

這種簡單store模式下,可能會出現(xiàn)跨請求狀態(tài)污染。

在 SSR 環(huán)境下,應(yīng)用模塊通常只在服務(wù)器啟動時初始化一次。同一個應(yīng)用模塊會在多個服務(wù)器請求之間被復(fù)用,而我們的單例狀態(tài)對象也一樣。如果我們用單個用戶特定的數(shù)據(jù)對共享的單例狀態(tài)進(jìn)行修改,那么這個狀態(tài)可能會意外地泄露給另一個用戶的請求。我們把這種情況稱為跨請求狀態(tài)污染。

pinia

簡介

pinia在設(shè)計時考慮了ssr,參考這里(服務(wù)端渲染 (SSR) | Pinia (vuejs.org))

Vuex是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式 + 庫。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化。

Pinia 最初正是為了探索 Vuex 的下一個版本而開發(fā)的,整合了vue核心團隊關(guān)于 Vuex 5 的許多想法。

相比于 Vuex,Pinia 提供了更簡潔直接的 API,并提供了組合式風(fēng)格的 API,最重要的是,在使用 TypeScript 時它提供了更完善的類型推導(dǎo)。

示例

1. 定義一個index.ts文件

import { createPinia } from "pinia";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";

// pinia persist
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);

export default pinia;

直接通過引入pinia-plugin-persistedstate插件來實現(xiàn)數(shù)據(jù)的持久化,默認(rèn)進(jìn)行l(wèi)ocalstorage方式持久化存儲(pinia只是狀態(tài)管理庫,默認(rèn)是不會進(jìn)行數(shù)據(jù)持久化的

當(dāng)然,有很多的存儲方法,比如vueuse的 useLocalStorage方法,但是為什么需要用到pinia-plugin-persistedstate呢,官方文檔給出了理由:

pinia-plugin-persistedstate 旨在通過一致的 API 為每個人和每個項目中的 Pinia Store 提供持久化存儲。如果你希望保存一個完整的 Store,或者需要細(xì)?;渲?storage 和序列化的方式,該插件都為你提供了相應(yīng)的功能,并且可以在你想要持久化的 Store 上使用相同的配置。

2. 在main.ts中引入

import pinia from "@/stores";
import { createApp } from "vue";
import App from "./App.vue";
const app = createApp(App);
app.use(pinia).mount("#app");

通過app.use實現(xiàn)插件全局注冊以及初始化和配置,即使得全局的pinia都使用了piniaPluginPersistedstate插件

3. 定義

在/stores/modules/user文件,可以直接通過defineStore方法進(jìn)行定義,狀態(tài)存在state中。

actions中是對state的一些操作和方法,其他組件通過這些方法操作state,保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化。

getters中是獲取state的一些方法,在這些方法中可以對state做一些預(yù)處理和變化再傳遞給調(diào)用的組件

import { defineStore } from "pinia";
import { UserState } from "@/stores/interface";
import piniaPersistConfig from "@/config/piniaPersist";

export const useUserStore = defineStore({
  id: "user",
  state: (): UserState => ({
    token: "",
    userInfo: { name: "cc" }
  }),
  getters: {},
  actions: {
    // Set Token
    setToken(token: string) {
      this.token = token;
    },
    // Set setUserInfo
    setUserInfo(userInfo: UserState["userInfo"]) {
      this.userInfo = userInfo;
    }
  },
  persist: piniaPersistConfig("user")
});

persist則是引入了piniaPluginPersistedstate持久化后的一些可配置信息

/config/piniaPersist內(nèi)容如下:

import { PersistedStateOptions } from "pinia-plugin-persistedstate";

/**
 * @description pinia 持久化參數(shù)配置
 * @param {String} key 存儲到持久化的 name
 * @param {Array} paths 需要持久化的 state name
 * @return persist
 * */
const piniaPersistConfig = (key: string, paths?: string[]) => {
  const persist: PersistedStateOptions = {
    key,
    storage: localStorage,
    // storage: sessionStorage,
    paths
  };
  return persist;
};

export default piniaPersistConfig;

paths用于指定 state 中哪些數(shù)據(jù)需要被持久化。[] 表示不持久化任何狀態(tài),undefinednull 表示持久化整個 state。

更多配置信息可以參考官方文檔prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/config.html

4. 使用

import { useUserStore } from "@/stores/modules/user";
const userStore = useUserStore();
router.beforeEach( (to, from, next) => {
    if (userStore.token) return next(from.fullPath);
}

通過const userStore = useUserStore();引入userStore,全局token來判斷當(dāng)前登錄狀態(tài)

storeToRefs

解構(gòu)賦值后的變量會喪失響應(yīng)性,使用storeToRefs方法可以使變量重新獲得響應(yīng)性。
注意這里的變量應(yīng)該指的是基本數(shù)據(jù)類型,如果是對象,則會保留響應(yīng)性。

例如:定義如下store

export const useUserStore = defineStore({
  id: "user",
  state: (): UserState => ({
    token: "",
    userInfo: { name: "Geeker" }
  }),
  getters: {
    getUserInfo(state) {
      return state.userInfo;
    }
  },
  actions: {
    // Set Token
    setToken(token: string) {
      this.token = token;
    },
    // Set setUserInfo
    setUserInfo(userInfo: UserState["userInfo"]) {
      this.userInfo = userInfo;
    },
    setName(name: string) {
      this.userInfo.name = name;
    }
  },
  persist: piniaPersistConfig("user")
});

在其他組件中引入

<script setup lang="ts">
import { computed } from "vue";
import { storeToRefs } from "pinia";
import { useUserStore } from "@/stores/modules/user";

const userStore = useUserStore();
const username = computed(() => userStore.userInfo.name);
const { userInfo } = userStore;
console.log(userInfo);

const { token } = storeToRefs(userStore);
console.log(token);
const changeToken = () => {
  userStore.setToken("123" + Math.random());
  console.log(token);
};
</script>

<template>
 <span class="username">{{ username }}</span>
 <span @click="userStore.setName('456')">{{ userStore.getUserInfo.name }}</span>
 <span @click="userInfo.name = 'zcc'" class="username">{{ userInfo.name }}</span>
 <span @click="changeToken">{{ token }}</span>
</template>

結(jié)果如圖,此時token和userInfo都是具有響應(yīng)性的,使用changeToken函數(shù)后store中的token和解構(gòu)的token都會發(fā)生變化
vue 全局狀態(tài)管理(簡單的store模式、使用Pinia),vue,vue.js,前端,javascript
但是如果將storeToRefs去掉

<script setup lang="ts">
import { computed } from "vue";

import { useUserStore } from "@/stores/modules/user";

const userStore = useUserStore();
const username = computed(() => userStore.userInfo.name);
const { userInfo } = userStore;
console.log(userInfo);

const { token } = userStore;
console.log(token);
const changeToken = () => {
  userStore.setToken("123" + Math.random());
    console.log("失去響應(yīng)的", token);
  console.log("userStore.token", userStore.token);
};
</script>

結(jié)果如圖,token將喪失響應(yīng)性
vue 全局狀態(tài)管理(簡單的store模式、使用Pinia),vue,vue.js,前端,javascript
此時調(diào)用changeToken函數(shù),只有userStore.token會變化,解構(gòu)的token不會變化
vue 全局狀態(tài)管理(簡單的store模式、使用Pinia),vue,vue.js,前端,javascript
但是對于userInfo來說,無論是修改store中的name——userStore.setName(‘456’)",還是直接修改解構(gòu)的userInfo——userInfo.name = ‘zcc’,上述代碼中的三項不同方式獲取的name都會同時發(fā)生改變。文章來源地址http://www.zghlxwxcb.cn/news/detail-637176.html

到了這里,關(guān)于vue 全局狀態(tài)管理(簡單的store模式、使用Pinia)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 微信小程序開發(fā)(第五期):npm包的使用、Vant Weapp 組件庫的使用 && API Promise優(yōu)化 、全局狀態(tài)管理 && store 、分包、分包預(yù)下載 && 自定義配置tabBar

    微信小程序開發(fā)(第五期):npm包的使用、Vant Weapp 組件庫的使用 && API Promise優(yōu)化 、全局狀態(tài)管理 && store 、分包、分包預(yù)下載 && 自定義配置tabBar

    LiuJInTao:2024年4月6日 一、小程序?qū)?npm 包的限制 二、Vant Weapp 組件庫 1. 什么是 Vant Weapp 官網(wǎng)文檔地址 2. Vant Weapp 組件庫的安裝 注意點: 我們最新版本的微信開發(fā)者工具是不是沒有勾選npm的,默認(rèn)系統(tǒng)內(nèi)部自動勾選。 步驟一 通過 npm 安裝 使用npm構(gòu)建前,請先閱讀微信官方的

    2024年04月27日
    瀏覽(30)
  • Vue3 store+pinia 基本使用

    pinia是一個 狀態(tài)管理的庫 ,用于 跨組件、頁面進(jìn)行狀態(tài)共享 (這和Vuex、Redux一樣),用起來像組合式API Pinia和Vuex有什么區(qū)別 1、PInia的最初是為了探索Vuex的下一次迭代會是什么樣子,結(jié)合了Vuex核心團隊討論中的許多想法; 2、最終,團隊意識到Pinia已經(jīng)實現(xiàn)了Vuex5中大部分內(nèi)

    2024年02月07日
    瀏覽(38)
  • vue3中狀態(tài)管理庫pinia的安裝和使用方法介紹及和vuex的區(qū)別

    Pinia 與 Vuex 一樣,是作為 Vue 的“狀態(tài)存儲庫”,用來實現(xiàn) 跨頁面/組件 形式的數(shù)據(jù)狀態(tài)共享。它允許你跨組件或頁面共享狀態(tài)。如果你熟悉組合式 API 的話,你可能會認(rèn)為可以通過一行簡單的 export const state = reactive({}) 來共享一個全局狀態(tài)。 當(dāng)該數(shù)據(jù)、方法在很多地方都需要

    2024年01月20日
    瀏覽(21)
  • Vue狀態(tài)管理庫-Pinia

    Vue狀態(tài)管理庫-Pinia

    Pinia 是 Vue 的專屬狀態(tài)管理庫,它允許支持跨組件或頁面共享狀態(tài),即共享數(shù)據(jù),他的初始設(shè)計目的是設(shè)計一個支持組合式API的 Vue 狀態(tài)管理庫(因為vue3一個很大的改變就是組合式API),當(dāng)然這并不是說Pinia只支持vue3,他是同時支持vue2和vue3的, 本文傾向于擁抱Vue3,所以代碼語

    2024年02月22日
    瀏覽(29)
  • Vue——狀態(tài)管理庫Pinia

    Vue——狀態(tài)管理庫Pinia

    寫在前面 :本文參考小滿大牛的pinia專欄 Vuex 和 Pinia 均是 Vue.js 的狀態(tài)管理庫,它們?yōu)?Vue 應(yīng)用程序提供了一種集中式的、可預(yù)測的狀態(tài)管理解決方案。 Vuex 是 Vue.js 官方推薦的狀態(tài)管理庫之一。它的核心概念包括 state、mutation、action 和 getter。其中,state 代表應(yīng)用程序的狀態(tài)

    2024年02月07日
    瀏覽(23)
  • 【Vue全家桶】Pinia狀態(tài)管理

    【Vue全家桶】Pinia狀態(tài)管理

    ??這里是前端程序員小張! ??人海茫茫,感謝這一秒你看到這里。希望我的文章對你的有所幫助! ??愿你在未來的日子,保持熱愛,奔赴山海! Pinia開始于大概2019年,其目的是設(shè)計一個擁有 組合式 API 的 Vue 狀態(tài)管理庫 目前同時兼容Vue2、Vue3,也并不要求你使用Compositio

    2023年04月09日
    瀏覽(101)
  • Vue--》探索Pinia:Vue狀態(tài)管理的未來

    Vue--》探索Pinia:Vue狀態(tài)管理的未來

    目錄 Pinia的講解與使用 Pinia的安裝與使用 store數(shù)據(jù)操作 解構(gòu)store數(shù)據(jù)

    2024年02月05日
    瀏覽(19)
  • vue3學(xué)習(xí)-Pinia狀態(tài)管理

    定義一個Store 這個 name ,也稱為 id ,是必要的,Pinia 使用它來將 store 連接到 devtools。 將返回的函數(shù)命名為 use… 是跨可組合項的約定,以使其符合你的使用習(xí)慣。 使用 store 一旦 store 被實例化,你就可以直接在 store 上訪問 state 、 getters 和 actions 中定義的任何屬性 store 是一

    2024年02月14日
    瀏覽(15)
  • Vue | Vue.js 全家桶 Pinia狀態(tài)管理

    Vue | Vue.js 全家桶 Pinia狀態(tài)管理

    ??? Vue?.js專欄:Node.js Vue.js 全家桶 Pinia狀態(tài)管理 ????? 個人簡介:一個不甘平庸的平凡人?? ? 個人主頁:CoderHing的個人主頁 ?? 格言: ?? 路漫漫其修遠(yuǎn)兮,吾將上下而求索?? ?? 你的一鍵三連是我更新的最大動力?? 目錄 一、Pinia和Vuex的對比 什么是Pinia呢? Pina和

    2024年01月16日
    瀏覽(119)
  • Vue最新狀態(tài)管理工具Pinia——徹底搞懂Pinia是什么

    Vue最新狀態(tài)管理工具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/ 最近在 前端的深入學(xué)習(xí)過程 中,接觸了與 狀態(tài)管理 相關(guān)的內(nèi)容,涉及到 與vue2適配的vuex 和 與vue3適配的pinia ,因此

    2024年02月03日
    瀏覽(52)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包