2015-08-13 7 views
17

Ich versuche, MDL für ein vorhandenes Projekt, das React verwendet, zu verwenden, und ich stehe auf mehrere Probleme. Die Dinge scheinen auf den ersten Last in Ordnung, obwohl es viele Warnmeldungen sind:Verwenden von Material Design Lite mit React

Warning: ReactMount: Root element has been removed from its original container. New container:

Das für jedes DOM-Element ziemlich viel passiert, die eine Klasse von MDL (Beispiele erkannt hat: mdl-Layout, mdl-layout__content usw.) und es passiert bei DOM-Änderungen.

Wenn ferner Routen zu ändern, gibt es eine „Invariation Verletzung“ Fehler:

Uncaught Error: Invariant Violation: findComponentRoot(..., .0.2.0.1.1.0.0.0.0): Unable to find element. This probably means the DOM was unexpectedly mutated (e.g., by the browser)...

Ist dies, dass MDL bedeuten und Reagieren Sie sind so ziemlich unvereinbar?

Aktualisieren: Das Problem verschwindet, wenn das Element mit class = "mdl-js-layout" nicht das oberste Element in der Renderfunktion rectjs ist. Sobald ich dieses Element eingepackt habe, ist alles gut.

+1

Mein Projekt verwendet Reagieren und MDL geht es gut. Sie sind definitiv nicht inkompatibel –

+1

Dank @MichaelParker ist es gut zu wissen, dass die beiden gut zusammen arbeiten. – Penar

+1

Habe gerade dein Update gesehen. Könntest du ein bisschen mehr darüber erzählen, was du tun musstest, um das zu beheben? Ich bin immer noch neugierig, was Ihr Problem verursacht haben könnte. –

Antwort

6

Der erste und zweite Fehler sind miteinander verwandt, siehe MDL's layout source code. Ich würde sagen, dass die nach der Mutation des verursacht Wurzelelement reagieren (das ist die mdl-js-layout Komponente):

var container = document.createElement('div'); 
container.classList.add(this.CssClasses_.CONTAINER); 
this.element_.parentElement.insertBefore(container, this.element_); 
this.element_.parentElement.removeChild(this.element_); 
container.appendChild(this.element_); 

Wenn Sie einen Blick auf die official example nehmen, können Sie sehen, dass MDL Markup massiv verändert und das ist genau was React nicht mag.


BTW: Ich habe auch an article zusammengesetzt, die die Kombination von Reaktion mit MDL studiert.

+1

der blog-link ist kaputt, bitte enthalten relevante informationen nicht nur darauf verlinken – daw

+1

@daw die relevanten informationen gegeben ist, die eingehende info ist verknüpft. Wenn das Blog nicht erreichbar ist, können Sie einfach warten, bis es wieder läuft. –

9

Versuchen Sie, ein DIV-Element außerhalb zu wickeln, ich habe dieses Problem auf diese Weise behoben.

Wenn Sie mit Redux + Reagieren + MDL + Reagieren-Router, Sie können ein DIV-Element zu Element Provider wickeln:

import React, { createStore }  from 'react'; 
import { Provider }    from 'react-redux'; 
import Router, { HistoryLocation } from 'react-router'; 

var store = createStore(); 

Router.run(routes, HistoryLocation, (Handler, state) => { 
    React.render((
     <div> 
      <Provider store={store}> 
      { 
       () => <Handler {...state} /> 
      } 
      </Provider> 
     </div> 
    ), document.body); 
}); 

Hoffe, dass es Ihnen helfen kann :)

+1

Das von mir arbeitete auch mit einem etwas anderen Router-Setup '' 'Router.run (Routen, Router.HistoryLocation, (Root, Staat) => { React.render ((

), document.body ) ; }); '' ' – ActualAl

Verwandte Themen