javascript - React Material-ui Datepicker/Timepicker OnChange事件回调函数封装

标签 javascript reactjs oop material-ui

我是 React 的新手,我正在使用 Material-ui作为额外的 UI 依赖项。我的代码中有一些重复,删除起来有点棘手,因为我认为我受到 Material-ui 组件的实现的限制。

这是我的类(class),我需要帮助重新组织

...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 startChangedendChanged 所有这些方法都被插入到 material-ui 的 Datepicker/Timepicker onChange Prop 。通常我会做这样的事情

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 个不同的接触点?

附注对不起...传播滥用:)

最佳答案

合并状态更新

When you call setState(), React merges the object you provide into the current state.

您不需要更新完整状态,React 将独立更新给定对象,其余部分将保持不变。

参见:States updates are merged

主处理程序

there are 3 methods that I would like to try to consolidate into a single method

你只需要categorydate(不需要event):

     handleChange(category, date) {
        this.setState(prevState => {

            // Get previous state
            const { entry } = prevState;

            // Set state: date | startTime | endTime
            entry[category] = date; 

            //Update state
            return { entry };
        });
     }

绑定(bind)处理器

要在内部组件中使用 thissetState:

<EntryForm onChange={ this.handleChange.bind(this) } {...} />

使用处理程序

只需使用 this.props.onChange 而不是 startChangedendChangeddateChanged:

//dateChanged
this.props.onChange('date', date);

//startChanged
this.props.onChange('startTime', date);

//endChanged
this.props.onChange('endTime', date);

时间选择器

But when I try it throws an error, probably because the Date/Time picker implementation looks like this.

onChange 回调只传递一个参数value(即日期)

function onChange(value) {
  console.log(value && value.format(format));
}

因为你只需要date,你可以用匿名函数覆盖实现
(只需将它包装在另一个函数中):

<Timepicker onChange={ date => { props.onChange('date', date ) } />

关于javascript - React Material-ui Datepicker/Timepicker OnChange事件回调函数封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45404688/

相关文章:

java - 从另一个类对象访问一个类的对象

javascript - ReactJS - 弹出组件错误 : Target container is not a DOM element

javascript - 包含多行阿拉伯文本的查询字符串

javascript - 在两个不相关的 React 应用程序之间传递数据

reactjs - 如何检测未使用的 css-modules 类

java - 如何达到扩展类的功能?

javascript - Angularjs动态选择 Controller 和模板

reactjs - 如何访问子组件中的父组件状态?

reactjs - Antd 树表按列值分组

php - 执行时间和内存使用率是 PHP 唯一相关的性能指标吗? CPU呢?