簡體   English   中英

React JS:祖父組件的 setState 方法不會更新孫子輸入字段 onChange 事件單擊的狀態

[英]React JS : grandparent component's setState method doesn't update state of a grandchild input field onChange event click

在相同的代碼中,我能夠獲取祖父組件的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 結果

實時代碼見代碼筆: https : //codepen.io/codehorse/pen/yLyEwBw?editors=0011

您使用現場演示改進的代碼https://codesandbox.io/s/laughing-sky-kk97b

什么需要改變<GrandChild number={this.props.number} changeNumber={this.props.changeNumber} value={this.props.data} onChange={this.props.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.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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM