Я пытаюсь очистить форму в дочернем компоненте после того, как событие, содержащее введенные данные формы, было успешно передано из дочернего в родительский компонент. Однако я заметил, что форма очищается до того, как данные передаются через событие родительскому компоненту, так что событие передает пустые значения родительскому компоненту. Я попытался отложить clearForm() с помощью тайм-аута, но это не помогло. Есть ли способ изменить поведение таким образом, чтобы функция clearForm() выполнялась только после завершения события и сохранения данных?
Прилагается код.
Дочерний компонент
<template>
<!-- Contains a form -- >
</template>
<script>
export default {
data() {
return {
additionalInfo:
{
id: new Date().toISOString(),
fullName: '',
preAuthorize: '',
serviceAddress: ''
},
validation: {
fullNameIsValid: true,
serviceAddressIsValid: true
},
formIsValid: true,
addServiceButtonText: '+ Add Service Notes (Optional)',
serviceNotes: [],
showServiceNotes: false,
enteredServiceNote: '', //service notes addendum
}
},
computed : {
// something
},
methods: {
setServiceNotes(){
this.showServiceNotes = !this.showServiceNotes;
},
addAnotherParty(){
this.validateForm();
if (!this.formIsValid){
return;
}
this.$emit('add-parties', this.additionalInfo); //event
console.info(this.clearForm);
},
clearForm(){
this.additionalInfo.fullName = '';
this.additionalInfo.serviceAddress = '';
this.additionalInfo.preAuthorize = false;
}
}
}
</script>
Родительский компонент
<template>
<div>
<base-card
ref = "childComponent"
@add-parties = "updateAdditionalInfoList">
<!-- Wrapper for the `Parties Being Served` component-->
<template v-slot:title>
<slot></slot>
</template>
</base-card>
</div>
</template>
<script>
export default {
data() {
return {
hasElement: false,
selectedComponent: 'base-card',
additionalInfoList : [],
clearForm: false
}
},
methods: {
updateAdditionalInfoList(additionalInfo){ //save changes passed via event
this.additionalInfoList.push(additionalInfo);
console.info('emitted');
console.info(this.additionalInfoList);
setTimeout(() => {
this.$refs.childComponent.clearForm(); //clear the form in child
}, 2000);
}
}
}
</script>
Попробуй это
addAnotherParty(){
this.validateForm();
if (!this.formIsValid){
return;
}
let emitObj = JSON.parse(JSON.stringify(this.additionalInfo));
this.$emit('add-parties', emitObj); //event
console.info(this.clearForm);
}
Если ваш объект не глубокий, вы можете использовать
let emitObj = Object.assign({}, this.additionalInfo);
вместо строки и разбора
Вы не можете назначить объект без ссылки в JS. Таким образом, все, что вы изменили в назначенном объекте, будет отражено в переменной, которую вы использовали для назначения. Object.assign создаст неглубокую копию с новой ссылкой только для первой иерархии. но JSON.stringify создаст совершенно новую ссылку, поскольку вы конвертируете в строку.. и проанализируйте другую, вы получите другую ссылку, но как объект. То же самое относится к массиву в JS
Спасибо. Теперь это работает как шарм. Позвольте мне спросить, как использование JSON привело к завершению события до того, как форма будет очищена?