Vuexは実際の戦闘でこれらを理解するのに十分です

目次

 

1.インストール

1.1。依存関係を追加する

1.2。プロジェクトで紹介されました

1.3。例

main.js

store.js

flightInfo.js(モジュラー状態管理)

type.js(定数ミューテーション名)

2.使用法

2.1。状態

2.1.1。状態を定義する

2.1.2。インポート状態

2.2。ゲッター

2.2.1。ゲッターを定義する

2.2.2。ゲッターをインポートします

2.3。突然変異

2.3.1。突然変異の定義

2.3.2。トリガーミューテーション

2.3.3。トリガー時にパラメーターを実行する

2.3.4。定数を使用してMutationイベントタイプを定義する

2.3.5。突然変異は同期関数でなければなりません

2.4。アクション

2.4.1。登録アクション

2.4.2。アクションの配布


1.インストール

1.1。依存関係を追加する

npm install vuex --save

  VuexはPromiseに依存しています。サポートしているブラウザがPromiseを実装していない場合は、es6-promiseなどのポリフィルライブラリを使用できます 

npm install es6-promise --save

1.2。プロジェクトで紹介されました

例として最新のvue-cli3アーキテクチャを取り上げ、それをsrc /main.jsに追加します

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

Vue.use(Vuex)

より一般的には、store.jsなどの専用の状態管理jsファイルがあります

main.jsではstore.jsのみが導入されています。そして、store.jsに上記の引用部分を追加します。将来的には、関連する状態管理はstore.jsで行われます。

1.3。例

最初に実際の戦闘の例をいくつか貼り付けて、直感的な使用法を理解します

main.js

記事のmain.jsの部分を参照してください。「これらを理解するには、Vue-routerの実際の戦闘で十分です

store.js

import Vue from 'vue'
import Vuex from 'vuex'
import flightInfo from './modules/flightInfo'
Vue.use(Vuex)

export default new Vuex.Store({

  modules: {
    flightInfo
  },
  state: {

  },
  mutations: {

  },
  actions: {

  }
})

flightInfo.js(モジュラー状態管理)

import * as types from '../type'

const state = {
  flightInfo: []
}

const getters = {
  getflightInfo: state => state.flightInfo
}

const actions = {
  saveFlightInfo ({ commit }, data) {
    return new Promise(resolve => {
      commit(types.FLIGHTINFO, data)
      resolve(data)
    })
  }
}

const mutations = {
  [types.FLIGHTINFO] (state, data) {
    state.flightInfo = data
    localStorage.setItem('flightInfo', JSON.stringify(state.flightInfo))
  }
}

export default {
  state,
  actions,
  getters,
  mutations
}

type.js(定数ミューテーション名)

export const FLIGHTINFO = 'FLIGHTINFO'

上記の各jsファイルのディレクトリ構成は次のとおりです。

src

------ main.js

- - - お店

------------ store.js

------------ type.js

------------モジュール

------------------ flightInfo.js

 

2.使用法

vuex状態管理の原則

 

2.1。状態

Vuexは単一の状態ツリーを使用ます。これは、各アプリケーションに含まれるストアインスタンスが1つだけあることも意味します。

2.1.1。状態を定義する

const store = new Vuex.Store({
  state: {
    count: 0
  }
})

2.1.2。インポート状態

  • 方法1:属性を計算します(ストアオブジェクトは個別にインポートされます)

Vuexの状態ストレージは応答性が高いため、ストアインスタンスから状態を読み取る最も簡単な方法は、計算された属性で特定の状態を返すことです。

const Counter = {
  template: `<div>{
   
   { count }}</div>`,
  computed: {
    count () {
      return store.state.count
    }
  }
}

短所:状態を使用する必要があるすべてのコンポーネントは、ストアの頻繁なインポートを必要とします

  • 方法2:属性の計算(ストアオブジェクトのグローバルインポート)

Vuexは、ストアオプションを介してルートコンポーネントから各子コンポーネントに状態を注入するメカニズムを提供しますVue.use(Vuex)を呼び出す必要があります)。

const app = new Vue({
  el: '#app',
  // 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
  store,
  components: { Counter },
  template: `
    <div class="app">
      <counter></counter>
    </div>
  `
})

ルートインスタンスにストアオプションを登録することにより、ストアインスタンスはルートコンポーネントの下のすべての子コンポーネントに挿入され、子コンポーネントにはthis。$ storeからアクセスできます。Counterの実装を更新しましょう:

const Counter = {
  template: `<div>{
   
   { count }}</div>`,
  computed: {
    count () {
      return this.$store.state.count
    }
  }
}

短所:コンポーネントが複数の状態を取得する必要がある場合、これらの状態を計算されたプロパティとして宣言することは、いくらか反復的で冗長になります。 

  • 方法3:mapStateヘルパー関数(オブジェクトのグローバルインポートを保存)
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);

import { mapState } from 'vuex';

const store = new Vuex.Store({
    state: {
        count: 3
    }
});
new Vue({ 
    el: '#app',
    store,
    data() {
        return {
            localCount: 4
        }
    },
    computed: mapState({
        count: state => state.count,
        // 传字符串参数 'count' 等同于 `state => state.count`
        countAlias: 'count',
        // 为了能够使用 `this` 获取局部状态,必须使用常规函数(相对于箭头函数)
        countPlusLocalState (state) {
            return state.count + this.localCount
        }
    })
});

マップされた計算属性の名前が状態の子ノードの名前と同じである場合、文字列配列をmapStateに渡すこともできます。

