欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue新一代狀態(tài)管理工具Pinia的具體使用

 更新時間:2022年07月14日 15:43:40   作者:吳同學(xué)丫  
本文主要介紹了Vue新一代狀態(tài)管理工具Pinia的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

Pinia是尤雨溪強烈推薦的一款Vue狀態(tài)管理工具,也被認(rèn)為是下一代Vuex的替代產(chǎn)品。

優(yōu)點

  • 去除了mutations,只有 state,getters和actions,其中actions支持了同步和異步操作
  • 不會像Vuex那樣有模塊嵌套,Pinia只有store的概念,store之間可以相互使用,互不影響,達(dá)到模塊扁平化的效果
  • 更好地支持ts
  • 更好地支持Vue2/Vue3
  • 邏輯更加清晰,開發(fā)起來更加簡單

安裝

npm i pinia

創(chuàng)建并掛載

1.在src目錄下新建store目錄并在其下面創(chuàng)建index.js文件,代碼如下:

import { createPinia } from 'pinia'
const store = createPinia()
export default store

2.在main.js中引入store并掛載,代碼如下:

import { createApp } from 'vue'
import App from './App.vue'
import store from './store/index'

createApp(App)
.use(store)
.mount('#app')

創(chuàng)建store

在src/store文件夾下創(chuàng)建一個js文件,命名按照需求即可,我這邊定義為main.js,代碼如下:

import { defineStore } from 'pinia'
export const mainStore = defineStore('main', {
    state: () => {
        return {
            msg: 'hello',
            count: 1
        }
    },
    actions: {},
    getters: {}
})

其中defineStore的第一個參數(shù)為該store的名稱,第二個參數(shù)為一個對象,包含了該store的state,getters和actions,state改為了函數(shù)形式,目的應(yīng)該是像Vue2 options API中的data類似,避免多個store中定義的屬性相互受到影響。

使用store

此處使用Vue3的SFC語法,主要是Pinia更適合Vue3這種組合式API風(fēng)格,方便演示

回顯與修改state

<script lang="ts" setup>
    import { mainStore } from '../store/main'
    import { storeToRefs } from 'pinia'

    const store = mainStore()
    const { count } = storeToRefs(store)
    
    // 單條數(shù)據(jù)直接修改
    const handleAddCount = () => {
        store.count++
    }
</script>

<template>
    <div>
        <p>{{ store.msg }}</p>
        <p>{{ count }}</p>
        <button @click="handleAddCount">+</button>
    </div>
</template>
  • 使用方法與Vuex基本類似,要使用哪個store,就直接進(jìn)行引入,非常方便,沒那么多層級引用
  • 其中,我們使用了Pinia中的storeToRefs方法,此方法能夠直接解構(gòu)出該store的state中的某個值,并且是響應(yīng)式的;如果我們直接從state上解構(gòu),那么解構(gòu)出的值就不是響應(yīng)式的了。
  • 如果我們要修改state中的值,不能直接去修改解構(gòu)出的值,得去修改state上對應(yīng)的屬性

使用$patch對多條數(shù)據(jù)直接修改

使用$patch的方式對數(shù)據(jù)進(jìn)行修改,可以加快修改速度,性能更好。$patch 方法可以接受兩種類型的參數(shù),對象型和回調(diào)函數(shù)型。

$patch + 對象

$patch + 函數(shù)  注:使用回調(diào)函數(shù)型時,回調(diào)接收一個state參數(shù),state指代的就是對應(yīng)store中的state

使用方式如下:

<script lang="ts" setup>
    import { mainStore } from '../store/main'
    import { storeToRefs } from 'pinia'

    const store = mainStore()
    const { count } = storeToRefs(store)
    
    // 使用$patch + 對象
    const updateWithObj = () => {
        store.$patch({
            msg: store.msg === 'hello' ? 'hello world' : 'hello',
            count: store.count + 2
        })
    }
    // 使用$patch + 回調(diào)
    const updateWithFun = () => {
        store.$patch((state) => {
            state.msg = state.msg === 'hello' ? 'hello world' : 'hello'
            state.count = state.count + 3
        })
    }
