2016-08-03 2 views
2

Когда я использую TextField непосредственно из моего компонента, он отлично работает (случай 1), однако, когда я обертываю его внутри функции (случай 2) из ​​реквизита, он теряет фокус после одного каждый изменение.Простейшие компоненты и материалы высокого порядка-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

Почему это происходит и как я могу это исправить?

+0

Я рекомендую добавить [mcve], чтобы мы могли помочь вам лучше. Jsfiddle/аналогичный проделан долгий путь. – FrankerZ

+0

SO snippets ftw! – evolutionxbox

+1

@FrankerZ: обновлен с помощью jsfiddle. –

ответ

3

Это потому, что вы делаете новую функцию (и, следовательно, новый компонент высокого порядка) при каждом рендеринге. Реакция будет думать, что это совершенно другой тип компонента и уничтожит старый DOM, чтобы сделать новое.

В этой версии мы создаем компонент высокого порядка после создания экземпляра компонента.

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

Спасибо за ваш ответ. Вы знаете какой-либо способ избавиться от 'var T2 = this.T2;' понятие? Это значительно улучшило бы решение. –

+0

Или, если их немного, скомпонуйте их в одно утверждение. –

+1

'var {T1, T2, T3, T4} = this;' назначит 'this.T1' и' this.T2' и 'this.T3' локальным переменным ... – Brandon

Смежные вопросы