【问题标题】:React JS : grandparent component's setState method doesn't update state of a grandchild input field onChange event clickReact JS:祖父组件的 setState 方法不会更新孙子输入字段 onChange 事件单击的状态
【发布时间】:2020-01-14 06:42:48
【问题描述】:

在相同的代码中,我能够获取祖父组件的 setState 方法,以针对来自孙子组件的 onClick 事件进行相应更新,但是,对于 onChange 事件,它失败了。我没有收到任何错误。

class GrandChild extends React.Component {
  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
  }
  changeNumber=()=> {
    this.props.changeNumber();//call child method
  }

   handleChange(e) {
     this.props.onChange(e.target.value);
  }
  render() {
    const data = this.props.data;
    return(
      <div>
        <h1>The number is {this.props.number}</h1>
        <input type="text" value = {data} onChange={this.handleChange} />
        <button onClick={this.changeNumber}>Increase number by 1</button>
      </div>
    )
  }
}

class Child extends React.Component {

  render() {
    return(
      <div>
        <GrandChild number={this.props.number} changeNumber={this.props.changeNumber} value={this.props.data} onChange={this.props.handleChange}/>
      </div>
    )
  }
}

class App extends React.Component {
  constructor() {
    super()
    this.state = {
      number: 1,
      data: ""
    }
    this.handleChange = this.handleChange.bind(this);
  }
    handleChange(data) {
    this.setState({data:this.state.data});
      console.log(data);
  }  
  changeNumber=()=>{


    this.setState((prevState)=>{
      console.log(prevState,this.state.data);
      return {
        number :  prevState.number + 1
      }
    });
  }
  render() {
    const data = this.state.data;
    const input = data;
    return (
      <Child number={this.state.number} 
             changeNumber = {this.changeNumber} 
             data={input} 
             onChange = {this.handleChange}
      />
    );
  }
}

ReactDOM.render(<App />, document.getElementById('root'));

控制台结果: 目的 { 数据: ””, 1号 } ""

结果截图: console.log result

查看代码笔以获取实时代码: https://codepen.io/codehorse/pen/yLyEwBw?editors=0011

【问题讨论】:

    标签: javascript reactjs setstate


    【解决方案1】:

    您通过现场演示改进的代码https://codesandbox.io/s/laughing-sky-kk97b

    需要改什么&lt;GrandChild number={this.props.number} changeNumber={this.props.changeNumber} value={this.props.data} onChange={this.props.onChange}/&gt;

    完整代码

    class GrandChild extends React.Component {
      constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
      }
      changeNumber = () => {
        this.props.changeNumber(); //call child method
      };
    
      handleChange(e) {
        this.props.onChange(e.target.value);
      }
      render() {
        const data = this.props.data;
        return (
          <div>
            <h1>The number is {this.props.number}</h1>
            <input type="text" value={data} onChange={this.props.onChange} />
            <button onClick={this.changeNumber}>Increase number by 1</button>
          </div>
        );
      }
    }
    
    class Child extends React.Component {
      render() {
        return (
          <div>
            <GrandChild
              number={this.props.number}
              changeNumber={this.props.changeNumber}
              value={this.props.data}
              onChange={this.props.onChange}
            />
          </div>
        );
      }
    }
    
    class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          number: 1,
          data: ""
        };
      }
      handleChange = e => {
        this.setState({ data: e.target.value });
        console.log(e.target.value);
      };
      changeNumber = () => {
        this.setState(prevState => {
          console.log(prevState, this.state.data);
          return {
            number: prevState.number + 1
          };
        });
      };
      render() {
        const data = this.state.data;
        const input = data;
        return (
          <Child
            number={this.state.number}
            changeNumber={this.changeNumber}
            data={input}
            onChange={this.handleChange}
          />
        );
      }
    }
    
    export default App;
    

    【讨论】:

      猜你喜欢
      • 2023-01-03
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2018-01-13
      • 2018-10-09
      • 2016-12-26
      相关资源
      最近更新 更多