Могут быть рассмотрены следующие решения:
Вариант 1: вывести событие из модального компонента
1) после закрытия модального объекта вывести пользовательское событие в компоненте Modal
:
Modal.vue
<template>
<b-modal id="base_modal" title="Modal example" @hidden="hide" >
<slot name="body"></slot>
<slot name="footer"></slot>
</b-modal>
</template>
<script>
export default {
name: "BaseModal",
methods: {
hide() {
this.$emit('hide')
}
}
};
</script>
2) затем в родительском компоненте при запуске события hide
значения формы можно очистить следующим образом:
App.vue
<template>
<div>
<b-button @click="showModal" ref="btnShow">Open Modal</b-button>
<ModalExample @hide="hideModal">
<div slot="body">
<form @submit.stop.prevent="handleSubmit">
<b-form-input type="text" placeholder="Enter your name" v-model="name"></b-form-input>
</form>
</div>
</ModalExample>
</div>
</template>
<script>
import ModalExample from "./components/ModalExample.vue";
export default {
components: {
ModalExample
},
data() {
return {
name: ""
};
},
methods: {
showModal() {
this.$root.$emit("bv::show::modal", "base_modal");
},
hideModal() {
this.name = ''; //clear form values
}
}
};
</script>
Вот демонстрационная версия , которая демонстрирует этот подход.
Вариант 2: использовать слоты с областью действия
Модальный компонент может получить доступ к данным через слоты с областью действия :
ModalExample.vue
<template>
<b-modal id="base_modal" title="Modal example" @hidden="hide" >
<slot :formData="formData" name="body"></slot>
<slot name="footer"></slot>
</b-modal>
</template>
<script>
export default {
name: "ModalExample",
data() {
return {
formData : {}
}
},
methods: {
hide() {
//clear form fields
for (const name of Object.keys(this.formData)) {
this.formData[name] = ""
}
}
}
};
</script>
App.vue
<template>
<div>
<b-button @click="showModal" ref="btnShow">Open Modal</b-button>
<ModalExample @hide="hideModal">
<template slot="body" slot-scope="{formData}">
<form @submit.stop.prevent="handleSubmit">
<b-form-input
type="text"
placeholder="Enter your first name"
v-model="formData.firstname"
></b-form-input>
<b-form-input
type="text"
placeholder="Enter your last name"
v-model="formData.lastname"
></b-form-input>
</form>
</template>
</ModalExample>
</div>
</template>
<script>
import ModalExample from "./components/ModalExample.vue";
export default {
components: {
ModalExample
},
data() {
return {
};
},
methods: {
showModal() {
this.$root.$emit("bv::show::modal", "base_modal");
}
}
};
</script>