Sto esplorando vue.js e ho una domanda su come un determinato problema può essere risolto.VueJS collega componenti non collegati (come genitore/figlio)
mio componente principale ha la seguente configurazione:
<div class="container">
<div class="stage">
<map :current-time="currentTime" :recording="recording"></map>
<player :track="track" :current-time="currentTime"></player>
</div>
<control-panel :current-time="currentTime"></control-panel>
</div>
In sostanza, <player>
componente ha <video>
elemento interno che caricherà la traccia specificata (con controlli nativi nascosti). In quanto tale, in realtà controllerà lo stato dell'applicazione durante la riproduzione del video (ora corrente, stato di riproduzione, ecc.). Tuttavia, <control-panel>
ha una barra di scorrimento e pulsanti che dettano lo stato del video (riproduzione/pausa, ricerca). Ovviamente, l'alterazione di questo stato generale in uno dei componenti influenzerà gli altri due componenti (la mappa avanza anche in base all'ora corrente).
Tuttavia, mi chiedo se sarebbe più sensato e se Vue supporta fornendo i riferimenti ai componenti in modo da poter fornire <control-panel>
con un riferimento a <player>
in modo che potesse prendere i cambiamenti di stato direttamente da esso.
O questo dovrebbe essere fatto in una sorta di trasmissione a livello globale o trasmissione di eventi? Prima di essere corretto, considera un esempio in cui ci sono due <player>
se due <control-panel>
s che non sono correlati gerarchicamente, ma un pannelloA funziona con playerA e panelB con playerB. In questo caso, penso che l'opzione di trasmissione cada dal tavolo, giusto?
Tutti i suggerimenti sono benvenuti soprattutto perché sto solo imparando Vue.
Update 1
Così, dopo aver ottenuto un po 'più familiarità con Vue e sentire di nuovo da parte della comunità, penso che è venuta in mente una soluzione intelligente per la sincronizzazione e <player>
<control-panel>
insieme. I miei markup modifiche al seguente:
<div class="container">
<div class="stage">
<map :current-time="currentTime" :recording="recording"></map>
<player :track="track" :current-time="currentTime" v-ref:player></player>
</div>
<control-panel :current-time="currentTime" v-ref:player-controls :player="$refs.player"></control-panel>
</div>
Avviso l'aggiunta di v-ref
attributi per <player>
e <control-panel>
nonché :player="$refs.player"
attributo in quest'ultimo. Questo mi consente di legare logicamente l'uno all'altro. Nella mia testa, ha senso per il pannello di controllo sapere chi o cosa sta controllando. Ho intenzione di testarlo ulteriormente ma, per ora, questo sembra funzionare.
Come legare insieme <map>
, finirò per utilizzare la trasmissione o semplicemente a due vie currentTime
aggiornato da <control-panel>
. Aggiornerò questo post mentre vado e contrassegnerò la risposta corretta o pubblicherò la mia, se diversa da una qualsiasi delle risposte.
Aggiornamento 2
Leggi la mia risposta qui sotto. Sono stato in grado di risolvere il problema con successo utilizzando l'approccio seguente.
'$ broadcasting' e' $ dispatching' potrebbero ancora funzionare con più giocatori passando id ai componenti tramite 'props' –
Il problema con questo approccio è che il giocatore e il controllo richiederebbero l'id affinché funzionino. Tuttavia, sono componenti potenzialmente indipendenti. Se li implemento in questo modo, la generazione di un componente giocatore richiede al genitore di fornirgli un id (perché quell'id dovrebbe essere fornito a entrambi, in modo che sappiano quali messaggi filtrare). Questo è generalmente un problema con tutti i framework MVVM? Voglio dire, mi piace poter fare questo binding dinamico e roba, ma a volte ho bisogno di un controllo completamente manuale e sembra che non sia così semplice mixare Vue o React con JS. – Vadym