Выдать событие, подождать, а затем выдать другое в Vue

#javascript #vue.js #emit #prop

#javascript #vue.js #выдать #prop

Вопрос:

У меня есть следующие события, которые передаются родительскому компоненту и работают нормально:

 this.$emit('sendToParent1', true);
this.$emit('sendToParent2');
this.$emit('sendToParent3');
this.$emit('sendToParent4', true);
this.$emit('sendToParent5', false);
 

Однако я столкнулся с конкретной проблемой, которая требует, чтобы я испустил эти 5 событий в таком порядке, но одно за другим.

 //emit this first and wait until the parent has finished what its supposed to do
this.$emit('sendToParent1');
//after the parent is done, we emit the next one from the child
this.$emit('sendToParent2');
//same behavior, once it is emitted to parent and the parent finishes executing, then we emit the next one...
this.$emit('sendToParent3');
//again
this.$emit('sendToParent4', true);
//and again
this.$emit('sendToParent5', false);
 

Я считаю, что лучший подход заключается в том, чтобы prop определял, когда событие завершило выполнение того, что оно должно было делать, а затем отправлял prop дочернему элементу, затем, когда этот prop обновляется, выполняется следующий emit и так далее, и так далее. Может ли кто-нибудь указать мне наилучшее направление, как решить эту проблему?

Родительский элемент имеет следующий компонент:

 <component v-on:sendToParent5="parentFunctionFive" v-on:sendToParent4="parentFunctionFour" v-on:sendToParent1="parentFunctionOne" v-on:sendToParent2="parentFunctionTwo" v-on:sendToParent3="parentFunctionThree"></component>
 

Родительский элемент имеет следующие методы:

          parentFunctionOne: function() {
                axios.get('/api/do_something-1/')
                .then((res)=>{
                    this.something1 = res.data;
                })
                .catch((error)=>{
                    console.log(error);
                });
            },

         parentFunctionTwo: function() {
                axios.get('/api/do_something-2/')
                .then((res)=>{
                    this.something2 = res.data;
                })
                .catch((error)=>{
                    console.log(error);
                });
            },

           parentFunctionThree: function() {
                axios.get('/api/do_something-3/')
                .then((res)=>{
                    this.something3 = res.data;
                })
                .catch((error)=>{
                    console.log(error);
                });
            },

       parentFunctionFour: function(passed_value) {
            //changing the value of a variable in data
            this.trueOrFalse = passed_value;
        },
        parentFunctionFive: function(passed_value) {
             //changing the value of a variable in data
            this.valuePassed = passed_value;
        }
 

Комментарии:

1. В соответствующей заметке документы Vue 2 рекомендуют всегда использовать регистр kebab для имен событий

Ответ №1:

Нам было бы легче ответить, если бы вы объяснили, какова ваша конечная цель (см. Проблему XY), но из предоставленной вами информации я думаю, что правильным способом было бы передать функцию, вызываемую next как параметр события, и запустить ее, когда работа будет выполнена, что позволит продолжить процесс до конца.следующий этап.

 this.$emit('sendToParent1', {
 value: true,
 next: 
  () => this.$emit('sendToParent2', {
       value: false,
       next: () => this.$emit('sendToParent3', false);
     })
});
 
 parentFunctionOne: function({value, next}) {
  axios.get('/api/do_something-1/')
    .then((res)=>{
        this.something1 = res.data;
        next() // proceed
    })
    .catch((error)=>{
        console.log(error);
    });
},

parentFunctionTwo: function({value, next}) {
  axios.get('/api/do_something-2/')
    .then((res)=>{
        this.something2 = res.data;
        next() // proceed
    })
    .catch((error)=>{
        console.log(error);
    });
},

parentFunctionThree: function() {
  axios.get('/api/do_something-3/')
    .then((res)=>{
        this.something3 = res.data;
    })
    .catch((error)=>{
        console.log(error);
    });
},
 

Ответ №2:

вам следует переосмыслить способ реализации компонента, я думаю, вы могли бы попробовать выдать одно событие со всей необходимой информацией и в родительском вызове соответствующей функции.

если вы хотите реализовать это таким образом, вы могли бы использовать переменную, которую вы отправляете с событием, и увеличивать ее каждый раз, когда произошло событие, а в родительском отслеживаете эту переменную и выполняете событие в правильном порядке, как в протоколе http

Комментарии:

1. Я согласен с концепцией выдачи одного события, но не уверен в увеличении переменной. Моей альтернативой было бы отправить всю необходимую информацию в полезной нагрузке одного события, если она известна, а затем иметь логику в родительском методе для цепочки ваших вызовов axios по мере необходимости.

2. конечно, одно событие с подходом полезной нагрузки было бы проще и лучше, но я сказал во втором подходе, если вы хотите использовать несколько источников.