gpt4 book ai didi

javascript - React 子组件的 onChange 事件更新状态

转载 作者:行者123 更新时间:2023-12-03 13:06:19 25 4
gpt4 key购买 nike

我正在尝试学习如何实现 React 表单(ES6 语法)并将每个字段的 onChange 事件传递给负责更新状态的 Controller 父组件。这对于标准 html 元素来说效果很好,但是我正在尝试为日期字段使用预装日期选择器 ( https://www.npmjs.com/package/react-bootstrap-date-picker ),并且无法轻松地将事件以相同的方式传递回父级。有没有简单的方法来解决这个问题?

Controller 组件

   class Parent extends React.Component {
constructor (props) {
super(props);
this.state = {job: ''}
}

setJobState(event) {
var field = event.target.name;
var value = event.target.value;
this.state.job[field] = value;
this.setState({job: this.state.job});
}


render () {
return <Child onChange={this.setJobState.bind(this)} />
}
}

子组件

class Child extends React.Component {
constructor (props) {
super(props);

}

render () {
<form>
<input type="text" name="jobNumber" onChange={this.props.onChange} />
<DatePicker name="dateCmmenced" onChange={this.props.onChange} />
</form>
}
}

最佳答案

DatePickeronChange 处理程序不是通过标准浏览器 change 事件调用的,而是通过 value 调用的和 formattedValue 作为参数。我建议在您的 Child 组件中注册不同的 onChange 处理程序,以转换相应输入字段的事件:

Controller 组件

class Parent extends React.Component {
constructor (props) {
super(props);
this.state = {}
}

onChange(field, value) {
// parent class change handler is always called with field name and value
this.setState({[field]: value});
}


render () {
return <Child onChange={this.onChange.bind(this)} />
}
}

子组件

class Child extends React.Component {
constructor (props) {
super(props);
}

onFieldChange(event) {
// for a regular input field, read field name and value from the event
const fieldName = event.target.name;
const fieldValue = event.target.value;
this.props.onChange(fieldName, fieldValue);
}

onDateChange(dateValue) {
// for a date field, the value is passed into the change handler
this.props.onChange('dateCommenced', dateValue);
}

render () {
return <form>
<input type="text" name="jobNumber" onChange={this.onFieldChange.bind(this)} />
<DatePicker onChange={this.onDateChange.bind(this)} />
</form>
}
}

关于javascript - React 子组件的 onChange 事件更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40795906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com