【发布时间】:2019-07-30 14:15:37
【问题描述】:
当 vuex 的状态改变时,我的 vue 组件不会改变子组件。
我有一个项目插槽列表,并希望根据 vuex 状态变量呈现项目。
当您单击“项目”组件时,它会设置selectedItem 状态变量。另一个组件监视此变量并使用新数据设置equippedItems 变量。
但是当我尝试更改一个项目时,它并没有显示出来,即使状态似乎在 Vuex 中发生了变化。
我已经这样设置了 vuex 商店:
const state = {
equippedItems:
[
{
name: 'Item 1',
strength: 3,
itemType: 1,
rarity: 3
},
{
name: 'Item 2',
strength: 40,
itemType: 2,
rarity: 2
}
],
selectedItem: null
}
const getters = {
getEquippedItems: (state) => state.equippedItems,
getSelectedItem: (state) => state.selectedItem
}
const mutations = {
changeSelectedItem: (state, newItem) => {
state.selectedItem = newItem;
},
changeEquippedItems: (state, parameters) => {
state.equippedItems[parameters[0]] = parameters[1];
}
}
const actions = {
setSelectedItem({ commit }, index) {
commit('changeSelectedItem', index);
},
setNewEquipment({ commit }, parameters) {
commit('changeEquippedItems', parameters);
}
}
export default {
state,
getters,
actions,
mutations
}
然后我有一个组件根据equippedItems变量设置项目
import { mapGetters, mapActions } from 'vuex';
import Item from '../Item';
export default {
name: 'equipped-items',
components: {
Item
},
props: [],
data() {
return {
chooseHead: false,
}
},
computed: {
...mapGetters(['getEquippedItems', 'getItems', 'getSelectedItem'])
},
methods: {
...mapActions(['setNewEquipment']),
chooseNewHead() {
this.chooseHead = !this.chooseHead;
}
},
watch: {
getSelectedItem: function () {
if (this.chooseHead) {
this.setNewEquipment([0, this.getSelectedItem]);
}
}
}
}
<section class="equipped-items">
<div @click="chooseNewHead" class="head equipSlot">
<Item v-if="getEquippedItems[0]" :passedItem="getEquippedItems[0]" :parent="'equip'"> </Item>
</div>
<div class="body equipSlot">
<Item v-if="getEquippedItems[1]" :passedItem="getEquippedItems[1]"></Item>
</div>
</section>
然后是item组件,它在点击时设置vuex变量selectedItem。
import { mapActions } from 'vuex';
export default {
name: 'Item',
props: ['passedItem', 'parent'],
methods: {
...mapActions(['setSelectedItem']),
selectedItem() {
if (this.parent != 'equip') {
this.setSelectedItem(this.passedItem);
}
}
}
}
页面第一次加载时渲染良好,但不会将新传递的项目更改为项目组件。
提前致谢
【问题讨论】:
-
我看不出点击是如何改变事物的——看起来它只调用了
chooseNewHead,它只是切换了chooseHead的状态? -
在“item”组件中是函数“selectedItem”,它设置vuex变量“selectedItem”。在我的其他组件中,它会监视这些变量的变化并相应地更改装备项变量