搜尋
首頁web前端Vue.jsVue3中Vuex怎麼使用

Vue3中Vuex怎麼使用

May 14, 2023 pm 08:28 PM
vue3vuex

    Vuex是做什麼的?

    Vue官方:狀態管理工具

    狀態管理是什麼?

    需要在多個元件中共享的狀態、且是響應式的、一個變,全都改變。

    例如一些全域要用的狀態資訊:使用者登入狀態、使用者名稱、地理位置資訊、購物車中商品、等等

    這時候我們就需要這麼一個工具來進行全域的狀態管理,Vuex就是這樣的一個工具。

    單一頁面的狀態管理

    View–>Actions—>State

    視圖層(view)觸發操作(action)變更狀態(state)回應回視圖層(view)

    vuex(Vue3.2版本)

    store/index.js 建立store物件並匯出store

    import { createStore } from 'vuex'
    
    export default createStore({
      state: {
      },
      mutations: {
      },
      actions: {
      },
      modules: {
      }
    })

    main.js 引入並使用

    ...
    import store from './store'
    ...
    app.use(store)

    多頁狀態管理

    Vue3中Vuex怎麼使用

    vuex store物件屬性介紹

    Vue3中取得store 實例物件的方法

    vue2 中可以透過this.$store.xxx 的方式拿到store 的實例物件。

    vue3 中的 setup 在 beforecreate 和 created 前執行,此時 vue物件還未被創建,沒有了先前的this,所以這裡我們需要用到另一種方法來取得 store 物件。

    import { useStore } from 'vuex' // 引入useStore 方法
    const store = useStore()  // 该方法用于返回store 实例
    console.log(store)  // store 实例对象
    1. state

    存放資料的地方

    state: {
      count: 100,
      num: 10
    },

    #使用:使用方法大致與vue2.x中的版本相同,透過$store.state.屬性名稱來取得state中的屬性。

    //template中
    <span>{{$store.state.count}}</span>
    <span>{{$store.state.num}}</span>

    可以在 state 中直接進行資料變更的操作,但Vue不建議這麼做。因為對於vue開發工具 devtools 來說,直接在state中進行資料改變,devtools是追蹤不到的。 vuex中希望透過 action(進行非同步操作)或是 mutations(同步操作)來進行資料改變的操作,這樣在 devtools 中才能直接觀察出資料的變化以及記錄,方便開發者除錯。

    另外,在vue3 中對state 中物件新增屬性或刪除時,不再需要透過vue.set() , 或vue.delete() 來進行物件的回應式處理了,直接新增的物件屬性已經具有響應式。

    2. mutations

    vuex的store狀態更新的唯一方式:提交mutation

    同步操作可以直接在mutatuions中直接進行

    mutions 主要包含2部分:

    1. 字串的事件類型(type)

    2. #一個**回呼函數(handler)**這個回呼函數的第一個參數是state

    mutations: {
      // 传入 state
      increment (state) {
        state.count++
      }
    }

    template 中透過$store.commit('方法名稱') 觸發

    在vue3.x 中需要拿到** store 實例的話,需要呼叫useStore **這樣一個函數,在vuex 中導入

    // 导入 useStore 函数
    import { useStore } from &#39;vuex&#39;
    const store = useStore()
    store.commit(&#39;increment&#39;)

    #mution 的參數與傳參方法

    mution 接收參數直接寫在定義的方法裡邊即可接受傳遞的參數

    // ...state定义count
    mutations: {
      sum (state, num) {
        state.count += num
      }
    }

    透過commit 的payload 進行參數傳遞

    使用store.commit('mution中函數名稱', '需要傳遞的參數' ) 在commit裡添加參數的方式進行傳遞

    <h3 id="this-store-state-count">{{this.$store.state.count}}</h3>
    <button @click="add(10)">++</button>
    ...
    <script setup>
    // 获取store实例,获取方式看上边获取store实例方法
    const add = (num) => {
      store.commit(&#39;sum&#39;, num)
    }
    </script>

    mution 的提交風格

    前面提到了mution 主要包含type 和回呼函數兩部分, 和透過commit payload的方式進行參數傳遞(提交),下面我們可以

    用這種方式進行mution 的提交

    const add = (num) => {
      store.commit({
        type: &#39;sum&#39;,  // 类型就是mution中定义的方法名称
        num
      })
    }
    
    ...
    mutations: {
      sum (state, payload) {
        state.count += payload.num
      }
    }
    3. actions

    非同步操作在action中進行,再傳遞到mutation

    action基本上使用如下:

    action 中定義的方法預設參數為** context 上下文**, 可以理解為store 物件

    透過context 上下文對象,拿到store,透過commit 觸發mution 中的方法,以此來完成非同步操作

    ...
    mutations: {
      sum (state, num) {
        state.count += num
      }
    },
    actions: {
      // context 上下文对象,可以理解为store
      sum_actions (context, num) {
        setTimeout(() => {
          context.commit(&#39;sum&#39;, num)  // 通过context去触发mutions中的sum
        }, 1000)
      }
    },

    在template 中透過dispatch 呼叫action 中定義的sum_action 方法

    // ...template
    store.dispatch(&#39;sum_actions&#39;, num)

    透過promise 實現非同步操作完成,通知元件非同步操作執行成功或是失敗。

    // ...
    const addAction = (num) => {
      store.dispatch(&#39;sum_actions&#39;, {
        num
      }).then((res) => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
    }

    sun_action方法傳回一個promise,當累加的值大於30時不再累加,拋出錯誤。

     actions: {
        sum_actions (context, payload) {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              // 通过 context 上下文对象拿到 count
              if (context.state.count < 30) {
                context.commit(&#39;sum&#39;, payload.num)
                resolve(&#39;异步操作执行成功&#39;)
              } else {
                reject(new Error(&#39;异步操作执行错误&#39;))
              }
            }, 1000)
          })
        }
      },
    4. getters

    類似於元件的計算屬性

    import { createStore } from &#39;vuex&#39;
    
    export default createStore({
      state: {
        students: [{ name: &#39;mjy&#39;, age: &#39;18&#39;}, { name: &#39;cjy&#39;, age: &#39;22&#39;}, { name: &#39;ajy&#39;, age: &#39;21&#39;}]
      },
      getters: {
        more20stu (state) { return state.students.filter(item => item.age >= 20)}
      }
    })

    使用透過$store.getters.方法名稱進行呼叫

    //...template
    <h3 id="store-getters-more-stu">{{$store.getters.more20stu}}</h3> // 展示出小于20岁的学生

    getters 的入參, getters 可以接收兩個參數,一個是state, 一個是自身的getters ,並對自身存在的方法進行呼叫。

    getters: {
      more20stu (state, getters) { return getters.more20stu.length}
    }

    getters 的參數與傳參方法

    上面是getters固定的兩個參數,如果你想給getters傳遞參數,讓其篩選大於age 的人,可以這麼做

    返回一個function 該function 接受Age,並處理

    getters: {
      more20stu (state, getters) { return getters.more20stu.length},
      moreAgestu (state) {
          return function (Age) {
            return state.students.filter(item =>
              item.age >= Age
            )
          }
        }
      // 该写法与上边写法相同但更简洁,用到了ES6中的箭头函数,如想了解es6箭头函数的写法
      // 可以看这篇文章 https://blog.csdn.net/qq_45934504/article/details/123405813?spm=1001.2014.3001.5501
      moreAgestu_Es6: state => {
        return Age => {
          return state.students.filter(item => item.age >= Age)
        }
      }
    }

    使用

    //...template
    <h3 id="store-getters-more-stu">{{$store.getters.more20stu}}</h3> // 展示出小于20岁的学生
    

    {{$store.getters.moreAgestu(18)}}

    // 通过参数传递, 展示出年龄小于18的学生
    5. modules

    #當應用程式變得複雜時,state中管理的變數變多,store物件就有可能變得相當臃腫。

    為了解決這個問題,vuex允許我們將store分割成模組化(modules),而每個模組擁有著自己的state、mutation、action、getters等

    在store檔案中新建modules資料夾

    在modules中可以建立單一的模組,一個模組處理一個模組的功能

    store/modules/user.js 处理用户相关功能

    store/modules/pay.js 处理支付相关功能

    store/modules/cat.js 处理购物车相关功能

    // user.js模块
    // 导出
    export default {
      namespaced: true, // 为每个模块添加一个前缀名,保证模块命明不冲突 
      state: () => {},
      mutations: {},
      actions: {}
    }

    最终通过 store/index.js 中进行引入

    // store/index.js
    import { createStore } from &#39;vuex&#39;
    import user from &#39;./modules/user.js&#39;
    import user from &#39;./modules/pay.js&#39;
    import user from &#39;./modules/cat.js&#39;
    export default createStore({
      modules: {
        user,
        pay,
        cat
      }
    })

    在template中模块中的写法和无模块的写法大同小异,带上模块的名称即可

    <h3 id="store-state-user-count">{{$store.state.user.count}}</h3>
    store.commit(&#39;user/sum&#39;, num) // 参数带上模块名称
    store.dispatch(&#39;user/sum_actions&#39;, sum)

    以上是Vue3中Vuex怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    框架的選擇:是什麼推動了Netflix的決定?框架的選擇:是什麼推動了Netflix的決定?Apr 13, 2025 am 12:05 AM

    Netflix在框架選擇上主要考慮性能、可擴展性、開發效率、生態系統、技術債務和維護成本。 1.性能與可擴展性:選擇Java和SpringBoot以高效處理海量數據和高並發請求。 2.開發效率與生態系統:使用React提升前端開發效率,利用其豐富的生態系統。 3.技術債務與維護成本:選擇Node.js構建微服務,降低維護成本和技術債務。

    反應,vue和Netflix前端的未來反應,vue和Netflix前端的未來Apr 12, 2025 am 12:12 AM

    Netflix主要使用React作為前端框架,輔以Vue用於特定功能。 1)React的組件化和虛擬DOM提升了Netflix應用的性能和開發效率。 2)Vue在Netflix的內部工具和小型項目中應用,其靈活性和易用性是關鍵。

    前端中的vue.js:現實世界的應用程序和示例前端中的vue.js:現實世界的應用程序和示例Apr 11, 2025 am 12:12 AM

    Vue.js是一種漸進式JavaScript框架,適用於構建複雜的用戶界面。 1)其核心概念包括響應式數據、組件化和虛擬DOM。 2)實際應用中,可以通過構建Todo應用和集成VueRouter來展示其功能。 3)調試時,建議使用VueDevtools和console.log。 4)性能優化可通過v-if/v-show、列表渲染優化和異步加載組件等實現。

    vue.js和React:了解關鍵差異vue.js和React:了解關鍵差異Apr 10, 2025 am 09:26 AM

    Vue.js適合小型到中型項目,而React更適用於大型、複雜應用。 1.Vue.js的響應式系統通過依賴追踪自動更新DOM,易於管理數據變化。 2.React採用單向數據流,數據從父組件流向子組件,提供明確的數據流向和易於調試的結構。

    vue.js vs.反應:特定於項目的考慮因素vue.js vs.反應:特定於項目的考慮因素Apr 09, 2025 am 12:01 AM

    Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

    vue怎麼a標籤跳轉vue怎麼a標籤跳轉Apr 08, 2025 am 09:24 AM

    實現 Vue 中 a 標籤跳轉的方法包括:HTML 模板中使用 a 標籤指定 href 屬性。使用 Vue 路由的 router-link 組件。使用 JavaScript 的 this.$router.push() 方法。可通過 query 參數傳遞參數,並在 router 選項中配置路由以進行動態跳轉。

    vue怎麼實現組件跳轉vue怎麼實現組件跳轉Apr 08, 2025 am 09:21 AM

    Vue 中實現組件跳轉有以下方法:使用 router-link 和 <router-view> 組件進行超鏈接跳轉,指定 :to 屬性為目標路徑。直接使用 <router-view> 組件顯示當前路由渲染的組件。使用 router.push() 和 router.replace() 方法進行程序化導航,前者保存歷史記錄,後者替換當前路由不留記錄。

    vue的div怎麼跳轉vue的div怎麼跳轉Apr 08, 2025 am 09:18 AM

    Vue 中 div 元素跳轉的方法有兩種:使用 Vue Router,添加 router-link 組件。添加 @click 事件監聽器,調用 this.$router.push() 方法跳轉。

    See all articles

    熱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.能量晶體解釋及其做什麼(黃色晶體)
    3 週前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳圖形設置
    3 週前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您聽不到任何人,如何修復音頻
    3 週前By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25:如何解鎖Myrise中的所有內容
    4 週前By尊渡假赌尊渡假赌尊渡假赌

    熱工具

    MantisBT

    MantisBT

    Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

    記事本++7.3.1

    記事本++7.3.1

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

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

    PhpStorm Mac 版本

    PhpStorm Mac 版本

    最新(2018.2.1 )專業的PHP整合開發工具

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用