gpt4 book ai didi

vue.js - Vuex 中 mapState、mapGetters、mapActions、mapMutations 的区别

转载 作者:搜寻专家 更新时间:2023-10-30 22:10:03 26 4
gpt4 key购买 nike

我已经使用 vue/vuex 几个月了,我看到了 mapStatemapGettersmapActionsmapMutations但除了 mapState 之外不知道他们做了什么。

这就是我使用mapState

的方式
// mutations.js 
user: {
address: {},
name: '',
age: ''
}

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

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

computed: {
...mapState({
address: state => state.user.address
})
}
}

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

有人能举个简单的例子吗?谢谢

最佳答案

这些映射器都不是强制性的。他们的目标只是使在组件中创建计算属性或方法变得容易。它们是 DRY(避免重复)的最佳状态。

mapState 是一个帮助程序,可简化创建反射(reflect)给定状态值的计算 属性的过程。

类似地:

  • mapGetters 是一个帮助程序,可简化创建反射(reflect)给定 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) },
}
})
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/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>

关于vue.js - Vuex 中 mapState、mapGetters、mapActions、mapMutations 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49696542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com