<div v-for="(photon, key) in $store.state.notConnected" v-bind:key="key">
<div v-if="!photon.connected">
<p>Photon is not Connected</p>
</div>
<div v-if="photon.connected">
<p>Photon is Connected</p>
<b-btn v-on:click="showNewSetup(photon)>Setup</b-btn>
</div>
<div v-if="photon.showSetup">Setup Page</div>
</div>
Store.js
export const store = new Vuex.store({
state:{
notConnected:{}
},
mutations:{
setDevices(state,value){
value.data.forEach(ele =>{
state.notConnected[ele.id]={}
state.notConnected[ele.id].showSetup=false
state.notConnected[ele.id].connected=ele.connected
}
},
SHOWNEWSETUP(state,value){
state.notConnected[value.id].showSetup=true
}}
actions:{
async getDevices(context){
let devices = await axios.get('http:10.10.10.1:3000/api')
context.commit('setDevices',devices)
}
}
})
我正在更改vuex存储中的状态,但v-if不能反映更新后的状态。当我打开vue开发工具时,我看到突变发生了,并且可以看到状态发生了变化,但是设置页面div没有更新。
注意:如果我转到其他路线,然后返回页面,则组件会更新
答案 0 :(得分:1)
Vue没有机会检测阵列中的更改(具有代理支持的vue3除外)。
这就是为什么您应该将突变更改为:
SHOWNEWSETUP(state,value){
Vue.set(state.notConnected, value.id, {showSetup=true})
}
通过这种方式,Vue的反应性系统将获得有关更改的通知,并且一切都会按预期进行。
答案 1 :(得分:1)
尝试在组件中使用计算属性,而不是直接指向状态:
<template>
<div v-for="(photon, key) in photons v-bind:key="key">
<div v-if="!photon.connected">
<p>Photon is not Connected</p>
</div>
<div v-if="photon.connected">
<p>Photon is Connected</p>
<b-btn v-on:click="showNewSetup(photon)>Setup</b-btn>
</div>
<div v-if="photon.showSetup">Setup Page</div>
</div>
</template>
<script>
computed: {
photons() {
return this.$store.state.notConnected
},
}
</script>