2015-10-07 22 views
7

Ho un'app di GUI basata su react/redux. Come parte della vista c'è un "indicatore" che reagisce alla componente che vorrei lampeggiare, e il lampeggio è fatto con un'animazione CSS3 (frame di animazione). La funzione membro indicator.blink() del componente react viene richiamata per far lampeggiare l'indicatore (in pratica rimuove la classe blink dall'elemento DOM, quindi la aggiunge nuovamente 1ms più tardi, come un trucco per aggirare il fatto che non vi è alcuna "riavvio" api per un'animazione CSS3).Come passare l'evento da Redux a Reagire?

In determinate azioni che si verificano nel framework di ridiffusione (possono essere dei thunk se necessario), desidero chiamare questa funzione blink() nella vista di risposta. Il modo migliore per farlo?

E non mi sembra giusto per avere l'azione Redux modificare lo stato applicazione, quindi l'indicatore di elemento si legano ad una delle variabili di stato come prop, dato che non è in realtà uno stato, ma un evento istantaneo. Ma non conosco altro modo per ottenere un'azione di ridondanza per cambiare un componente che reagisce.

risposta

1

Immaginare le transizioni CSS sono dettagli di implementazione e non si espongono i metodi sui componenti. (Di solito non dovresti comunque.)

Come sarebbe guidato solo dai puntelli? Immagino da un puntello booleano isBlinking. Questo è ciò che puoi mantenere in stato Redux se lo desideri. Avere un creatore di azioni che invia START_BLINK e STOP_BLINK dopo alcuni millisecondi.

Oppure è possibile evitare l'utilizzo di Redux per questo e chiamare imperativamente il metodo dal componente principale.

+0

E se ci fosse una tale animazione di "riavvio" nei CSS3? In tale scenario, non ci sarebbe bisogno di un 'STOP_BLINK', e l'impostazione ripetuta di' isBlinking' su 'true' non direbbe nulla al componente React in modo che possa agire e riavviare l'animazione. Fondamentalmente, sto cercando di trovare un caso d'uso in cui un'azione di Redux deve inviare un evento alla vista React, in cui lo stato di modifica non ha senso perché l'elemento è "senza tempo" (cioè un evento). Sto pensando l'impossibile/improbabile? – gbmhunter

+1

Se si dispone di questa situazione, è necessario aggirare il flusso di Redux e React e farlo in modo imperativo. Non proprio correlato a Redux. Esegui un effetto imperativo nel punto in cui spari l'azione. –

+0

Un effetto imperativo? È questo un modo di comunicare da un'azione Redux a un componente React?Ho dato un'occhiata a ottenere l'accesso ai componenti React dall'interno di un'azione, ma non sembrava facile (cioè salvando ciò che 'React.render()' restituisce a una variabile globale, e quindi usando una funzione di utilità di test React per scavare un componente figlio). – gbmhunter

2

Supponiamo di voler usare la cosa blink da mostrare quando qualcosa aumenta, puoi semplicemente tenere un contatore nel tuo stato e nello stato interno del tuo componente mantenere il valore precedente. Quando cambia, blink e salva il nuovo valore.

In altre parole, ricava le informazioni sull'evento desiderate dai cambiamenti di stato che ti interessano.

È assolutamente corretto utilizzare lo stato interno per questo tipo di comportamento transitorio, ovvero a cosa serve.

+0

Ciò ha perfettamente senso quando aumenta qualcosa. Per prima cosa ho pensato che questo non si applicava al mio scenario, ma dopo aver letto "le informazioni sugli eventi desiderati dai cambiamenti di stato che ti interessano" ho capito che un contatore si adattava a questo scopo. – gbmhunter

0

Non c'è "riavvio" nell'animazione CSS, ma è possibile specificare il conteggio di iterazione per infinite, che sembra risolvere il problema senza coinvolgere Redux, tranne che attivare o disattivare la classe .blinking a seconda di di voi volete che lampeggi o no.

@keyframes blink { 
    0% { opacity: 0; } 
    50% { opacity: 1} 
    100% { opacity: 0; } 
} 
.blinking{ 
    animation-name: blink; 
    animation-duration: 1s; 
    animation-iteration-count:infinite; 
} 
Problemi correlati