javascript - 在 onChange 事件期间从子组件同时更新状态并调用父 onChange 处理程序

标签 javascript reactjs

当子组件的 select 元素更改时,我尝试做两件事 -

  1. 更新子状态(用于显示更多字段以及其他特定于子项的决策等),
  2. 调用传入 props 的父处理程序。

只有第一个可以工作,如何添加第二个?正确的方法是什么?

虚拟代码:

class Child {
    render(){
        return(
            <div>
            //....
            <select 
                id={this.state.searchId}
                value={this.state.searchId}
                onChange={
                    //1. event => this.setState({searchId : event.target.value})
                    //2. call parent props changeHandler
                }>
                {options}
            </select>
            //....
            </div>
        )
    }
}

class Parent {
    onSearchPrefChange(e) {
        this.setState({
            searchId : e.target.value
        })
    }

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

我尝试过:

onChange={e => {
    this.setState({searchId : e.target.value});
    this.props.onSearchPrefChange;
}}>

不调用父处理程序,它也用于更改具有相同已更改元素的值/id 的父处理程序的状态。

最佳答案

您可以在子组件中定义 onChange 事件处理程序,在那里设置子组件,并在函数的 props 中调用从父组件传递的回调。下面是示例代码:

class Child extends React.Component {
  constructor(props) {
    super(props);
    this.onSelectChange = this.onSelectChange.bind(this);
  }
  onSelectChange(e) {
    const newValue = e.target.value;
    this.props.onChange(newValue );
    // set child state here
    this.setState({searchId : newValue })
  }
  render() {
    return (
      <div>
        <select onChange={this.onSelectChange}>
          <option value="1">1</option>
          <option value="2">2</option>
        </select>
      </div>
    )
  }
}

class Parent extends React.Component {
  constructor(props) {
    super(props);
    this.someHandler = this.someHandler.bind(this);
  }
  someHandler(childValue) {
    console.log(childValue);
    this.setState({ value: childValue })
  }
  render() {
    return <Child onChange={this.someHandler} />
  }
}

这是 codesandbox 上的一个工作示例.

关于javascript - 在 onChange 事件期间从子组件同时更新状态并调用父 onChange 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48165379/

相关文章:

reactjs - 使用 Jest 和 enzyme 时如何在 React.useEffect 钩子(Hook)上获得行覆盖?

javascript - 滚动位置等于 div 内容高度时的 jQuery 警报

javascript - 我的随机播放功能有哪些缺点?

javascript - jQuery if 单选按钮名称和值的条件

javascript - 如何计算对象数组中的数字

javascript - 如何过滤 Mongoose 中的日期事件?

javascript - 为什么我会遇到 Javascript "if"失败?

javascript - 我需要选择多个 SPAN 元素

reactjs - React Mocha渲染,DOMException错误文档

reactjs - 无法在 react 路由器dom中使用链接传递 Prop