【发布时间】:2018-01-06 08:45:17
【问题描述】:
我对 React 还很陌生,我正在使用 Material-ui 作为额外的 UI 依赖项。我的代码中有一些重复,删除起来有点棘手,因为我认为我受到 Material-ui 组件实现的限制。
这是我需要帮助重新组织的课程
...other imports...
import EntryForm from './entryform';
export default class TimeSheet extends Component {
constructor(props) {
...
this.state = {
entry: {
date: null,
startTime: null,
endTime: null,
},
list: []
};
// ... Class method bindings here ...
}
// ------- METHODS I WOULD LIKE TO CONSOLIDATE -----
dateChanged(event, date) {
this.setState(prevState => ({
...prevState,
entry: { ...prevState.entry, date: new Date(date) }
}));
}
startChanged(event, date) {
this.setState(prevState => ({
...prevState,
entry: { ...prevState.entry, startTime: new Date(date) }
}));
}
endChanged(event, date) {
this.setState(prevState => ({
...prevState,
entry: { ...prevState.entry, endTime: new Date(date) }
}));
}
// ------- METHODS I WOULD LIKE TO CONSOLIDATE -----
saveTimeSheetEntry(event) {
this.setState((prevState) => ({
...prevState,
list: prevState.list.concat([{
...prevState.entry
}])
}));
}
render() {
return (
...some stuff
<EntryForm
dateChanged={this.dateChanged}
startChanged={this.startChanged}
endChanged={this.endChanged}
date={this.state.entry.date}
startTime={this.state.entry.startTime}
endTime={this.state.entry.endTime}
save={this.saveEntry}
/>
...other stuff
)
}
}
编辑
./EntryForm 组件
const EntryForm = (props) => (
<Paper style={paperStyle} zDepth={1}>
<DatePicker onChange={props.dateChanged} value={props.date} hintText="Timesheet Date" />
<TimePicker onChange={props.startChanged} value={props.startTime} hintText="Start Time" />
<TimePicker onChange={props.endChanged} value={props.endTime} hintText="End Time" />
<FlatButton onClick={props.save} label="Save" backgroundColor="#18cbce" fullWidth={true} />
</Paper>
);
如您所见,我想尝试将 3 种方法合并为一个方法。 dateChanged startChanged 和 endChanged 所有这些方法都插入到 material-ui 的 Datepicker/Timepicker onChange 属性中。通常我会做这样的事情
handleChange(event, date, stateItem) {
this.setState(state => ({
...state,
entry: { ...state.entry, [stateItem]: date }
}));
}
但是当我尝试时它会抛出一个错误,可能是因为 日期/时间选择器实现如下所示。
<Timepicker onChange={props.startChange} ...otherProps />
see the source code for this here查看第 149 行。
没关系,因为该应用程序很小,而且它只是一个基本的时间表条目。但是如果我必须对许多状态对象执行此操作,它会变得非常不守规矩。
是否有任何解决方案可以阻止我使用 3 个不同的接触点来进行类似的操作?
附言抱歉......传播滥用:)
【问题讨论】:
-
But when I try it throws an error(什么错误?) -
sorry for ...spread abuse: 你不需要设置完整状态 -
你能解释一下什么/什么时候触发吗:
startChanged和endChanged -
如果您可以在帖子中添加
./entryform'的代码^^ -
谢谢我更新了我的答案,你得到错误
dateis undefined 因为onChange只有一个参数value你正在传递第二个参数(未定义)^^
标签: javascript reactjs oop material-ui