差异b/n mapState,mapGetters,mapActions,mapMutations在Vuex中

hid*_*dar 9 vue.js vuex vuejs2

我一直在使用VUE/vuex几个月,我看到mapState,mapGetters,mapActions,mapMutations但不知道他们做了什么,除了mapState.

这就是我的用法 mapState

// mutations.js 
user: {
   address: {},
   name: '',
   age: ''
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中我有这样的东西:

import { mapState } from 'vuex'
export default {
  data: {},

  computed: {
   ...mapState({
    address: state => state.user.address
   })
  }
} 
Run Code Online (Sandbox Code Playgroud)

然后我可以在任何地方使用地址,但我不知道其他人使用的是什么.

有人能给出一个简单的例子吗?谢谢

acd*_*ior 20

这些映射器都不是强制性的.他们的目标只是在组件中轻松创建计算属性或方法.它们是最好的干(避免重复).

mapState是一个帮助器,简化了创建反映给定状态值的计算属性.

同理:

  • mapGetters是一个帮助器,它简化了创建反映给定getter返回的值的计算属性.
  • mapActions是简化创建一个辅助方法,这将是等价调用dispatch上的动作.
  • mapMutations是简化创建一个辅助方法,这将是等价调用commit上的突变.

由于代码有帮助,下面的演示显示了使用所有这些映射器的示例,以及没有映射器等效示例.他们的行为完全一样.映射器只允许您使用较少的代码编写(考虑到这将在您的应用程序的许多组件中重复).

const store = new Vuex.Store({
  strict: true,
  state: {name: "John"},
  mutations: {
  	changeName(state, data) {
    	state.name = data
    }
  },
  actions: {
    fetchRandomName({ commit }) {
      let randomId = Math.floor(Math.random() * 12) + 1  ;
      axios.get("https://reqres.in/api/users/" + randomId).then(response => {
        commit('changeName', response.data.data.first_name)
      })
    }
  },
  getters: {
    getName: state => state.name,
    getTransformedName: (state) => (upperOrLower) => {
      return upperOrLower ? state.name.toUpperCase() : state.name.toLowerCase()
    }
  }
});
new Vue({
  store,
  el: '#app',
  data: { newName: 'Bob' },
  computed: {
    ...Vuex.mapState(['name']),
    nameNoMapper() { return this.$store.state.name },
    ...Vuex.mapGetters(['getName', 'getTransformedName']),
    getNameNoMapper() { return this.$store.getters.getName },
    getTransformedNameNoMapper() { return this.$store.getters.getTransformedName }
  },
  methods: {
    ...Vuex.mapActions(['fetchRandomName']),
    ...Vuex.mapMutations(['changeName']),
    fetchRandomNameNoMapper() { this.$store.dispatch('fetchRandomName') },
    changeNameNoMapper(newName) { this.$store.commit('changeName', newName) },
  }
})
Run Code Online (Sandbox Code Playgroud)
table, tr, td {
  font-family: monospace;
  border: 1px solid black;
  border-collapse: collapse;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vuex"></script>
<script src="https://unpkg.com/axios@0.18.0/dist/axios.min.js"></script>

<div id="app">
  <table>
    <tr>
      <td style="width: 250px">With Mappers</td>
      <td style="width: 310px">Without Mappers</td>
    </tr>
    <tr>
      <td>
        name: {{ name }}<br>
        getName: {{ getName }}<br>
        getTransformedName(true): {{ getTransformedName(true) }}<br>
        getTransformedName(false): {{ getTransformedName(false) }}
      </td>
      <td>
        nameNoMapper: {{ nameNoMapper }}<br>
        getNameNoMapper: {{ getNameNoMapper }}<br>
        getTransformedNameNoMapper(true): {{ getTransformedNameNoMapper(true) }}<br>
        getTransformedNameNoMapper(false): {{ getTransformedNameNoMapper(false) }}
      </td>
    </tr>
  </table>
  <hr>
  <button @click="fetchRandomName">ACTION: fetchRandomName</button> - <button @click="fetchRandomNameNoMapper">ACTION: fetchRandomNameNoMapper</button><br>
  <hr>
  <input v-model="newName"><button @click="changeName(newName)">MUTATION: changeName</button><button @click="changeNameNoMapper(newName)">MUTATION: changeNameNoMapper</button>
</div>
Run Code Online (Sandbox Code Playgroud)

  • @IrfandyJip 不,是一样的,不起作用。如果你的getter不做计算,差别是纳秒量级(计算机的温度应该有更高的影响) (2认同)