目錄
Pinia與Vuex的差異
使用Pinia
直接修改資料的兩種方式
使用actions修改資料
重設state中資料
Pinia持久化儲存
Pinia模組化實作
Pinia中store之間互相呼叫
首頁 web前端 Vue.js 淺析Vue專案中怎麼用Pinia狀態管理工具

淺析Vue專案中怎麼用Pinia狀態管理工具

Nov 07, 2022 pm 08:09 PM
vue pinia

Vue專案中怎麼用Pinia狀態管理工具?以下這篇文章帶大家聊聊Vue專案中Pinia狀態管理工具的使用,希望對大家有幫助!

淺析Vue專案中怎麼用Pinia狀態管理工具

Pinia官網介紹說:Pinia 是 Vue 的儲存庫,它允許您跨元件/頁面共享狀態。 Vuex同樣可以作為狀態管理工具,那麼兩者有什麼差別呢?
淺析Vue專案中怎麼用Pinia狀態管理工具

Pinia與Vuex的差異

  • pinia只有store、getter、actions,麼有mutations,簡化了狀態管理的操作。 【相關推薦:vuejs影片教學web前端開發
  • pinia模組分割不需要modules,
  • pinia自動化程式碼分割
  • pinia對ts支援很好以及vue3的composition API
  • pinia體積更小,性能更好

使用Pinia

defineStore( ) 方法的第一個參數:容器的名字,名字必須唯一,不能重複
defineStore( ) 方法的第二個參數:配置對象,放置state, getters,actions
state 屬性: 用來儲存全域的狀態
getters屬性: 用來監視或是計算狀態的變化的,有快取的功能
actions屬性: 修改state全域狀態數據,可以是異步也可以是同步
Pinia可以用於vue2.x也可以用於vue3.x中

  • 安裝
yarn add pinia -S
登入後複製
  • main.js引入
import {createApp} from "vue"
import App from "./app.vue"
import store from "./store/index.js"
const app = createApp(App);
const store = createPinia();
app.use(store).mount("#app")
登入後複製
  • 在store文件夾下新建test.js
import {definePinia} from "pinia"
export default testStore = definePinia('testId',{
    state:()=>{
         tname:"test",
         tnum:0,
    },
    getters:{
       changeTnum(){
           console.log("getters")
           this.tnum++;
       }
    },
    actions:{
       addNum(val){
          this.tnum += val
       }
    },
    //持久化存储配置
    presist:{
         enable:true,//
         strategies:[
            {
            key:"testId",
            storage:localStorage,
            paths:['tnum']
            } 
         ]
    }
})
登入後複製
登入後複製

在用actions的時候,不能使用箭頭函數,因為箭頭函數綁定是外部的this。 actions裡的this指向目前store

  • 在store資料夾下新建index.js,以便於管理
import {createPinia} from "pinia"
const store = createPinia();
export default store
登入後複製
  • 新建A.vue元件,引入store模組和storeToRefs方法
    storeToRefs:解構store中的數據,使之成為響應式數據
<template>
    <div>
        <div> {{tname}}</div>
        <div> {{tid}}</div>
        <div> tnum: {{tnum}}</div>
        <div> {{tchangeNum}}</div>
        <div><button @click="tchangeName">修改</button></div>
        <div> <button @click="treset">重置</button></div>
        <div @click="actionsBtn">actionsBtn</div>
    </div>
</template>
登入後複製
<script setup>
import { storeToRefs } from &#39;pinia&#39;
import { useStore } from &#39;../store/user&#39;
import { useTest } from &#39;../store/test.js&#39;
const testStore = useTest();
let { tname, tchangeNum, tnum } = storeToRefs(testStore)
</script>
登入後複製

直接修改資料的兩種方式

直接修改資料與使用$path修改資料相比,官方已經明確表示$patch 的方式是經過最佳化的,會加快修改速度,對程式的效能有很大的好處。所以如果你是多條數據同時更新狀態數據,建議使用$patch方式更新。
雖然可以直接修改,但是出於程式碼結構來說, 全域的狀態管理還是不要直接在各個元件隨意修改狀態,應放於actions中統一方法修改(piain沒有mutation) 。

//直接修改数据
tchangeName(){
     tname.value = "测试数据";
     tnum.value++;
}
//当然也可以使用`$path`批量修改
tchangeName(){
     testStore.$path(state=>{
          state.tname = "测试数据";
          state.value = 7;
     })
}
登入後複製

使用actions修改資料

直接呼叫actions中的方法,可傳參數

const actionsBtn = (){
      testStore.addNum(5)  
}
登入後複製

重設state中資料

store中有$reset方法,可以直接對store中資料重設

const treset = (){
    testStore.$reset()
}
登入後複製

