精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

可愛簡約又輕量的Pinia,你確定不用它嗎?

開發 前端
Pinia.js是由Vue.js團隊核心成員開發的新一代狀態管理器,使用Composition Api進行重新設計的,也被視為下一代Vuex。Pinia是一個Vue的狀態管理庫。

1 寫在前面

Pinia.js是由Vue.js團隊核心成員開發的新一代狀態管理器,使用Composition Api進行重新設計的,也被視為下一代Vuex。Pinia是一個Vue的狀態管理庫,允許跨組件、跨頁面進行全局共享狀態,也由于其設計的簡潔性、和對typescript的良好支持,取代Vuex指日可待。

或許,你在想在vue3中Composition API完全可以使用響應式變量進行全局共享狀態,為什么還需要Pinia呢?其實你忽略的一點,你這樣做在單頁面進行應用是完全可以的,但是如果頁面時服務端進行渲染呈現的,那么就會出現安全漏洞。

Pinia的優點有:

  • 完全支持Typescript,不需要進行復雜的配置
  • 移除了“天下苦秦久矣”的mutations,不需要再區分同步異步去使用不同的方法,actions同時支持同步和異步,這樣形成了state、getters、actions三劍客格局
  • 支持服務端渲染
  • 不再需要套娃??了,沒有模塊嵌套,只有簡簡單單可以自由使用的store概念,形成了更好的代碼分割體驗
  • 相比于Vuex更加輕量的設計,壓縮代碼打包的體積

總而言之,Pinia不僅可愛,還簡單輕量易上手。

2 開始使用

安裝Pinia

$ yarn add pinia
$ npm i pinia
$ pnpm i pinia

創建Store

根據Pinia官方給的格式建議,我們可以在src目錄下創建store目錄,再在其下創建index.ts文件作為store的全局配置文件,并導出store,方便全局掛載。


//src/store/index.ts
import {App} from "vue"
import {createPinia} from "pinia"

const store = createPinia()

export function setupStore(app:App<Element>){
app.use(store)
}

export {store}

在main.ts文件中進行全局掛載store文件:

//src/main.ts
import { createApp } from 'vue'
import App from './App.vue'
import {setupStore} from "@stores/index"

const app = createApp(App);
// 掛載store
setupStore(app)
app.mount("#app")

簡單示例

先定義一個counter的store狀態管理文件。

//src/store/modules/counter.ts
import {defineStore} from "pinia"

export const useCounterStore = defineStore("counter",{
state:()=>{
return {
count:0
}
},
actions:{
increment(){
this.count++
}
}
})

而后在vue文件進行使用:

<template>
<div>count:{{counter.count}}</div>
</template>
<script lang="ts" setup>
import { useCounterStore } from '@store/modules/counter';

const counter = useCounterStore();
counter.count++
counter.$patch({count:counter.count})
counter.increment()
</script>

顯示結果

3State 數據狀態

定義state狀態

在使用倉庫狀態數據前,你需要先使用defineStore()進行定義一個倉庫,需要使用唯一的名字進行命名。

//src/store/modules/counter.ts
import {defineStore} from "pinia"

export const useCounterStore = defineStore("counter",{
state:()=>{
return {
count:0
}
}
})

使用state狀態

在pinia中,state是使用函數進行定義,并返回初始化數據,這樣可以允許pinia作為服務端和客戶端進行使用。

我們已經定義了一個store倉庫,使用useStore()進行獲取倉庫state數據。

<template>
<div>count:{{count}}</div>
<div>doubleCount:{{doubleCount}}</div>
</template>
<script lang="ts" setup>
import { useCounterStore } from '@store/modules/counter';
const counter = useCounterStore();
//使用computed獲取響應式數據
const doubleCount = computed(()=>counter.count*2);

const {count} = counter;
</script>

需要注意的是,在導入store使用state狀態時,直接進行解構會使得變量失去響應式。上面的數據中,count變量是失去了響應式的,它的值一直恒定不變。對此,應該像composition API使用props一樣,從pinia中導出storeToRefs進行獲取響應式數據。

const counter = useCounterStore();
const {count} = storeToRefs(counter)