computed: mapState([
  // 映射 this.count 为 store.state.count
  'count'
])

方法4:mapState補助関数+オブジェクトエクスパンダ(オブジェクトのグローバルインポートを保存)

mapState関数はオブジェクトを返します。それをローカルの計算プロパティとどのように組み合わせることができますか?

computed: {
  localComputed () { // ...  },
  // 使用对象展开运算符将此对象混入到外部对象中
  ...mapState({
    // ...
  })
}

2.2。ゲッター

ストア内の状態から何らかの状態を導出する必要がある場合がありますか?

Vuexを使用すると、ストアで「ゲッター」を定義できます(ストアの計算された属性と考えることができます)。計算されたプロパティと同様に、ゲッターの戻り値は依存関係に従ってキャッシュされ、依存関係の値が変更された場合にのみ再計算されます。

2.2.1。ゲッターを定義する

Getterは、最初のパラメーターとして状態を受け入れます。

const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})

ゲッターは、2番目のパラメーターとして他のゲッターを受け入れることもできます。

getters: {
  // ...
  doneTodosCount: (state, getters) => {
    return getters.doneTodos.length
  }
}

2.2.2。ゲッターをインポートします

1.属性別

ゲッターはstore.gettersオブジェクトとして公開され、プロパティの形式でこれらの値にアクセスできます

方法1:ストアオブジェクトを個別に導入します(インポートを介してstore.jsをインポートします)

store.getters.doneTodos

方法2:ストアオブジェクトをグローバルに挿入します(Vueのストアオプションを使用)

computed: {
  doneTodosCount () {
    return this.$store.getters.doneTodosCount
  }
}

2.合格方法

方法3

ゲッターへのパラメーターの受け渡しは、ゲッターに関数を返させることで実現されます。ストア内の配列をクエリする場合に非常に便利です。

getters: {
  getTodoById: (state) => (id) => {
    return state.todos.find(todo => todo.id === id)
  }
}
store.getters.getTodoById(2) // -> { id: 2, text: '...', done: false }

メソッドを介してゲッターにアクセスすると、毎回呼び出され、結果はキャッシュされないことに注意してください。

方法4:mapGetters補助関数+オブジェクトエクスパンダー(オ​​ブジェクトグローバルインポートの保存)

mapGettersヘルパー関数は、ストア内のゲッターをローカルで計算されたプロパティにマップするだけです。

import { mapGetters } from 'vuex'

export default {
  computed: {
    // 使用对象展开运算符将 getter 混入 computed 对象中
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}

getterプロパティに別の名前を付ける場合は、オブジェクトフォームを使用します。

mapGetters({
  // 把 `this.doneCount` 映射为 `this.$store.getters.doneTodosCount`
  doneCount: 'doneTodosCount'
})

 

2.3。突然変異

2.3.1。突然変異の定義

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

2.3.2。トリガーミューテーション

方法1

store.commit('increment')

モード2:mapMutationsセカンダリプロモーター関数識別子+オブジェクト+ストアはグローバルインポートオブジェクトを展開します

mport { mapMutations } from 'vuex'

export default {
  // ...
  methods: {
    ...mapMutations([
      'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`
      // `mapMutations` 也支持载荷:
      'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
    ]),
    ...mapMutations({
      add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`
    })
  }
}

 

2.3.3。トリガー時にパラメーターを実行する

パラメータはプリミティブ型です

mutations: {
  increment (state, n) {
    state.count += n
  }
}
store.commit('increment', 10)

パラメータはオブジェクトタイプです

mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}
store.commit('increment', {amount: 10})

2.3.4。定数を使用してMutationイベントタイプを定義する

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'

const store = new Vuex.Store({
  state: { ... },
  mutations: {
    // 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
    [SOME_MUTATION] (state) {
      // mutate state
    }
  }
})

2.3.5。突然変異は同期関数でなければなりません

 

2.4。アクション

アクションはミューテーションと似ていますが、次の点が異なります。

  • アクションは、状態を直接変更するのではなく、ミューテーションを送信します。
  • アクションには、任意の非同期操作を含めることができます。

2.4.1。登録アクション

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

Action関数は、ストアインスタンスと同じメソッドとプロパティを持つコンテキストオブジェクトを受け入れるため、context.commitを呼び出してミューテーションを送信するか、context.stateとcontext.gettersを介して状態とゲッターを取得できます。

ES2015パラメーターの非構造化を使用して  、コードを単純化します(特に、commit 何度も呼び出す必要がある場合 )。

actions: {
  increment ({ commit }) {
    commit('increment')
  }
}

2.4.2。アクションの配布

方法1:ストアオブジェクトは個別にインポートされます+負荷なし

store.dispatch('increment')

 方法2:ストアオブジェクトは個別にインポートされます+ロード

store.dispatch('incrementAsync', {amount: 10})

方法3:オブジェクトのグローバルインポートとロードを保存する

this.$store.dispatch('incrementAsync', {amount: 10})

モード4:mapActionsセカンダリプロモーター関数識別子+オブジェクト+ストアはグローバルインポートオブジェクトを展開します

import { mapActions } from 'vuex'

export default {
  // ...
  methods: {
    ...mapActions([
      'increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`
      // `mapActions` 也支持载荷:
      'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`
    ]),
    ...mapActions({
      add: 'increment' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')`
    })
  }
}

 

 

おすすめ

転載: blog.csdn.net/u014225733/article/details/95334034