</script>

<template>
    <div>
        <p>{{ store.msg }}</p>
        <p>{{ count }}</p>
        <button @click="updateWithObj">$patch+對象</button>
        <button @click="updateWithFun">$patch+回調(diào)</button>
    </div>
</template>

使用actions

1.在src/store/main.js的actions對象中,添加一個方法,代碼如下:

import { defineStore } from 'pinia'
export const mainStore = defineStore('main', {
    state: () => {
        return {
            msg: 'hello',
            count: 1
        }
    },
    actions: {
        changeState() {
            this.count++
            this.msg = this.msg === 'hello' ? 'hello world' : 'hello'
        }
    },
    getters: {}
})

2.使用方式為:store.方法名,代碼如下:

<script lang="ts" setup>
    import { mainStore } from '../store/main'
    import { storeToRefs } from 'pinia'

    const store = mainStore()
    const { count } = storeToRefs(store)
    
   // 使用action修改數(shù)據(jù)
    const onActionClick = () => {
        store.changeState()
    }
</script>

<template>
    <div>
        <p>{{ store.msg }}</p>
        <p>{{ count }}</p>
        <button @click="onActionClick">使用action</button>
    </div>
</template>

使用getters

Pinia中的getter和Vue中的計算屬性類似,在獲取state之前會進(jìn)行處理,具有緩存性,如果值沒有改變,即使多次調(diào)用,實際上也只會調(diào)用一次。

1.在src/store/main.js的getters對象中進(jìn)行添加,代碼如下:

import { defineStore } from 'pinia'
export const mainStore = defineStore('main', {
    state: () => {
        return {
            msg: 'hello',
            count: 1
        }
    },
    getters: {
        getState(state) {
            console.log('getState被調(diào)用了');
            
            // getter 中不僅可以傳遞state直接改變數(shù)據(jù),也可以使用this來改變數(shù)據(jù)
            return `${state.msg} + ${this.count}`
        }
    }
})

2.使用方式如下:

<script lang="ts" setup>
    import { mainStore } from '../store/main'
    const store = mainStore()
</script>

<template>
    <div>
        <p>使用getter獲取數(shù)據(jù):{{ store.getState }}</p>
        <p>使用getter獲取數(shù)據(jù):{{ store.getState }}</p>
        <p>使用getter獲取數(shù)據(jù):{{ store.getState }}</p>
    </div>
</template>

我們可以看到,即使執(zhí)行了三遍一樣的代碼,但最終還是只調(diào)用了一次。

多個store相互調(diào)用

在Pinia中,可以在一個store中import引入另外一個store,然后通過調(diào)用引入的store方法的形式,獲取引入的store的狀態(tài)。

1.在src/store目錄下,新建一個文件.js,代碼如下:

import { defineStore } from 'pinia'

export const userStore = defineStore('user', {
    state: () => {
        return {
            name: '吳同學(xué)'
        }
    }
})

2.在需要用到的store中進(jìn)行引入,并通過getters的方式獲取,代碼如下:

import { defineStore } from 'pinia'
import { userStore } from './user'

export const mainStore = defineStore('main', {
    getters: {
        getUserState() {
            return userStore().name
        }
    }
})

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

Pinia與Vuex一樣,刷新頁面后,數(shù)據(jù)就會重置,有時候我們需要將數(shù)據(jù)進(jìn)行持久化存儲,我們可以使用pinia-plugin-persist這個插件

安裝

npm i pinia-plugin-persist --save

使用

1.在src/store/index.js文件夾下,引入并使用,代碼如下:

import { createPinia } from 'pinia'
import piniaPluginPersist from 'pinia-plugin-persist'

const store = createPinia()
store.use(piniaPluginPersist)

export default store

2.在對應(yīng)的store里開啟持久化存儲

import { defineStore } from 'pinia'
import { userStore } from './user'

export const mainStore = defineStore('main', {
    state: () => {
        return {
            msg: 'hello',
            count: 1
        }
    },
    
    // 開啟數(shù)據(jù)緩存
    persist: {
        enabled: true
    }
})