對此,count現在轉為響應式的數據了,這樣將會把store中的state變量成了響應式,storeToRefs將會自動跳過所有的actions和不需要進行響應式處理的屬性。

修改state狀態

通常,你可以通過store實例進行直接獲取和修改state數據,可以使用store.$reset()進行重置state的數據回復到初始值。

import { useCounterStore } from '@stores/modules/counter';
const counter = useCounterStore();
counter.count++;

當然,你還可以通過使用pinia的內置API即$patch()進行更新,它允許你在同一時間進行多個數據的改變。$patch()允許你去組合多個改變的值,可以像數組進行增刪改查。

import { useTodosStore } from "@stores/modules/todos";
const todosStore = useTodosStore()
todosStore.$patch(state=>{
state.todos.push({
name:"yichuan",
age:18
})
state.isTrue = true
})

$patch()允許你去組合多個改變的值,可以像數組進行增刪改查。

替換state的值,可以通過設置$state的值進行替換store中的state值。

store.$state = {counter:666, name:"onechuan"}

當然也可以通過pinia的實例去改變整個state的值。

pinia.state.value= {}

但是,一般不建議直接修改state的值,Pinia中建議使用actions方法去修改和管理state的值。

監聽state狀態變化

訂閱state的值:你可以通過store的$subscribe()方法去觀察state的改變,類似于subscribe方法。與常規watch()相比,使用$subscribe()的優勢在于,在補丁發布后,訂閱只會觸發一次。

numerStore.$subscribe((mutation,state)=>{
mutation.counter
mutation.name
mutation.isAdmin
localStorage.setItem("numer",JSON.stringify(state))
})

默認情況下,狀態訂閱被綁定到添加它們的組件上(如果存儲在組件的setup()中)。這就以為著當組件被卸載的時候,將自動移除。如果你想再組件被移除后繼續保持它們,可以通過設置{detached:true}作為第二個參數來從當前組件中分離狀態訂閱。

const someStore = useSomeStore()
someStore.$subscribe(callback, { detached: true })

4Getters

getters與store狀態的computed的值完全相同,可以通過defineStore()中的getters屬性來定義,它們通過接收state作為箭頭函數的第一個參數。

export const useStore = defineStore('counter', {
state: () => ({
counter: 0,
}),
getters: {
doubleCount: (state) => state.counter * 2,
},
})

絕大多數情況,getters將只依賴于state,然而,它們也有可能需要去使用其它的getters。因此,在定義一個普通函數時,我們可以通過這個函數訪問整個store實例,但需要定義返回類型的類型。由于ts中的已知的限制,并不影響使用箭頭函數定義的getter和不使用this。

import {defineStore} from "pinia"

export const useNumerStore = defineStore("numer",{
state:()=>({
counter:0,
name:"numer",
isAdmin:true
}),
getters:{
doubleCount(state){
return state.counter * 2
},
// 當使用this的時候,必須準確地設置返回值的類型
doublePlusOne():number{
return this.counter * 2 + 1
}
}
})

當然你也可以通過計算屬性去獲取多個getters,需要通過this去獲取任意的其他getter。

export const useStore = defineStore("main",{
state:()=>({
counter:0
}),
getters:{
doubleCount:state=>state.counter * 2,
doubleCountPlusOne(){
return this.doubleCount + 1
}
}
})

getter只是在幕后的計算屬性,因此不能向其傳遞任何參數。但是你可以從getter返回一個函數來接收任何參數。

export const useStore = defineStore('main', {
getters: {
getUserById: (state) => {
return (userId) => state.users.find((user) => user.id === userId)
},
},
})

在組件使用:

<div>用戶:{{getUserById(1)}}</div>

const numerStore = useNumerStore()
const {getUserById} = numerStore

注意,當這樣做時,getter不再被緩存,它們只是您調用的函數。不過,您可以在getter本身中緩存一些結果,這并不常見,但應該會證明更高效.

export const useStore = defineStore('main', {
getters: {
getActiveUserById(state) {
const activeUsers = state.users.filter((user) => user.active)
return (userId) => activeUsers.find((user) => user.id === userId)
},
},
})

