Managing which bootstrap-vue modal is open through vuex state
我正在构建一个需要对多个bootstrap-vue模态进行排序的应用程序。具体来说,嵌套组件中的按钮应打开"管理"模式。 '管理'模态包含按钮,单击后应关闭'管理'模态并打开另一个模态(例如'编辑','添加','完成'等)。
我不想上下传递道具/发射事件,以便可以从不同的嵌套组件中触发这些事件,我想在我的商店中找到一个值,
问题:如果状态值发生更改,如何在我的主应用程序页面中创建一组渲染模式?
我的主应用程序将如下所示:
1 2 3 4 5 6 | <template> <b-modal id="modal1" /> <b-modal id="modal2" /> <b-modal id="modal3" /> </template> |
例如当
我尝试创建一个计算变量" showModal1",当
中匹配的存储中的值(当存储中的值更改时,显然计算出的值会触发两次?)
任何帮助都会很棒!
您可以为每个模态的可见性创建一个计算属性,例如:
1 2 3 4 5 | computed: { modal1Visible() { return this.$store.state.activeModal === 'modal1'; } } |
然后设置b-modal的
1 | <b-modal :visible="modal1Visible" id="modal1"> |
要处理关闭模态,可以将
1 2 3 4 | <b-modal :visible="modal1Visible" @hide="$store.commit('activeModalSet', null)" id="modal1" </b-modal> |
这意味着如果通过
尽管不是bootstrap-vue,但我们已经通过简单的
使用Vuex,您可以为activeModal具有计算属性,而对于
$('#' + this.modalId).on('hide.bs.modal', () => {
this.$emit('closeModal')
//this would set the v-if in parent Component to false, un-rendering the modal component
})
我建议您在观察器中使用
1 2 3 4 5 6 7 | <template> <b-modal ref="modal1" id="modal1"></b-modal> <b-modal ref="modal2" id="modal2"></b-modal> <b-modal ref="modal3" id="modal3"></b-modal> </template> |
不要关注mapGetters,您必须注意商店的getters / state。假设在这里activeModal是您的状态值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | computed : { ...mapGetters([ 'activeModal' ]) }, watch : { activeModal(newActiveModal, oldActiveModal) { // If an old value was setted, we want to hide it in anyway. if (oldActiveModal) this.$refs[oldActiveModal].hide() // If the new value is falsy, do nothing if (!newActiveModal) return this.$refs[newActiveModal].show() } } |