Vuex: stateの取得

updated: 2019/12/11

 

vue@2.6.10

 vuex@3.1.2

 

 

以下要検証

vuexのstateを取得するときdataで取得することができるが

data() {

  return {

    target: this.$store.state.target

  }

}

 

取得したstateのプロパティにアクセスするときに取得前の値(null?)を参照してしまいエラーが出る場合がある。

例えば、

mounted() {

   target.methodA()  // error

}

 

computedでstateを取得すると回避できる。

computed: {

  target() {

   return this.$store.state.target

  }

},

mounted() {

  target.methodA()  // success

}

 

プロパティがダイナミックに定義されるものである場合、レンダリング時にcomputedは適切に評価されず、初めてプロパティが取得できた時点でストップしてしまう???

例えば、

 const state = {

  target = {}

}

mutaions = {

  'UPDATE_TARGET' (state, data) {

    state.target[data.key1] = data.value

    state.target[data.key2] = data.secondValue

  }

}

mutationでtargetのpropの中身を2回更新

computedで正しく2回更新された後のtargetを取得できているのにレンダリングは1回目の更新しか反映されていない。

 

DOMをいったんdestroyした後、再度アクセスするとcomputedで2回更新後のtargetを取得できる。(stateで2回更新後の値が定義済みなのでそれを取得している???)

 

妥協案

dynamicに定義予定のキーをあらかじめ定義しておく

⇒つまりdynamicはやめてstaticにあらかじめ定義

 

 

const state = {

  target = {someProp: [ ], otherProp: [ ]}

}

 

mutaions = {

  'UPDATE_TARGET' (state, data) {

    state.target[data.key] = data.value //  [data.key] = "someProp"

    state.target[data.key2] = data.secondValue  //  [data.key2] = "otherProp"

    state.target[data.key][data.someDynamicProp] = data.thirdValue  // will cause rendering error

/* 左辺は必ずstaticに */

  }

}

 

computed: {

  success() {

    return this.$store.state.target.someProp    // success

  }

}

 

参考:

Vue の data の初期値について