[英]get form value from nested children using react.js
如何将孩子的状态传回容器? 我有一个非常简单的应用程序,但因为我将它们拆分为更小的组件,现在我将状态值(Form)传递回其容器。 我也可以在子组件中调用api,然后通过props容器接收它,但这不是干净的,我希望将'final event'放在容器中,并且容器具有'main'状态。
我的第一个意图(确保'主'状态存储在容器中)是否正确? 如果是,如何将状态从子组件传回给容器? 假设我没有使用redux。
将方法作为道具传递:
家长:
class Parent extends Component {
....
render = () => <Child onChange={childDidSomething}/>
childDidSomething = state => {
...
}
}
儿童:
class Child extends Component {
....
render() {...}
somethingChanged() {
this.props.onChange(this.state);
}
}
你应该提升状态 。
让父组件处理与其子项有关的状态,并将处理程序传递给子项,以便子项可以调用它们并将它们传递回相关值。
以下是使用您的代码运行此方法的示例:
class AddUser extends React.Component { onChange = ({ target }) => { const { onChange } = this.props; onChange(target.value); } render() { return ( <div> <input onChange={this.onChange} type='text' placeholder='user' /> </div> ) } } class Modal extends React.Component { state = { newUser: '' } onUserChange = newUser => this.setState({ newUser }); addUser = () => { const { addUser } = this.props; const { newUser } = this.state; addUser(newUser); this.setState({ newUser: '' }); // reset the field } render() { return ( <div> <AddUser onChange={this.onUserChange} /> <button onClick={this.addUser}>add</button> </div> ) } } class MainContainer extends React.Component { state = { showAddUser: false, users: [{ name: 'Jane' }, { name: 'Black' }] } addUserIntoUsers = (userName) => { const { users } = this.state; if (userName) { // only if we have a value const nextUsers = [...users, { name: userName }]; this.setState({ users: nextUsers, showAddUser: false }); } } render() { return ( <div> <button onClick={() => this.setState({ showAddUser: !this.state.showAddUser })}> Toggle User Panel </button> <br /> {this.state.users.map(o => { return (<div>{o.name}<br /></div>) })} {this.state.showAddUser && <Modal addUser={this.addUserIntoUsers} />} </div> ) } } ReactDOM.render(<MainContainer />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id="root"></div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.