2016-08-03 4 views
2

Wenn ich TextField direkt von meiner Komponente verwenden, funktioniert es einwandfrei (Fall 1), aber wenn ich es innerhalb der Funktion (Fall 2) von Requisiten wickeln es verliert den Fokus nach einem jede Änderung.Einfachste hochwertige Komponenten und Material-Ui

import TextField from 'material-ui/TextField'; 

var Comp = React.createClass({ 
    getInitialState: function() { 
     return {description: ""}; 
    }, 
    descriptionChanged: function (e) { 
     this.setState({description: e.target.value}); 
    }, 
    render: function() { 
     var self = this; 
     var T2 = function (props) { 
      return <TextField hintText="Desc2" 
           value={self.state.description} 
           onChange={self.descriptionChanged}/>; 
     }; 
     return <div> 
      1 <TextField hintText="Desc1" 
         value={self.state.description} 
         onChange={self.descriptionChanged} 
      /> 
      2 <T2/> 
     </div> 

    } 
}); 

jsfiddle

Warum es passiert und wie kann ich es beheben?

+0

Ich empfehle ein [mcve] hinzufügen, damit wir Ihnen helfen können, besser zu helfen. Ein Spiel/ähnliches würde einen langen Weg zurücklegen. – FrankerZ

+0

SO Schnipsel ftw! – evolutionxbox

+1

@FrankerZ: mit jsfiddle aktualisiert. –

Antwort

3

Dies ist, weil Sie eine neue Funktion (und damit eine neue Komponente höherer Ordnung) jedes Mal machen, wenn Sie rendern. Reagieren wird denken, dass dies eine komplett andere Art von Komponente ist und das alte DOM zerstören wird, um das neue zu machen.

In dieser Version machen wir die hochwertige Komponente einmal, wenn Ihre Komponenteninstanz erstellt wird.

import TextField from 'material-ui/TextField'; 

var Comp = React.createClass({ 
    getInitialState: function() { 
     return {description: ""}; 
    }, 
    componentWillMount() { 
     // create HOC once for this instance 
     var self = this; 
     this.T2 = function (props) { 
      return <TextField hintText="Desc2" 
           value={self.state.description} 
           onChange={self.descriptionChanged}/>; 
     }; 
    }, 
    descriptionChanged: function (e) { 
     this.setState({description: e.target.value}); 
    }, 
    render: function() { 
     var self = this; 
     var T2 = this.T2; 
     return <div> 
      1 <TextField hintText="Desc1" 
         value={self.state.description} 
         onChange={self.descriptionChanged} 
      /> 
      2 <T2/> 
     </div> 

    } 
}); 
+0

Vielen Dank für Ihre Antwort. Weißt du irgendeinen Weg, um 'var T2 = this.T2 loszuwerden?' Idee? Es würde die Lösung so sehr verbessern. –

+0

Oder, wenn es nur wenige von ihnen gibt, komprimiere sie irgendwie zu einer Aussage. –

+1

'var {T1, T2, T3, T4} = dies;' wird 'this.T1' und' this.T2' und 'this.T3' lokalen Variablen zuweisen ... – Brandon

Verwandte Themen