我在React中有3个组件,其中一个充当容器,该组件将我的子组件向下传递以呈现为表单。提交表单后,我想获取父组件中的每个子组件,遍历每个子组件,创建服务器期望的对象,然后将对象列表发送回服务器。我正在努力在父组件的onSubmit函数中访问子组件。
这是我的父组件
ParentFixturesComponent.js
class ParentFixturesComponent extends Component { constructor() { super(); this.state = { numChildren: 0, }; } onAddMatch() { this.setState({ numChildren: this.state.numChildren + 1 }); } onSubmit(e) { e.preventDefault(); // loop through the child components // create a match object with them // var match = { // id: uuid(), // title: uuid(), // start: e.something, // end: e.something, // }; console.log("submit works"); } render() { const children = []; for (let i = 0; i < this.state.numChildren; i += 1) { children.push(<SingleMatchForm key={uuid()}/>) } return ( <Fixtures addMatch={this.onAddMatch.bind(this)} save={this.onSubmit.bind(this)} > {children} </Fixtures> ); } } export default ParentFixturesComponent;
包含我的表单的组件,其中我的父母呈现了我所有的孩子组件
ChildFixturesContainer.js
class Fixtures extends Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); } handleChange(name) { this.console.log(this.props); } render() { return ( <div className="tray tray-center"> <div className="row"> <div className="col-md-8"> <div className="panel mb25 mt5"> <div className="panel-heading"> <span className="panel-title">Fixtures</span> </div> <div className="panel-body p20 pb10"> <div id="fixture-parent" onChange={this.handleChange.bind(this)}> {this.props.children} </div> </div> <div className="section-divider mb40" id="spy1"> </div> <button className="btn btn-primary tm-tag" onClick={this.props.addMatch}>Add Match</button> <button className="btn btn-alert tm-tag" onClick={this.props.save}>Save</button> </div> </div> </div> </div> ); } } export default Fixtures;
最后是我孩子的个人表格组件。
SingleMatchComponent.js
class SingleMatchForm extends Component { constructor() { super(); this.state = { startDate: moment() }; } handleChange(date) { this.setState({ startDate: date }); } render() { return ( <div className="row"> <div key={this.props.id} className="form-group"> <label className="control-label col-md-2">New Match</label> <div className="col-md-6"> <DatePicker selected={this.state.startDate} onChange={this.handleChange.bind(this)}/> <div className="section-divider mb40" id="spy1"> </div> </div> </div> </div> ); } } export default SingleMatchForm;
在父级中定义一个函数并将其发送给子级,使用调用子级组件中的父级函数props。就像是:
props
父
class ParentFixturesComponent extends Component { // don't forget to bind the function in parent constructor() { super(); this.state = { numChildren: 0, }; this.someFunctionHere = this.someFunctionHere.bind(this); } someFunctionHere(param) { // do whatever you need } render() { const children = []; for (let i = 0; i < this.state.numChildren; i += 1) { children.push(<SingleMatchForm key={uuid()}/>) } return ( <Fixtures addMatch={this.onAddMatch.bind(this)} save={this.onSubmit.bind(this)} someFunctionHere={this.someFunctionHere} > {children} </Fixtures> ); } } export default ParentFixturesComponent;
子
class Fixtures extends Component { // constructor and other stuff... childFunctionHere() { this.props.someFunctionHere(params); } render() { return ( <div id="fixture-parent" onChange={this.childFunctionHere}> ); } } export default Fixtures;