J'utilise vue/vuex depuis des mois et je vois mapState
, mapGetters
, mapActions
, mapMutations
mais je ne sais pas ce qu'ils font sauf pour mapState
.
Voici comment j'utilise mapState
// mutations.js
user: {
address: {},
name: '',
age: ''
}
et dans mon code, j'ai quelque chose comme ça:
import { mapState } from 'vuex'
export default {
data: {},
computed: {
...mapState({
address: state => state.user.address
})
}
}
alors je peux utiliser l'adresse n'importe où, mais je ne sais pas à quoi servent les autres.
quelqu'un peut-il donner un exemple simple? Merci
Aucun de ces mappeurs n'est obligatoire. Leur objectif est simplement de faciliter la création de propriétés ou de méthodes calculées dans les composants. Ils sont DRY (éviter la duplication) à son meilleur.
mapState
est un assistant qui simplifie la création d'une propriété calculée qui reflète la valeur d'un état donné.
De même:
mapGetters
est un assistant qui simplifie la création d'une propriété calculée qui reflète la valeur renvoyée par un getter donné. mapActions
est un assistant qui simplifie la création d'une méthode qui équivaudrait à appeler dispatch
sur une action.mapMutations
est un assistant qui simplifie la création d'une méthode qui équivaudrait à appeler commit
sur une mutation.Puisque le code aide, la démo ci-dessous montre des exemples d'utilisation de tous ces mappeurs , et leur équivalent sans mappeurs . Leur comportement est exactement le même. Les mappeurs vous permettent juste d'écrire avec moins de code (considérez que cela sera répété dans de nombreux composants de votre application).
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) },
}
})
table, tr, td {
font-family: monospace;
border: 1px solid black;
border-collapse: collapse;
}
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vuex"></script>
<script src="https://unpkg.com/[email protected]/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>