【发布时间】:2016-01-07 23:32:24
【问题描述】:
我有一个 React 应用程序,其中包含一个任务列表,每个任务都有截止日期。我希望用户能够单击截止日期以弹出一个日期选择器来选择一个新的。
我正在使用材质UI库http://www.material-ui.com/#/components/date-picker
我可以简单地在列表中的每个任务上呈现一个日期选择器,但似乎它可能会在长列表上导致性能问题,以便在每个项目上呈现如此复杂的组件。我宁愿只显示截止日期,并且只在用户单击更改截止日期时呈现日期选择器。
这是我想出的解决方案:
TaskFooter = React.createClass({
propTypes: {
task: React.PropTypes.object.isRequired
},
onDateChanged(e, newDate){
// handle data update
},
showDatePicker(){
let dp = ReactDOM.render(
<MUI.DatePicker autoOk={true} textFieldStyle={{display: 'none'}} onChange={this.onDateChanged} />,
this.refs.datePickerContainer
);
dp.openDialog();
},
render() {
return (
<div onClick={this.showDatePicker}>
<MUI.Libs.SvgIcons.ActionEvent />
{this.props.task.duedate}
<div ref="datePickerContainer"></div>
</div>
);
}
});
这似乎可行,但我想知道这种模式是否是执行此操作的“正确”方式。有没有更好的方法来动态呈现可能昂贵的 React 组件以响应事件?
编辑: 我找到了另一种看起来更“反应”的方法,但我不确定它是否完全正确。
TaskFooter = React.createClass({
propTypes: {
task: React.PropTypes.object.isRequired
},
getInitialState(){
return {
showDatePicker: false
}
},
componentDidUpdate(prevProps, prevState){
if(this.state.showDatePicker && !prevState.showDatePicker){
this.refs.datePicker.openDialog();
}
},
onDateChanged(e, newDate){
console.log('new date', newDate);
this.setState({
showDatePicker: false
});
},
showDatePicker(){
this.setState({
showDatePicker: true
});
},
render() {
return (
<div onClick={this.showDatePicker}>
<MUI.Libs.SvgIcons.ActionEvent />
{this.props.task.duedate}
{ this.state.showDatePicker ?
<MUI.DatePicker autoOk={true} textFieldStyle={{display: 'none'}} onChange={this.onDateChanged} ref="datePicker" />
: ''}
</div>
);
}
});
这可以正确显示和隐藏日期选择器,但是在设置关闭状态时,我在控制台中收到以下警告:
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the DatePickerDialog component.
尽管有此警告,但似乎状态已正确设置在我的组件上。我应该忽略这个警告吗?我的新模式正确吗?
【问题讨论】:
标签: javascript performance reactjs material-design