Recentemente, ho integrato Material Design Lite nella mia applicazione web React. Per la maggior parte, tutto ha funzionato bene, ma attualmente sto avendo alcuni problemi con la gestione degli eventi di React, che non sembra funzionare bene con alcuni componenti MDL.Material Design Lite + React - Problemi con i tooltip
In particolare, ho un elemento DOM con un gestore onClick
, che funziona perfettamente bene, fino a quando non viene aggiunto un suggerimento MDL, il che fa sì che onClick
non si attivi più. Ho provato praticamente ogni variazione possibile (metti il tooltip da qualche altra parte nel DOM, allega il gestore onClick
a un contenitore div che ha il tooltip come un bambino, ecc.) E non riesco proprio a farlo funzionare .
Ecco un JSBin che dimostra la questione (Ho anche incluso un esempio che utilizza jQuery per associare un gestore di scegliere l'elemento dopo i monti dei componenti, che in realtà fa il lavoro):
http://jsbin.com/sewimi/3/edit?js,output
Ho alcune teorie sul motivo per cui questo non funziona, ma non ne so abbastanza su React o MDL per verificare nessuno di loro.
Credo che abbia qualcosa a che fare con il modo in cui React gestisce gli eventi e, per qualche motivo, MDL sembra essere in conflitto con esso. Da documentation:
React in realtà non associa gestori di eventi ai nodi stessi. All'avvio di React, inizia l'ascolto di tutti gli eventi al livello superiore utilizzando un singolo listener di eventi. Quando un componente viene montato o smontato , i gestori eventi vengono semplicemente aggiunti o rimossi da un mapping interno . Quando si verifica un evento, React sa come inviarlo usando questa mappatura. Quando non ci sono gestori di eventi a sinistra nella mappatura , di Reagire gestori di eventi sono semplici no-ops
Questo fa sembrare come MDL potrebbe essere scherzi con del Reagire mappatura interna di eventi, che provoca il mio clic sull'elemento per diventare un non-op. Ma ancora una volta, questa è solo una supposizione completa.
Qualcuno ha qualche idea al riguardo? Preferirei non dover associare manualmente un listener di eventi in componentDidMount
per ciascuno dei miei componenti che utilizzano i comandi MDL (come ho fatto nell'esempio JSBin fornito), ma questa è la soluzione che sto per fare ora.
Inoltre, poiché non ero sicuro che si trattasse di un bug specifico MDL, ho scelto di pubblicare questa domanda qui invece che sulla loro pagina issues. Se qualcuno pensa che dovrei postarlo anche lì, fammi sapere, e posso farlo.
Grazie!
Interessante, i miei elementi di 'mdl-menu' sembrano funzionare bene. Grazie per il collegamento, lo proverò appena ne avrò l'occasione. –
Inoltre, sembra che ci sia un bug con JSBin che a volte lo fa non caricare nulla tranne la libreria react sul lato html. Se lo apri in una finestra di navigazione in incognito in Chrome (o l'equivalente in qualsiasi altro browser), funzionerà. –
Se hai onClicks sul livello di lavoro 'mdl-menu' funziona davvero. Ma se vuoi catturare onClicks per mdl-menu_item e non chiudere il menu dopo un clic, ho bisogno di interrompere la propagazione nativa prima di mdl chiamando il suo metodo di menu close – enjoylife