1. 程式人生 > 遊戲 >《魔戒:咕嚕》新預告展示甘道夫等人全新形象設計

《魔戒:咕嚕》新預告展示甘道夫等人全新形象設計

一、Vuex是什麼?
Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。

什麼情況下我應該使用 Vuex?
Vuex 可以幫助我們管理共享狀態,並附帶了更多的概念和框架。這需要對短期和長期效益進行權衡。

如果您不打算開發大型單頁應用,使用 Vuex 可能是繁瑣冗餘的。確實是如此——如果您的應用夠簡單,您最好不要使用 Vuex。一個簡單的 store 模式就足夠您所需了。但是,如果您需要構建一箇中大型單頁應用,您很可能會考慮如何更好地在元件外部管理狀態,Vuex 將會成為自然而然的選擇。

二、使用步驟
1.引入庫
先在腳手架中下載 Vuex
npm install vuex --save
在專案的src目錄下新增一個utils資料夾,裡面建一個store.js
初始化store.js中的內容

import Vue from 'vue'
import Vuex from 'vuex'

//掛載Vuex
Vue.use(Vuex)

//建立VueX物件
const store = new Vuex.Store({
    state:{
        //存放的鍵值對就是所要管理的狀態
        name:'helloVueX'
    }
})

export default store

2.將store掛載到當前專案的Vue例項當中去

開啟main.js

import Vue from 'vue'
import App from './App'
import router from 
'./router' import store from './store' Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, store, //store:store 和router一樣,將我們建立的Vuex例項掛載到這個vue例項中 render: h => h(App) })

3.在元件中使用Vuex

例如在App.vue中,我們要將state中定義的name拿來在h1標籤中顯示

<template>
    <div id='app'>
        name:
        
<h1>{{ $store.state.name }}</h1> </div> </template>

或者要在元件方法中使用

methods:{
    add(){
      console.log(this.$store.state.name)
    }
},

二、VueX中的屬性

state:存放變數
mutations:修改state 中的資料
actions: 只能呼叫mutations中的方法
getters:類似與計算屬性 可以對state中的資料做一些邏輯性操作
modules: 將倉庫分模組儲存

Vuex工作流程

Mutation傳值

在實際生產過程中,會遇到需要在提交某個mutation時需要攜帶一些引數給方法使用。

單個值提交時:

this.$store.commit('edit',15)
1
當需要多參提交時,推薦把他們放在一個物件中來提交:

this.$store.commit('edit',{age:15,sex:'男'})
1
接收掛載的引數:

        edit(state,payload){
            state.name = 'jack'
            console.log(payload) // 15或{age:15,sex:'男'}
        }

Actions
由於直接在mutation方法中進行非同步操作,將會引起資料失效。所以提供了Actions來專門進行非同步操作,最終提交mutation方法。

Actions中的方法有兩個預設引數

context 上下文(相當於箭頭函式中的this)物件
payload 掛載引數
例如,我們在兩秒中後執行2.2.2節中的edit方法

由於setTimeout是非同步操作,所以需要使用actions

actions:{
    aEdit(context,payload){
        setTimeout(()=>{
            context.commit('edit',payload)
        },2000)
    }
}
在元件中呼叫:

this.$store.dispatch('aEdit',{age:15})
1
改進:

由於是非同步操作,所以我們可以為我們的非同步操作封裝為一個Promise物件

    aEdit(context,payload){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                context.commit('edit',payload)
                resolve()
            },2000)
        })
    }

Getters

可以對state中的成員加工後傳遞給外界

Getters中的方法有兩個預設引數

state 當前VueX物件中的狀態物件
getters 當前getters物件,用於將getters下的其他getter拿來用

getters:{
    nameInfo(state){
        return "姓名:"+state.name
    },
    fullInfo(state,getters){
        return getters.nameInfo+'年齡:'+state.age
    }  
}

元件中呼叫


this.$store.getters.fullInfo

Models

當專案龐大,狀態非常多時,可以採用模組化管理模式。Vuex 允許我們將 store 分割成模組(module)。每個模組擁有自己的 state、mutation、action、getter、甚至是巢狀子模組——從上至下進行同樣方式的分割。

我們在store裡面建立一個資料夾moudules.

在moudles中,存放不通模組的處理邏輯。舉個例子:

moudules裡面放home.js、list.js、login.js

這三個檔案呢,裡面的結構我們可以這樣寫:

const state = {};
const getters = {};
const mutations = {};
const actions = {};
 
export default {
  // namespaced: true, 這個屬性大家自己百度吧,防止命名衝突
  state,
  actions,
  mutations
};

那index.js就很簡單了:

import Vue from "vue";
import Vuex from "vuex";
import login from "./modules/login";
import list from "./modules/common";
import home from "./modules/common";
 
Vue.use(Vuex);
 
export default new Vuex.Store({
  modules: { login, list, home}
});

這樣維護起來是不是就很方便了呢?

models:{
    a:{
        state:{},
        getters:{},
        ....
    }
}

元件內呼叫模組a的狀態:


this.$store.state.a
1
而提交或者dispatch某個方法和以前一樣,會自動執行所有模組內的對應type的方法:


this.$store.commit('editKey')
this.$store.dispatch('aEditKey')

對映

在需要使用Vuex的元件中匯入

 import {mapState} from 'vuex';

對映關係

mapState > computed

mapGetters > computed

mapMutations > methods

mapActions > methods

methods:{
   //將store.mutations對映到methods
   ...mapMutations()
   //將store.actions對映到methods
   ...mapMutations()
  }
computed:{
   //將store.state中的屬性對映到computed
   ...mapState()
    //將store.getters對映到computed
   ...mapGetters()
  }