代码之家  ›  专栏  ›  技术社区  ›  Optiq

反应:父组件中的函数未从子组件接收数据

  •  0
  • Optiq  · 技术社区  · 6 年前

    我正在使用React进行一个项目,我需要更新 state 具有子组件的输入的父组件的。我做的 console.log() 我通过链表中的每个函数发现 fetchText() 父组件中的函数未收到文本

    下面是我的父组件的外观

    class AppComponent extends React.Component{
      constructor(props){
        super(props);
        this.state = { markdownText: `` };
    
        this.fetchText = this.fetchText.bind(this);
      }
    
      fetchText(text){
        this.setState({ markdownText: text });
        console.log(text);
      }
    
      render(){
        return(
          <div id="app-grid">
            <h1>Markdown Viewer</h1>
            <MarkDownComponent userInput={this.fetchText} />
            <PreviewComponent />
          </div>
        );
      }
    }
    

    我的子组件如下所示

    class MarkDownComponent extends React.Component{
      constructor(props){
        super(props);
        this.state = { text: ``};
    
        this.getInput = this.getInput.bind(this);
        this.sendInput = this.sendInput.bind(this);
      }
    
      getInput(event){
        this.setState({ text: event.target.value });
        this.sendInput();
      }
    
      sendInput(){
        this.props.userInput = this.state.text;
        //console.log(this.props.userInput);
      }
    
      render(){
        return(
          <div id="markdown-component">
            <textarea id="editor" rows="16" onChange={this.getInput}></textarea>
          </div>
        );
      }
    }
    

    什么时候? 控制台.log() 惯性导航与制导 this.props.userInput 在子组件中,我在键入时将值取回。因此,这表示该值正在使其成为属性,但为什么它不在父组件中更新?

    3 回复  |  直到 6 年前
        1
  •  2
  •   McRist    6 年前

    这里有几点需要注意:

    this.props.userInput = this.state.text;

    这行不通。

    <textarea id="editor" rows="16" onChange={this.props.userInput}></textarea>

    在父组件中:

    fetchText(event){
        console.log(event.target.value)
        this.setState({ markdownText: event.target.value });
    }
    

    你不需要像 getInput sendInput

        2
  •  2
  •   Hemadri Dasari    6 年前

    问题是您正在为不正确的函数分配状态值。

    this.props.userInput = this.state.text; // this is incorrect
    
    //Right one
    
    class MarkDownComponent extends React.Component{
      constructor(props){
        super(props);
        this.state = { text: ``};
    
        this.getInput = this.getInput.bind(this);
        this.sendInput = this.sendInput.bind(this);
      }
    
      getInput(event){
        this.setState({ text: event.target.value });
        this.sendInput();
      }
    
      sendInput(){
        this.props.userInput(this.state.text);
        //console.log(this.props.userInput);
      }
    
      render(){
        return(
          <div id="markdown-component">
            <textarea id="editor" rows="16" onChange={this.getInput}></textarea>
          </div>
        );
      }
    }
    

    您可以在getInput函数中直接调用this.props.userInput函数:

    class MarkDownComponent extends React.Component{
          constructor(props){
            super(props);
            this.state = { text: ``};
    
            this.getInput = this.getInput.bind(this);
          }
    
          getInput(event){
            this.props.userInput(event.target.value);
          }
    
          render(){
            return(
              <div id="markdown-component">
                <textarea id="editor" rows="16" onChange={this.getInput}></textarea>
              </div>
            );
          }
        }
    

    class MarkDownComponent extends React.Component{
          constructor(props){
            super(props);
            this.state = { text: ``};
          }
    
          getInput = (event) => {
            this.props.userInput(this.state.text);
          }
    
          render(){
            return(
              <div id="markdown-component">
                <textarea id="editor" rows="16" onChange={this.getInput}></textarea>
              </div>
            );
          }
        }
    
        3
  •  1
  •   devserkan    6 年前

    如注释中所述,不需要为函数分配状态。另外,如果你的愿望是和一个孩子一起改变文本,而不是更多,你不需要在你的孩子的状态。如果没有必要,不要使用state。

    class AppComponent extends React.Component {
      constructor(props) {
        super(props);
        this.state = { markdownText: "" };
    
        this.fetchText = this.fetchText.bind(this);
      }
    
      fetchText(e) {
        this.setState({ markdownText: e.target.value});
      }
    
      render() {
        return (
          <div id="app-grid">
            <h1>Markdown Viewer</h1>
            Value is now: {this.state.markdownText}
            <MarkDownComponent userInput={this.fetchText} />
          </div>
        );
      }
    }
    
    const MarkDownComponent = ( props ) => {
      return (
        <div id="markdown-component">
          <textarea id="editor" rows="16" onChange={props.userInput}></textarea>
        </div>
      )
    }
    
    ReactDOM.render(<AppComponent />, 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>