Vue3+Pinia+數(shù)據(jù)持久化 20分鐘快速上手

Vue3+Pinia 20分鐘快速上手

自我記錄
1.Pinia 是一個(gè)狀態(tài)管理工具牙瓢,它和 Vuex 一樣為 Vue 應(yīng)用程序提供共享狀態(tài)管理能力。
2.語(yǔ)法和 Vue3 一樣,它實(shí)現(xiàn)狀態(tài)管理有兩種語(yǔ)法:選項(xiàng)式API 與 組合式API勺疼,我們學(xué)習(xí)組合式API語(yǔ)法教寂。
3.它也支持 Vue2 也支持 devtools,當(dāng)然它也是類型安全的执庐,支持 TypeScript
4.可以創(chuàng)建多個(gè)全局倉(cāng)庫(kù)酪耕,不用像 Vuex 一個(gè)倉(cāng)庫(kù)嵌套模塊,結(jié)構(gòu)復(fù)雜轨淌。
5.管理數(shù)據(jù)簡(jiǎn)單迂烁,提供數(shù)據(jù)和修改數(shù)據(jù)的邏輯即可,不像Vuex需要記憶太多的API递鹉。
6.Pinia 是一個(gè)簡(jiǎn)單實(shí)用的狀態(tài)管理工具,大小僅有1KB
7.Pinia 官方文檔

image.png

使用步驟
1.安裝

yarn add pinia
# 或者使用 npm
npm install pinia

2.導(dǎo)入盟步,實(shí)例化,當(dāng)做插件使用躏结,和其他插件使用套路相同 /src/main.ts

import { createApp } from 'vue'
// 1. 導(dǎo)入創(chuàng)建pinia的函數(shù)
import { createPinia } from 'pinia'
import App from './App.vue'
// 2. 創(chuàng)建pinia插件實(shí)例
const pinia = createPinia()
const app = createApp(App)
// 3. 使用插件
app.use(pinia)
app.mount('#app')

3.創(chuàng)建倉(cāng)庫(kù)&使用倉(cāng)庫(kù) /src/stores/counter.ts

import { defineStore } from "pinia"
// 創(chuàng)建倉(cāng)庫(kù)
// 1.id 是倉(cāng)庫(kù)的唯一標(biāo)識(shí)却盘,一般文件的名字叫啥就是啥, 方便找對(duì)應(yīng)的倉(cāng)庫(kù) 例如 counter.ts
// 2.storeSteup 類似 Vue3 的 setup 作用:函數(shù)中定義 數(shù)據(jù) 和 函數(shù) 返回, 它們就是store的數(shù)據(jù)和函數(shù)
// 3.options? 額外的配置
// export const uesCounterStore = defineStore("counter", () => {
//  return {}
// })
export const uesCounterStore = defineStore('counter', () => {
    // 定義
    // state
    const count = ref(0)
    // getters
    const doubleCount = computed(() => count.value * 2)
    // mutations (Pinia 不區(qū)分 mutations 和 actions)
    const update = () => count.value++
    // actions
    const asyncUpdate = () => {
        setTimeout(() => {
            count.value += 1000
        }, 1000)
    }
    return {count, doubleCount, update ,asyncUpdate}
})

/src/components/Children.vue

<script setup lang="ts">
// 使用倉(cāng)庫(kù)
import { useCounterStore } from "./stores/counter"
// store中有狀態(tài)和函數(shù)
const store = useCounterStore()
</script>
<template>
  <div class="Children-page">Children-page {{store.count}}--{{store.doubleCount}}</div>
</template>

/src/components/Children.vue

<script setup lang="ts">
// 使用倉(cāng)庫(kù)
import { useCounterStore } from "./stores/counter"
// store中有狀態(tài)和函數(shù)
const store = useCounterStore()
</script>
<template>
  <div class="Children-page">Children-page {{store.count}}--{{store.doubleCount}}</div>
</template>

注意store獲取到后不能解構(gòu),否則失去響應(yīng)式 可以使用storeToRefs來(lái)解決 storeToRefs的使用
1.使用 storeToRefs 解決解構(gòu)倉(cāng)庫(kù)狀態(tài)丟失響應(yīng)式的問(wèn)題
問(wèn)題:當(dāng)我們想解構(gòu) store 提供的數(shù)據(jù)時(shí)候窜觉,發(fā)現(xiàn)數(shù)據(jù)是沒(méi)有響應(yīng)式的谷炸。
vue 組合式API創(chuàng)建的響應(yīng)式數(shù)據(jù)的時(shí)候,使用 toRefs 保持結(jié)構(gòu)后數(shù)據(jù)的響應(yīng)式
/src/App.vue 使用storeToRefs

<script setup lang="ts">
// 使用倉(cāng)庫(kù)
import { uesCounterStore } from "./stores/counter.ts";
import Children from "./components/Children.vue";
import { storeToRefs } from "pinia"; // 引入storeToRefs
const store = uesCounterStore()
const { count, doubleCount } = storeToRefs(store) // 使用
</script>
</script>
<template>
    // 可以省略store.count=>count
  <div class="App-page">{{ count }}--{{ doubleCount }}
    <button @click="store.update()">改count</button>
    <button @click="store.asyncUpdate()">異步改</button>
  </div>
  <Children></Children>
</template>
pinia Vuex
refreactive創(chuàng)建的響應(yīng)式數(shù)據(jù) state
computed 創(chuàng)建的計(jì)算屬性 getters
普通函數(shù)禀挫,同步異步均可 mutations 和 actions

數(shù)據(jù)持久化

使用 pinia-plugin-persistedstate 實(shí)現(xiàn)pinia倉(cāng)庫(kù)狀態(tài)持久化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旬陡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子语婴,更是在濱河造成了極大的恐慌描孟,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砰左,死亡現(xiàn)場(chǎng)離奇詭異匿醒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缠导,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門廉羔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人僻造,你說(shuō)我怎么就攤上這事憋他。” “怎么了髓削?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵竹挡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我立膛,道長(zhǎng)揪罕,這世上最難降的妖魔是什么梯码? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮好啰,結(jié)果婚禮上轩娶,老公的妹妹穿的比我還像新娘。我一直安慰自己框往,他們只是感情好罢坝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搅窿,像睡著了一般嘁酿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上男应,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天闹司,我揣著相機(jī)與錄音,去河邊找鬼沐飘。 笑死游桩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耐朴。 我是一名探鬼主播借卧,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筛峭!你這毒婦竟也來(lái)了铐刘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤影晓,失蹤者是張志新(化名)和其女友劉穎镰吵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挂签,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疤祭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饵婆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勺馆。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侨核,靈堂內(nèi)的尸體忽然破棺而出草穆,到底是詐尸還是另有隱情,我是刑警寧澤芹关,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布续挟,位于F島的核電站紧卒,受9級(jí)特大地震影響侥衬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一轴总、第九天 我趴在偏房一處隱蔽的房頂上張望直颅。 院中可真熱鬧,春花似錦怀樟、人聲如沸功偿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)械荷。三九已至,卻和暖如春虑灰,著一層夾襖步出監(jiān)牢的瞬間吨瞎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工穆咐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颤诀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓对湃,卻偏偏與公主長(zhǎng)得像崖叫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拍柒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容