獲取其它store的getters,要使用另一個store getter,你可以直接在getter中使用它,其實和在vue文件中使用差別不大。

import { useOtherStore } from './other-store'

export const useStore = defineStore('main', {
state: () => ({
// ...
}),
getters: {
otherGetter(state) {
const otherStore = useOtherStore()
return state.localData + otherStore.data
},
},
})

5Actions

actions等價于組件中的方法,它們可以在defineStore()中進行定義actions屬性,并且可以完美地去定義業務邏輯。

export const useStore = defineStore('main', {
state: () => ({
counter: 0,
}),
actions: {
increment() {
this.counter++
},
randomizeCounter() {
this.counter = Math.round(100 * Math.random())
},
},
})

在上面的代碼中,我們可以看到actions有點類似getters,但事實上是有所不同的。

  • 相同點:actions和getters都可以全類型支持來訪問整個store實例。
  • 不同點:actions操作可以是異步的,可以在其中等待任何api調用甚至其他操作。

注意,只要你得到了一個Promise,你使用的庫并不重要,你甚至可以使用本地的fetch函數(僅適用于瀏覽器):

import { mande } from 'mande'

const api = mande('/api/users')

export const useUsers = defineStore('users', {
state: () => ({
userData: null,
// ...
}),

actions: {
async registerUser(login, password) {
try {
this.userData = await api.post({ login, password })
showTooltip(`Welcome back ${this.userData.name}!`)
} catch (error) {
showTooltip(error)
// let the form component display the error
return error
}
},
},
})

同樣的,action也可以像state和getters進行相互使用,action可以通過this直接訪問。

// src/store/user.ts
export const useUserStore = defineStore({
"user",
state: () => ({
userData: null
}),
actions:{
async login(account, pwd) {
const { data } = await api.login(account, pwd)
this.setData(data) // 調用另一個 action 的方法
return data
},
setData(data) {
this.userData = data
}
}
})

也可以在action 里調用其他 store 里的 action,引入對應的 store 后即可訪問其內部的方法了。

// src/store/user.ts

import { useAppStore } from './app'
export const useUserStore = defineStore({
id: 'user',
actions: {
async login(account, pwd) {
const { data } = await api.login(account, pwd)
const appStore = useAppStore()
appStore.setData(data) // 調用 app store 里的 action 方法
return data
}
}
})
// src/store/app.ts
export const useAppStore = defineStore({
"app",
state:()=>{
userData: null
},
actions: {
setData(data) {
this.userData = data
}
}
})

6 參考文章

《Pinia官方文檔》

《新一代狀態管理工具,Pinia.js 上手指南》

7 寫在最后

本篇文章是在閱讀文檔和相關文章進行學習總結得來,是在公司進行應用生產前的實驗,對于能力強的大佬應該是小意思,從vuex過渡可以直接上手。Pinia是很好的狀態管理,簡潔輕量易上手。在進行總結文章的時候,也做了一些代碼實踐,但是不免會出現一些紕漏。

責任編輯:姜華 來源: 前端萬有引力
相關推薦

2020-05-25 19:44:58

LubuntuLubuntu 20.

2021-06-08 11:15:10

Redis數據庫命令

2018-04-17 11:47:06

if代碼參數

2025-06-10 08:10:00

VLANIP網絡

2023-06-27 08:41:35

DapperSQL語句

2021-07-16 22:49:50

PiniaVuex替代品

2020-10-16 09:40:18

順序Spring AOPHTTP

2021-01-08 09:44:23

Faceboo隱私數據安全

2024-01-08 08:23:08

OpenCV機器學習計算機視覺

2022-04-15 14:31:02

鴻蒙操作系統

2020-08-25 18:52:22

人工智能機器人技術

2023-11-23 10:21:37

2018-03-28 14:37:43

商務辦公

2024-04-19 13:17:40

PostgreSQLSQL數據庫

2022-02-08 11:45:03

PiniaVuex前端

2012-03-01 11:20:45

2023-02-27 09:03:23

JavaCAS

2022-12-08 09:26:07

PiniaVuex

2021-03-11 15:13:26

Python開發編輯器

2021-08-26 05:27:57

