Нашел способ, как реализовать это через v2, благодаря этой публикации .
gleam ответ короче и чище, поэтому вы должны предпочесть его решение,Мое решение ниже опубликовано только для образовательных целей.
state.js
modalTextSummary = {}
doSave = false
action.js
// My 'store' file is at the root. Where is yours - I do not know :)
import store from '@/store'
async myAction ({ state }) {
state.doSave = false
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. Wait until user closes modal or clicks OK
const unwatch = store.watch(
(state) => state.doSave,
(value) => {
// #5. Apply changes
if (value === true) {
unwatch()
// ... code which handles data from data[1-5]
} else if (value === 'unwatch') {
unwatch()
}
}
)
}
Зачем нам нужно unwatch()
?
В моем случае myAction
вызывается "someButton" (имя примера) и в результате открывается модально.Если мы открываем / закрываем модальные 5 раз без нажатия кнопки ОК, мы будем смотреть state.doSave
также 5 раз, и когда после 6-го открытия будет нажата кнопка ОК, data[1-5]
будет обработано 6 раз.Таким образом, если модальное окно закрыто без нажатия кнопки ОК, нам нужно отменить state.doSave
.
myModalComponent.js
<template>
<b-modal
ref="myModal"
ok-title="OK"
cancel-title="Close"
@keydown.native.enter="closeModalAndSave"
@ok="closeModalAndSave"
@hide="closeModalAndUnwatch"
>
{{ modalTextSummary }}
</b-modal>
</template>
<script>
import { mapState, mapMutations } from 'vuex'
export default {
computed: {
...mapState([
'modalTextSummary'
])
},
watch: {
modalTextSummary: function () {
if (this.modalTextSummary !== {}) {
this.$refs.myModal.show()
}
}
},
methods: {
...mapMutations('media', [
'doSave'
]),
closeModalAndUnwatch (bvEvent) {
// "this.$refs.myModal.hide()" fires @hide with "bvEvent.trigger === null".
// We need to 'unwatch' just when bvEvent.trigger === 'cancel' or 'backdrop',
// or 'header-close', ie not null.
if (bvEvent.trigger !== null) {
this.doSave('unwatch')
}
},
closeModalAndSave () {
this.doSave(true)
this.$refs.myModal.hide()
}
} // End of "methods"
}
</script>