最简单的高阶组件和 material-ui
Simplest high order components and material-ui
当我直接从我的组件使用 TextField 时,它工作得很好(案例 1),但是当我将它包装在 props 的函数(案例 2)中时,它在每次更改后失去焦点。
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>
}
});
为什么会这样,我该如何解决?
这是因为您在每次渲染时都创建了一个 new 函数(因此是一个新的高阶组件)。 React 会认为这是一个完全不同类型的组件,并且会销毁旧的 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>
}
});
当我直接从我的组件使用 TextField 时,它工作得很好(案例 1),但是当我将它包装在 props 的函数(案例 2)中时,它在每次更改后失去焦点。
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>
}
});
为什么会这样,我该如何解决?
这是因为您在每次渲染时都创建了一个 new 函数(因此是一个新的高阶组件)。 React 会认为这是一个完全不同类型的组件,并且会销毁旧的 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>
}
});