Kontekst
W Vue 2.0 dokumentacja i inne jasno wskazują, że komunikacja od rodzica do dziecka odbywa się za pośrednictwem rekwizytów.
Pytanie
W jaki sposób rodzic może powiedzieć swojemu dziecku, że zdarzenie miało miejsce za pomocą rekwizytów?
Czy powinienem po prostu obejrzeć rekwizyt zwany wydarzeniem? To nie wydaje się właściwe, podobnie jak alternatywy ( $emit
/ $on
jest dla dziecka do rodzica, a model piasty jest dla odległych elementów).
Przykład
Mam kontener nadrzędny i musi on powiedzieć swojemu kontenerowi podrzędnemu, że można wykonywać określone czynności w interfejsie API. Muszę mieć możliwość wyzwalania funkcji.
źródło
ref
zamiast tworzyć rekwizytu, który obserwuje jego wartość, a następnie emituje go do innej funkcji w rodzicu? Mam na myśli to, że ma wiele rzeczy do zrobienia, ale czy używanie jestref
nawet bezpieczne? Dziękiref
jest bezpieczny. Generalnie jest to odradzane, ponieważ społeczność Vue woli przekazywać stan dzieciom, a zdarzenia z powrotem rodzicom. Ogólnie rzecz biorąc, prowadzi to do bardziej odizolowanych, wewnętrznie spójnych komponentów (dobra rzecz ™). Ale jeśli informacja, którą przekazujesz dziecku, naprawdę jest zdarzeniem (lub poleceniem), modyfikowanie stanu nie jest właściwym wzorcem. W takim przypadku wywołanie metody przy użyciu aref
jest całkowicie w porządku i nie spowoduje awarii ani nic takiego.To, co opisujesz, to zmiana stanu rodzica. Przekazujesz to dziecku przez rekwizyt. Jak zasugerowałeś, zrobiłbyś
watch
ten rekwizyt. Kiedy dziecko podejmuje działanie, powiadamia o tym rodzica za pomocąemit
, a rodzic może wtedy ponownie zmienić stan.Pokaż fragment kodu
Jeśli naprawdę chcesz przekazać zdarzenia dziecku, możesz to zrobić, tworząc autobus (który jest tylko instancją Vue) i przekazując go dziecku jako rekwizyt .
źródło
v-model
na komponencie, możesz również łatwo zresetować wartość, emitując odpowiednie zdarzenie z mniejszą ilością kodu.prop
w dziecku ekstra, w domu dodatkową nieruchomośćdata
, potem dodaćwatch
... Byłoby wygodnie, gdyby było wbudowane wsparcie, które w jakiś sposób przenosi zdarzenia z rodzica na dziecko. Taka sytuacja występuje dość często.Możesz użyć
$emit
i$on
. Używając kodu @RoyJ:html:
javascript:
Uruchomiony przykład: https://jsfiddle.net/rjurado/m2spy60r/1/
źródło
Jeśli masz czas, użyj sklepu Vuex do bezpośredniego oglądania zmiennych (czyli stanu) lub wyzwalania (czyli wysyłania) akcji.
źródło
Nie podobało mi się podejście z magistralą zdarzeń używające
$on
powiązań w dziecku podczascreate
. Czemu? Kolejnecreate
wywołania (których używamvue-router
) wiążą program obsługi wiadomości więcej niż raz - prowadząc do wielu odpowiedzi na wiadomość.Nieco lepiej sprawdziło się ortodoksyjne rozwiązanie polegające na przekazywaniu rekwizytów z rodzica na dziecko i umieszczaniu w nim strażnika mienia . Jedynym problemem jest to, że dziecko może działać tylko przy zmianie wartości. Wielokrotne przekazywanie tej samej wiadomości wymaga pewnego rodzaju księgowości, aby wymusić przejście, aby dziecko mogło odebrać zmianę.
Odkryłem, że jeśli zawiniemy wiadomość w tablicę, zawsze wyzwoli to obserwator dziecka - nawet jeśli wartość pozostanie taka sama.
Rodzic:
Dziecko:
HTML:
źródło
Prostym sposobem na wywołanie metod na komponentach potomnych jest wyemitowanie procedury obsługi od dziecka, a następnie wywołanie jej z rodzica.
Rodzic śledzi funkcje obsługi dziecka i wywołania, gdy jest to konieczne.
źródło
Poniższy przykład nie wymaga wyjaśnień. gdzie odwołania i zdarzenia mogą być używane do wywoływania funkcji od i do rodzica i dziecka.
źródło
Myślę, że powinniśmy wziąć pod uwagę konieczność stosowania przez rodzica metod dziecka. W rzeczywistości rodzice nie muszą zwracać uwagi na metodę dziecka, ale mogą traktować element potomny jako FSA (skończoną maszynę stanową). do kontrolowania stanu składnika potomnego, więc wystarczy obserwować zmianę stanu lub po prostu użyć funkcji obliczeniowej
źródło
możesz użyć klucza, aby przeładować komponent potomny za pomocą klucza
Jeśli chcesz przeładować komponent z nowym filtrem, kliknij przycisk, przefiltruj komponent potomny
i użyj filtru, aby wywołać funkcję
źródło