Pinia持久化儲存

  • 實現持久化存儲,需要配合以下插件使用
yarn add  pinia-plugin-persist
登入後複製
  • 配置store資料夾下的index.js文件,引入pinia-plugin-presist插件
import {createPinia} from "pinia"
import piniaPluginPresist from "pinia-plugin-presist"
const store = createPinia();
store.use(piniaPluginPresist)
export default store
登入後複製
  • 設定stroe資料夾下的test.js文件,使用presist屬性進行配置
import {definePinia} from "pinia"
export default testStore = definePinia(&#39;testId&#39;,{
    state:()=>{
         tname:"test",
         tnum:0,
    },
    getters:{
       changeTnum(){
           console.log("getters")
           this.tnum++;
       }
    },
    actions:{
       addNum(val){
          this.tnum += val
       }
    },
    //持久化存储配置
    presist:{
         enable:true,//
         strategies:[
            {
            key:"testId",
            storage:localStorage,
            paths:[&#39;tnum&#39;]
            } 
         ]
    }
})
登入後複製
登入後複製
  • enable:true,開啟持久化存儲,預設為使用sessionStorage存儲
    - strategies,進行更多配置
    - key,不設定key時,storage的key為definePinia的第一個屬性,設定key值,則自訂storage的屬性名稱
  • storage:localStorage,設定快取模式為本機儲存
  • paths,不設定時對state中的所用資料進行持久化存執,設定時只針對設定的屬性進行持久化儲存

Pinia模組化實作

模組化實作即在store對要使用的模組新建一個js文件,例如user.js檔。然後配置內容跟其他模組一樣,根據自己需求進行設置,然後在對應頁面引入。
淺析Vue專案中怎麼用Pinia狀態管理工具

Pinia中store之間互相呼叫

例如:test.js取得user.js statename屬性值,在test.js引入user.js

import { defineStore } from &#39;pinia&#39;
import { userStore } from "./user.js"
export const useTest = defineStore("testId", {
	state: () => {
		return {
			tid: "111",
			tname: "pinia",
			tnum: 0
		}
	},
	getters: {
		tchangeNum() {
			console.log(&#39;getters&#39;)
			return this.tnum + 100
		}
	},
	actions: {
		tupNum(val) {
			console.log(&#39;actions&#39;)
			this.tnum += val;
		},
		getUserData() {
			console.log(useStore().name);
			return useStore().name;
		},
	},
	persist: {
		//走的session
		enabled: true,
		strategies: [
			{
				key: "my_testId",
				storage: localStorage,
				paths: [&#39;tnum&#39;]
			}
		]
	}
})
登入後複製

user.js

import { defineStore } from &#39;pinia&#39;
export const useStore = defineStore(&#39;storeId&#39;, {
  state: () => {
    return {
      num: 0,
      name: &#39;张三&#39;
    }
  }
})
登入後複製

A.vue元件中,呼叫test.jsgetUserData方法就可以得到uesr.js中的name

const actionBtn = () => {
    testStore.getUserData()
};
登入後複製

(学习视频分享:编程基础视频

以上是淺析Vue專案中怎麼用Pinia狀態管理工具的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

vue中的watch怎麼用 vue中的watch怎麼用 Apr 07, 2025 pm 11:36 PM

Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

vue.js怎麼引用js文件 vue.js怎麼引用js文件 Apr 07, 2025 pm 11:27 PM

在 Vue.js 中引用 JS 文件的方法有三種:直接使用 &lt;script&gt; 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

vue返回上一頁的方法 vue返回上一頁的方法 Apr 07, 2025 pm 11:30 PM

Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 &lt;router-link to=&quot;/&quot;&gt; 組件window.history.back(),方法選擇取決於場景。

怎樣查詢vue的版本 怎樣查詢vue的版本 Apr 07, 2025 pm 11:24 PM

可以通過以下方法查詢 Vue 版本:使用 Vue Devtools 在瀏覽器的控制台中查看“Vue”選項卡。使用 npm 運行“npm list -g vue”命令。在 package.json 文件的“dependencies”對像中查找 Vue 項。對於 Vue CLI 項目,運行“vue --version”命令。檢查 HTML 文件中引用 Vue 文件的 &lt;script&gt; 標籤中的版本信息。

vue函數怎麼傳參數 vue函數怎麼傳參數 Apr 08, 2025 am 07:36 AM

向 Vue.js 函數傳遞參數有兩種主要方法:使用插槽傳遞數據或使用 bind 綁定函數,並提供參數:使用插槽傳遞參數:在組件模板中傳遞數據,在組件內訪問並用作函數的參數。使用 bind 綁定傳遞參數:在 Vue.js 實例中綁定函數,並提供函數參數。

See all articles