Swift 監聽系統泛型
點贊
收藏

51CTO技術棧公眾號

男人av资源站| 一区二区激情视频| 欧美自拍丝袜亚洲| 亚洲综合小说区| 日本免费www| 国产在线88av| 天天影视综合| 久久精品免视看| 久久久这里只有精品视频| 亚洲xxxx2d动漫1| 色欲久久久天天天综合网 | 成人黄色av播放免费| 丰满岳乱妇一区二区| 国产高清视频免费最新在线| 国产综合色产| 欧美人xxxx| 任我爽在线视频精品一| 日产精品久久久久| 天堂va在线高清一区| 国产精品灌醉下药二区| 日本成人精品在线| 少妇户外露出[11p]| 污污网站在线观看| 九九在线精品视频| 一区二区在线视频| 无码人妻丰满熟妇区毛片18| 天天射天天操天天干| 九九**精品视频免费播放| 97超级碰碰碰| 噜噜噜在线视频| 国产在线美女| 亚洲九九爱视频| 亚洲一区二区三区香蕉| 午夜精品免费观看| 国产成人一区| 日本黄色一区二区| 色综合影院在线观看| 中文字幕+乱码+中文乱码www| 亚洲另类av| 在线免费观看成人短视频| 草草视频在线免费观看| 欧美一级在线免费观看| 国产视频亚洲| 亚洲视频视频在线| 精品综合久久久久| 欧美另类tv| 97aⅴ精品视频一二三区| 性欧美视频videos6一9| 日韩无码精品一区二区| 亚洲男人av| 欧美国产精品一区| 92看片淫黄大片看国产片| 日本成人一级片| 欧美日韩国产高清| 亚洲免费电影一区| 中文 日韩 欧美| 国产盗摄精品一区二区酒店| 久久久影视传媒| 91久久久久久久久| 久久精品无码人妻| 国产精品手机在线播放| 精品亚洲男同gayvideo网站| 视频免费1区二区三区| 成人av色网站| 亚洲制服丝袜av| 国产女主播自拍| 538在线观看| 国产精品毛片久久久久久久| 成人av资源网| 欧美成人精品网站| 蜜桃视频一区二区| 911国产网站尤物在线观看| 1级黄色大片儿| 97精品国产一区二区三区| 亚洲成人黄色在线观看| 天天爱天天操天天干| 国内在线免费视频| 婷婷综合在线观看| 在线观看一区二区三区三州 | 国产羞羞视频在线播放| 午夜在线电影亚洲一区| 亚洲一区三区| 人操人视频在线观看| 精品一区二区三区不卡| 91大片在线观看| 一区二区视频免费观看| 精品一区二区免费在线观看| www.成人av.com| 日韩av地址| 亚洲色图欧洲色图| 欧美一区二区三区四区在线观看地址 | 欧美日本韩国一区| 精品伦一区二区三区| 亚洲精品国产嫩草在线观看| 亚洲一区二区在线免费观看视频| 亚洲成人第一| 黄色片免费在线| 成人av在线网| 亚洲在线视频观看| 午夜影院免费体验区| 丁香婷婷综合色啪| 97超碰人人看人人| 欧美黄色小说| 久久伊人蜜桃av一区二区| 国产精品视频500部| 真实的国产乱xxxx在线91| 国产一区二区女| 国产精品最新在线观看| 无码人妻一区二区三区线| 精品一区二区三区视频在线观看 | 欧美三级伦理在线| 日韩精品高清视频| 精品人妻在线视频| 欧美日韩中文一区二区| 欧美精品video| 永久免费看黄网站| 日韩成人精品一区| 中文字幕在线观看亚洲| 日韩精品无码一区二区三区久久久| 免费福利视频一区| 日韩精品久久久久| 国产稀缺精品盗摄盗拍| **女人18毛片一区二区| 日韩综合中文字幕| xxxxx99| 天堂网在线观看国产精品| 68精品久久久久久欧美| av在线资源观看| 国产精品羞羞答答xxdd| 99一区二区| 欧美日韩欧美| 亚洲欧美另类在线| 一区二区在线播放视频| 日韩成人一级| 一区二区三区 在线观看视| www.youjizz.com亚洲| 国产真实乱对白精彩久久| 日韩中文字幕一区二区| 蜜桃视频在线观看免费视频网站www| 欧美日韩日本国产| 一区二区三区视频在线观看免费| 日韩三级视频| 97久久国产精品| 免费看黄色一级视频| 亚洲一区免费视频| 国产精品成人无码专区| 极品日韩av| 激情综合一区二区三区| 亚洲国产精品suv| 五月精品视频| 国产精品美女午夜av| 夜夜爽妓女8888视频免费观看| 三级在线观看一区二区| 国产精品丝袜一区二区三区| 日本福利片高清在线观看| 黄网站色欧美视频| 日韩精品视频一区二区| 日韩香蕉视频| 国产欧美久久一区二区| 在线免费观看黄色网址| 亚洲一级二级在线| 人妻互换一二三区激情视频| 韩日成人在线| 国产在线一区二区三区欧美| 2017亚洲天堂1024| 欧美性视频一区二区三区| 波多野吉衣在线视频| 红杏成人性视频免费看| 亚洲三级av在线| 无码人妻久久一区二区三区| 国产午夜精品一区二区三区嫩草| www.亚洲天堂网| 成人一区而且| 91禁外国网站| 麻豆影视在线| 欧美日韩一区二区三区在线看| 怡红院一区二区| 亚洲综合日本| 超碰97在线人人| 爱啪视频在线观看视频免费| 亚洲精品天天看| 成人黄色片在线观看| 最新国产成人在线观看| 无码内射中文字幕岛国片| 6080成人| 久久久精品久久久| 岛国av中文字幕| 成人视屏免费看| 欧美色图另类小说| 澳门成人av| 欧美精品性视频| 性高潮视频在线观看| 亚洲手机成人高清视频| 最新日本中文字幕| 日韩av电影天堂| 欧美日韩视频在线一区二区观看视频| 性欧美videoshd高清| 亚洲国产小视频| 久久久久成人网站| 国产精品综合二区| 色综合久久久久无码专区| 亚洲精品视频一二三区| 91精品国产色综合久久不卡98| av资源种子在线观看| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩欧美国产综合在线一区二区三区| 99久久精品免费视频| 精品亚洲欧美一区| 日本精品免费在线观看| 亚洲女同一区| 成人女保姆的销魂服务| 蜜桃视频动漫在线播放| 亚洲国产精品嫩草影院久久| 中文字幕一区二区三区四区免费看 | 欧美性大战久久久久久久 | 日韩欧美成人免费视频| 秘密基地免费观看完整版中文| 日日夜夜一区二区| 日本在线观看一区二区三区| 日韩精品一级| 国产精品一区二区三| 中文字幕成在线观看| 欧美韩国理论所午夜片917电影| 性做久久久久久久| 欧美影院一区二区| 国产又大又黄又粗| 国产日本欧美一区二区| 日日噜噜噜噜久久久精品毛片| 在线观看一区| 国产人妻人伦精品| 久久国产精品色av免费看| 91久久久久久久久| 日韩伦理一区二区| 久久综合电影一区| 欧洲av在线播放| 日韩亚洲欧美成人一区| 国产精品99精品| 亚洲日本欧美天堂| 91狠狠综合久久久| 中文字幕一区二区5566日韩| 91导航在线观看| 欧美激情中文字幕一区二区| 法国伦理少妇愉情| 国产在线一区二区| 天天综合天天添夜夜添狠狠添| 美女视频黄久久| 女同激情久久av久久| 一区在线免费观看| 无码日本精品xxxxxxxxx| 日韩欧美国产大片| 久草一区二区| 日韩免费在线电影| 国产日本欧美一区二区三区在线| 成人影欧美片| 亚洲国产中文字幕在线观看| 亚洲精品无amm毛片| 欧美大胆一级视频| 黄色成人一级片| 欧美日韩精品福利| 91成人一区二区三区| 亚洲一二三区在线观看| 久久网中文字幕| 亚洲成人自拍网| 亚洲女人久久久| 日韩毛片在线免费观看| 青青草手机视频在线观看| 国产亚洲综合在线| 国产黄色大片免费看| 国产丶欧美丶日本不卡视频| 国产成人无码一二三区视频| 久久亚洲风情| 色免费在线视频| 模特精品在线| 800av在线免费观看| 亚洲精品123区| 中国一级黄色录像| 精品在线99| 加勒比在线一区二区三区观看| 狠狠久久综合| 97精品视频在线播放| 日韩理论视频| 国产精品综合网站| 超碰cao国产精品一区二区| 久久人人97超碰人人澡爱香蕉| 国产一区二区三区四区二区| 一级黄色免费在线观看| 精品国产乱码久久久| 在线综合视频网站| 亚洲国产99| 在线免费av播放| 成人av资源站| 91导航在线观看| 精品日本高清在线播放| 中文字幕在线视频第一页| 欧美成人r级一区二区三区| 一区不卡在线观看| 亚洲高清久久久久久| av女优在线| 孩xxxx性bbbb欧美| 欧美日韩视频免费看| 国产一区自拍视频| 天天揉久久久久亚洲精品| 成熟丰满熟妇高潮xxxxx视频| 免费国产亚洲视频| 水蜜桃av无码| 亚洲精品亚洲人成人网| 中文字幕xxxx| 精品国产乱码久久久久久久久| 国产按摩一区二区三区| 国产丝袜一区视频在线观看| 国产丝袜在线| 欧美成人一区二区三区电影| 亚洲一级少妇| 成人欧美一区二区三区视频| www国产精品| 在线观看亚洲视频啊啊啊啊| 免费欧美日韩| xfplay5566色资源网站| 亚洲色图欧美偷拍| 中文字幕久久熟女蜜桃| 日韩精品在线影院| heyzo高清中文字幕在线| 成人国内精品久久久久一区| 久久最新网址| 91av资源网| 成人av动漫在线| 美女福利视频在线观看| 欧美日本免费一区二区三区| 国产毛片av在线| 热99在线视频| 日韩超碰人人爽人人做人人添| 欧美这里只有精品| 国内一区二区视频| 国产小视频你懂的| 亚洲国产日韩在线一区模特| 一区二区日韩在线观看| 在线播放国产一区中文字幕剧情欧美 | 国产永久免费视频| 视频在线观看一区二区| 看女生喷水的网站在线观看| 国产精品1234| 激情综合五月| 国产综合动作在线观看| 欧美激情综合| xxxx视频在线观看| 亚洲综合免费观看高清完整版在线| 国产免费黄色大片| 亚洲精品国产精品自产a区红杏吧| 色黄网站在线观看| 99精品欧美一区二区三区| 一个色综合网| 18深夜在线观看免费视频| 久久色.com| av毛片在线免费观看| 国产一区二区三区免费视频| 羞羞电影在线观看www| 97在线资源站| 亚洲国产日本| 在线免费观看成年人视频| 日韩欧美中文在线| eeuss影院在线观看| 国产欧美日韩专区发布| 亚洲成av人电影| 日本少妇一级片| 图片区日韩欧美亚洲| 午夜成人鲁丝片午夜精品| 欧美在线观看网址综合| 日韩视频1区| 成人av在线播放观看| 日韩av电影免费观看高清完整版| 九九热免费在线| 91精品国模一区二区三区| 免费在线稳定资源站| 国产精品黄视频| 欧美韩一区二区| 妞干网在线免费视频| 国产精品一区二区三区四区| 久久久久久天堂| 国产丝袜视频一区| 涩涩涩久久久成人精品| 日本男女交配视频| 久久久亚洲精品石原莉奈| 亚洲综合网av| 国产一区二区三区欧美| 国产精品一区二区三区av | 国产在线网站| 91久热免费在线视频| 99热这里只有成人精品国产| 中文字幕av久久爽一区| 欧美一级一区二区| 日韩精品成人av| 日本午夜精品理论片a级appf发布| 99re6热只有精品免费观看| 国产超级av在线| 中文字幕一区二区视频| 人妻一区二区三区免费| 国产区亚洲区欧美区| 国产精品美女| www.色小姐com| 国产亚洲福利一区|