VueJS — запустить код после успешного создания события

Я пытаюсь очистить форму в дочернем компоненте после того, как событие, содержащее введенные данные формы, было успешно передано из дочернего в родительский компонент. Однако я заметил, что форма очищается до того, как данные передаются через событие родительскому компоненту, так что событие передает пустые значения родительскому компоненту. Я попытался отложить 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>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
282
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это

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);

вместо строки и разбора

Спасибо. Теперь это работает как шарм. Позвольте мне спросить, как использование JSON привело к завершению события до того, как форма будет очищена?

yuniktmr 23.12.2020 19:42

Вы не можете назначить объект без ссылки в JS. Таким образом, все, что вы изменили в назначенном объекте, будет отражено в переменной, которую вы использовали для назначения. Object.assign создаст неглубокую копию с новой ссылкой только для первой иерархии. но JSON.stringify создаст совершенно новую ссылку, поскольку вы конвертируете в строку.. и проанализируйте другую, вы получите другую ссылку, но как объект. То же самое относится к массиву в JS

Saravanan 25.12.2020 07:50

Другие вопросы по теме