Tit*_*ter 7 javascript bootstrap-4 vuex vuejs2 bootstrap-vue
算法:
data[1-5]someDataToShowInModal.问题:如何等到用户点击模态的 OK 或 CANCEL 按钮?
在代码中我展示了两种可能的解决方案,但不知道如何实现它们:
将模态包装到 Promise 中。
使用state.doSave并以某种方式等到它被更改myModalComponent。
如果用户单击“确定”,则应用更改。
下面是伪代码,显示了我尝试实现的逻辑:
状态.js
modalTextSummary = {}
Run Code Online (Sandbox Code Playgroud)
动作.js
async myAction ({ state }) {
let modalClosed
let someDataToShowInModal = {}
let data1 = []
let data2 = []
let data3 = []
let data4 = []
let data5 = []
// #1. Push difference to "data[1-5]"
data1.push(xyz1)
data2.push(xyz2)
data3.push(xyz3)
data4.push(xyz4)
data5.push(xyz5)
// #2. Based on data[1-5] prepare "someDataToShowInModal"
someDataToShowInModal = {xyz}
// #3. We change "state.modalTextSummary" and by this we open
// a Modal (because "myModalCompont" has "watch: {modalTextSummary}")
state.modalTextSummary = someDataToShowInModal
// #4. HOW TO WAIT UNTIL USER CLICKS Modal's "OK" or "CANCEL"?
// v1:
// something like...
modalClosed = await myModalComponent
// v2:
// I can add "state.doSave = ''" which can be
// set by "myModalComponent" to either 'OK' or 'CANCEL', but how
// in this case I can wait for state changes?
modalClosed = await state.doSave !== ''
// #5. Apply changes
if (modalCloses === 'OK') {
// ... code which handles data from data[1-5]
}
}
Run Code Online (Sandbox Code Playgroud)
myModalComponent.js
<script>
import { mapState } from 'vuex'
export default {
computed: {
...mapState([
'modalTextSummary'
])
},
watch: {
modalTextSummary: function () {
if (this.modalTextSummary !== {}) {
// Here I show bootstrap-vue modal
}
}
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
我知道如何在通过 OK 按钮关闭模态后调用函数,但在这种情况下,有必要在 vuex 中临时保存数据 [1-5] 以便在被调用的函数中再次选择它们,我想避免它使用更简单的方法。
小智 5
我想为您提供一些重构:)
1) Store 的操作不应该知道接口(服务器端渲染问题,...) - 不好的做法。
2) modal 的数据最好存放在 modal 的父组件中。这是一个例子:https : //jsfiddle.net/yyx990803/70yyx8z2/
然后你就可以做这样的事情(伪代码):
<my-modal
v-if="showModal"
@cancel="processModalCancel"
@submit="processModalSubmit"
>
<!-- mutating-manipulations with modalData -->
</my-modal>
---
openModal() {
this.showModal = true;
this.modalData = store.dispatch('prepareDataToShowInModal'); // myAction, first part
},
processModalCancel() {
this.showModal = false;
this.modalData = null;
},
processModalSubmit() {
this.showModal = false;
store.dispatch('saveModalData', this.modalData); // myAction, second part
this.modalData = null;
},
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4323 次 |
| 最近记录: |