169 похожих чатов

Как в динамических асинхронных компонентах дожидаться полного монтирования компонента? button @click="setComponent" component

:is="componentName"

components: {
'MyComponent' => import('./MyComponent')
}

setComponent(){
this.componentName = 'MyComponent'
// и вот тут я хочу вызвать метод компонета через ref, но компонент с тому времени не загрузился или не смонтировался
// помогает только this.nextTick
this.$refs.MyComponent.method()
}

32 ответов

4 просмотра

грязный подход сам по себе, дергать через реф

RusaXXX
вопрос не в этом

только nextTick - грязному подходу грязное решение

Denis Strokov
только nextTick - грязному подходу грязное решение

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

Andrey Mishagin
Почему?

потому, что $ref для индивидуальных случаев работы напрямую с dom елментами, а не для вызова методов из дочерних

Andrey Mishagin
Почему?

С асинхронными компонентами нарушается последовательность жизненного цикла ребенок - родитель. Когда родитель смаунтился - ребенок мог еще даже не начать. По этой причине, если это прям критично, можно в маунте ребенка эмтить событие в родителя, в этом родителе по рефу дергать ребенка и выполнять нужный код

Andrey Mishagin
Почему?

Попробуй во все хуки проставить консоль логи, и вызвать сначала синхронно компонент, потом асинхронно. И увидеть разницу. При чем лучше дернуть задержку какую-нибудь

Сергей Миртов
Попробуй во все хуки проставить консоль логи, и вы...

Я ни разу асинхронные компоненты не создавал даже и не знаю зачем. Надо бы восполнить этот пробел)

RusaXXX- Автор вопроса
Denis Strokov
только nextTick - грязному подходу грязное решение

не очень понимаю как тогда правильно вызывать методы компонентов? Менять пропсы? Но иногода вот просто нечего менять. Придумать асбстрактную переменную, повесить на нее вотч и вызывать метод?

RusaXXX
не очень понимаю как тогда правильно вызывать мето...

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

RusaXXX- Автор вопроса
Сергей Миртов
Например так. Можно еще через ивентбас, можно чере...

ивент бас это тоже нарушение нормального потока

RusaXXX
ивент бас это тоже нарушение нормального потока

Ну так это решение, для вашего нарушения)

RusaXXX
не очень понимаю как тогда правильно вызывать мето...

через обмен событиями, не обязательно же делать вызов напрямую у функции: можно повесить слушателя на событие

Denis Strokov
через обмен событиями, не обязательно же делать вы...

Я так понимаю речь про ивент бас?) или прокинуть пропсом объект по ссылке, способного эмитить?

RusaXXX
а можно пример?

в дочернем пишем this.$emit('myEvent', eventProps) в родителе пишем <component @v-on:myEvent="handlerFn" />

RusaXXX- Автор вопроса
Denis Strokov
в дочернем пишем this.$emit('myEvent', eventProps)...

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

RusaXXX
вы понимаете что при таком подходе, как бы моодуль...

Ну вы и так жестко связали модуль с родителем нарушив инкапсуляцию

тебе выше конечно уже сказали, о еще раз повторю - это ОЧЕНЬ плохое поведение, антипаттерн и вообще)

RusaXXX
вы понимаете что при таком подходе, как бы моодуль...

нормальный поток событий - от ребенка к родителю. нормальный поток данных - от родителя к ребенку. В случае если нужно прокинуть событие между компонентами, которые не ребенок родитель можно использовать ивентбас. Но сама нужда такой штуковины - не совсем корректна

RusaXXX- Автор вопроса
Сергей Миртов
нормальный поток событий - от ребенка к родителю. ...

То есть в моем случае заменить все прямые вызовы на евент бас?

RusaXXX
То есть в моем случае заменить все прямые вызовы н...

ивент бас примерно так же плох как и вызов метода родителя

RusaXXX
))))

что делает метод ребенка?

а хотя подожди, тут же ты дергаешь ребенка, а не родителя. тогда в принципе всё не так плохо. так делать можно, но не часто желательно

RusaXXX- Автор вопроса
Сергей Миртов
что делает метод ребенка?

да по разному, так в двух словах и не опишешь

RusaXXX- Автор вопроса
RusaXXX
да по разному, так в двух словах и не опишешь

То есть если я удалю этот компонент, то и метод должен исчезнуть

RusaXXX- Автор вопроса
Vladimir Voytenko ️
а хотя подожди, тут же ты дергаешь ребенка, а не р...

именно, но типа прямой вызов это не гуд тоже, как я понял

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Доброе время суток! у меня тут иноды закончились. и понял почему по сути кстит, я периодически очищаю постгрес и сентри контайнер: postgres=# DELETE FROM nodestore_node WHER...
Юсиф Насиров
9
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
lazarus-3.2.0/gtk, linux патч "имя проекта по умолчанию project1 -> prj" день добрый не нравится "именя проекта по умолчанию" (project1), к.раз приходится переименовывать (н...
livontiy
5
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Can I forward ports (including the SSH port) between two machines without SSH? I know I can forward SSH server port from machine A (which blocks all requests by firewall) to ...
required optional
5
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
Карта сайта