更新數(shù)據(jù)以后,我們就能在瀏覽器控制臺中看到已經(jīng)將數(shù)據(jù)存儲到了sessionStorage中

數(shù)據(jù)默認(rèn)是存在sessionStorage中的,還會以store的名稱作為key。但是我們可以對其修改,并且還可以只持久化部分state中的屬性,代碼如下:

import { defineStore } from 'pinia'
import { userStore } from './user'

export const mainStore = defineStore('main', {
    state: () => {
        return {
            msg: 'hello',
            count: 1
        }
    },
    
    // 開啟數(shù)據(jù)緩存
    persist: {
        enabled: true,
        strategies: [
            {
              key: 'mainStore', // 修改存在緩存中的key值
              storage: localStorage,    // 修改存儲方式為localStorage
              paths:['msg']  // 只持久化msg,此時刷新頁面msg數(shù)據(jù)會被保留,其他state將會重置
            }
        ]
    }
})

總結(jié)

Pinia就是Vuex的替代產(chǎn)品,相比于Vuex,Pinia更好地兼容了Vue本身,代碼更加簡潔,開發(fā)起來也更加便捷。以上就是關(guān)于Pinia的介紹,如果覺得對你有幫助,就請點個贊,謝謝大家!

到此這篇關(guān)于Vue新一代狀態(tài)管理工具Pinia的具體使用的文章就介紹到這了,更多相關(guān)Vue狀態(tài)管理工具Pinia內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3(vite)設(shè)置代理封裝axios api解耦功能

    vue3(vite)設(shè)置代理封裝axios api解耦功能

    這篇文章主要介紹了vue3(vite)設(shè)置代理封裝axios api解耦,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Vue項目組件化工程開發(fā)實踐方案

    Vue項目組件化工程開發(fā)實踐方案

    這篇文章主要介紹了Vue項目組件化工程開發(fā)實踐方案,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • vue3引入highlight.js進(jìn)行代碼高亮的方法實例

    vue3引入highlight.js進(jìn)行代碼高亮的方法實例

    最近忙著開發(fā)自己的開發(fā)腳手架,在做代碼生成器的時候,有個預(yù)覽功能,需要讓代碼高亮,下面這篇文章主要給大家介紹了關(guān)于vue3引入highlight.js進(jìn)行代碼高亮的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 詳解Vue中的render:?h?=>?h(App)示例代碼

    詳解Vue中的render:?h?=>?h(App)示例代碼

    這篇文章主要介紹了Vue中的render:?h?=>?h(App),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Vue 滾動行為的具體使用方法

    Vue 滾動行為的具體使用方法

    本篇文章主要介紹了Vue 滾動行為的具體使用方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 基于vue2框架的機器人自動回復(fù)mini-project實例代碼

    基于vue2框架的機器人自動回復(fù)mini-project實例代碼

    本篇文章主要介紹了基于vue2框架的機器人自動回復(fù)mini-project實例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-06-06
  • Vue解析帶html標(biāo)簽的字符串為dom的實例

    Vue解析帶html標(biāo)簽的字符串為dom的實例

    今天小編就為大家分享一篇Vue解析帶html標(biāo)簽的字符串為dom的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue使用axios post方式將表單中的數(shù)據(jù)以json格式提交給后端接收操作實例

    Vue使用axios post方式將表單中的數(shù)據(jù)以json格式提交給后端接收操作實例

    這篇文章主要介紹了Vue使用axios post方式將表單中的數(shù)據(jù)以json格式提交給后端接收操作,結(jié)合實例形式分析了vue基于axios庫post傳送表單json格式數(shù)據(jù)相關(guān)操作實現(xiàn)技巧與注意事項,需要的朋友可以參考下
    2023-06-06
  • Vue使用NProgress的操作過程解析

    Vue使用NProgress的操作過程解析

    這篇文章主要介紹了Vue使用NProgress的操作過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • typescript+vite項目配置別名的方法實現(xiàn)

    typescript+vite項目配置別名的方法實現(xiàn)

    我們?yōu)榱耸÷匀唛L的路徑,經(jīng)常喜歡配置路徑別名,本文主要介紹了typescript+vite項目配置別名的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論