javascript - 带有值的输入不允许改变自身
问题描述
我有输入,在其中我有value={this.state.date}
我不能输入这个输入,当值仍然存在时。
我尝试使用第二个变量this.state.subdate
先更改它,但这没有效果。我试过占位符,但这个属性不能做需要的东西。
import React, {Component} from 'react';
import {
Col,
Button,
FormGroup,
Input,
Popover,
Row
} from "reactstrap";
import Calendar from 'react-calendar';
import moment from 'moment';
import { spawn } from 'child_process';
let id = 0;
function idGen(){
return 'ds_select_'+(id++)
}
export default class Datetime extends Component{
state={
date: new Date(),
isOpen : false,
hours : '',
minutes : '',
subdate : '',
}
onChange(e){
e.setHours(this.state.date.getHours())
e.setMinutes(this.state.date.getMinutes())
this.setState({ date : e })
//this.props.onChange({name : this.props.name, value : this.dateMs(e)})
}
constructor(props){
super(props);
this.id = idGen();
}
componentDidMount(){
var da = new Date()
this.setState({date : da, hours : da.getHours(), minutes : da.getMinutes(), subdate : da })
}
close(){
this.setState({isOpen : !this.state.isOpen})
}
render(){
return(<>
{this.renderInput()}
{this.renderCalendar()}
</>)
}
dateMs(date){
return Date.parse(date)
}
renderInput(){
return(
<Input
onBlur={(e) => {console.log('blur',e.target.value);
this.setState({date : new Date(this.state.subdate),
hours : new Date(this.state.subdate).getHours(),
minutes :new Date(this.state.subdate).getMinutes()})}}
onClick={() => this.setState({isOpen : !this.state.isOpen})}
id={this.id} type="text" name="date" placeholder={this.state.subdate} value={this.state.date}
onChange={ e => {this.setState({subdate : e.target.value},() => {console.log(this.state.subdate)})}} />
)
}
renderCalendar(){
return(
<Popover id={'_'+this.id} placement="bottom-start" hideArrow offset={0} isOpen={this.state.isOpen} target={this.id} toggle={() =>this.close()}>
<Row style={{display: 'inline-grid', gridTemplateColumns:'360px 250px'}} form>
<Col md={12}>
<FormGroup style={{marginBottom:'0px'}}>
<Calendar
onChange={(e) => this.onChange(e)}
e={this.onChange}
value={this.state.date}
/>
</FormGroup>
</Col>
<Col style={{gridColumnStart: 2}} md={10}>
<FormGroup row>
<Col sm={6}>
<Input valid={this.state.hours >= 0 && this.state.hours <= 23} id={this.id+'hours'}
style={{textAlign:'center'}} type='number' max='23' min='0' name='hours' id='hours' placeholder={23}
value={this.state.hours}
onChange={e => {
var dat = this.state.date;
dat.setHours(e.target.value);
this.setState({date : dat, hours : e.target.value, subdate : dat})
}} />
</Col>
<Col sm={6}>
<Input valid={this.state.minutes >= 0 && this.state.minutes <= 59} id={this.id+'minutes'}
style={{textAlign:'center'}} type='number' max='59' min='0' name='minutes' id='minutes'
placeholder={23} value={this.state.minutes}
onChange={e => {
var dat = this.state.date;
dat.setMinutes(e.target.value);
this.setState({date : dat, minutes : e.target.value, subdate : dat})
}} />
</Col>
</FormGroup>
</Col>
</Row>
</Popover>
)
}
}
可能这是简单的问题,因为我只需要一个输入属性,如 value\placeholder,但具有一些其他功能,使其成为真实的(所以我可以通过键盘编辑这个东西)并且可以通过this.setState()
我的问题是
value
和onChange
变量应该相等value
并且onChange
变量不应该是new Date(e.target.value)
,因为它不允许您从字符串中删除某些内容,如果您想更改它,您应该突出显示一个字母并打印一个替代品。我的目标是使用 发送更改
onBlur
,所以在其中我只需使用new Date(value)
我打印的值
解决方案
请查看我的小提琴以了解如何实现实时日期更新:
您可以相应地更改逻辑。但是设置状态必须遵循我小提琴中描述的方法。
为特定输入设置状态的非常基本的规则是,只有当您的和相同时onChange
才会影响您的输入值。setting state
assigned value state
希望这可以帮助。
推荐阅读
- c# - 以同步方式更新多个 UI 控件的策略
- nlp - 无法在 Brat 中注释多行
- python - jupyter笔记本中的环境变量?(osx)
- python - SQLAlchemy 未定义变量导入,数据库会话
- javascript - Rails 5:如何在部分 html 视图中加载 Datatable javascript
- fullcalendar - 如何在单日视图的列标题中显示日期?
- java - 获取基于歌曲专辑的歌曲列表
- cordova - WKWebView 在 Android 上导致问题(无法加载本地模板)
- c++ - 为什么使用 long int 而不是 int 可以使我的代码工作?
- javascript - ReferenceError:元素未定义