材质UI TexField输入时间选择器不会更改值

时间:2018-12-07 20:41:24

标签: javascript reactjs material-ui react-bootstrap

使用此命令:https://codesandbox.io/s/5154qzmjl作为用户界面时间选择器的示例,由于无法更改时间值,现在遇到了麻烦。

我正在将状态中的days数组映射到TextField:

this.state = {
    days: [
                { day: 0, fromHour: 9, fromMin: 0, toHour: 17, toMin: 30 },
                { day: 1, fromHour: 9, fromMin: 0, toHour: 17, toMin: 30 },
                { day: 2, fromHour: 9, fromMin: 0, toHour: 17, toMin: 30 },
                { day: 3, fromHour: 9, fromMin: 0, toHour: 17, toMin: 30 },
                { day: 4, fromHour: 9, fromMin: 0, toHour: 17, toMin: 30 },
                { day: 5, fromHour: 9, fromMin: 0, toHour: 17, toMin: 30 },
                { day: 6, fromHour: 9, fromMin: 0, toHour: 17, toMin: 30 },
            ],
}


render() {
        const {
            days,
        } = this.state;

    return (
        <div>
            {
                    days.map((e, index) => (
                        <Card
                            key={e.day}
                            className={classes.card}>
                            <CardContent>
                                <TextField
                                    id="time"
                                    label="From Time"
                                    type="time"
                                    value={e.fromHour.toString().padStart(2, '0') + ":" + e.fromMin.toString().padStart(2, '0')}
                                    inputProps={{
                                        step: 300, // 5 min
                                    }}
                                />
                            </CardContent>
                        </Card>
                    ))}
        </div>
    );
}

请注意句柄时间函数,必须转换为字符串才能进行渲染。但是,这些值将固定在我在状态中定义的值上。如何更改它们?感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

根据Material-ui文档,textfied的value属性接受以下内容:

union: string |
 number |
 bool |
 arrayOf

因此您的函数不求值

答案 1 :(得分:0)

您需要阅读受控组件:https://reactjs.org/docs/forms.html

文本字段的值由您使用的状态变量控制。当您尝试更改输入的值时,它不会更新,因为状态变量不会更新。您需要在文本字段中添加一个更改事件处理程序,并在输入更改时更新状态值。 链接中的相关代码:

  handleChange(event) {
    this.setState({value: event.target.value});
  }

在您的情况下,您必须将值解析为小时和分钟,以分别设置它们。您还需要传递日期编号,以便可以更新数组中的正确元素。您可能需要重新考虑您的状态结构,并且以天为键的对象可能比现在的数组更容易更新。

答案 2 :(得分:0)

Burhan B是对的。在您的TextField组件中添加一个onChange道具。将值设置为this.state.value或value,因为您已经破坏了状态。

伪代码

state = {
  days: [...], //your objects go here just omitted for the sake of space
  time: moment().format("insert your format") }
  ...
handleChange = time => {
  this.setState({ time }) 
}
render(){
  const { days, time } = this.state; 
  return (
   <div> ...
    <TextField
     id="time"
     label="From Time"
     type="time"
     value={time}
     onChange = {this.handleChange}
     inputProps={{
       step: 300, // 5 min
     }}
   />

moment()。format来自MomentJS。 MomentJS是处理日期和时间的软件包。或者,您可以使用Date-fns。我建议使用此方法,因为它看起来像您正在手动尝试在值属性中设置日期格式,但我不确定这是最好的方法。这些软件包带有格式设置并返回ISODate。格式用于前端,而ISODate对后端有用(假设您将其发送到数据库)。

当然,您不必使用任何一个软件包。如果您可能没有其他为您格式化时间的组件,或者没有格式化时间的函数。这使代码更具可读性,更易于更新。

希望有帮助。