【问题标题】:How can I get <textarea> value in parent component from child?如何从子组件中获取父组件中的 <textarea> 值?
【发布时间】:2017-05-22 12:47:31
【问题描述】:

我的应用程序的目的是从 api-url 获取一些消息(mes)数组并为每条消息发送答案(subFunction 方法)。之后该消息将从“mes”数组中删除。 'Message' 是一个父组件,负责通过 map 方法获取数据(componentDidMount 事件)和渲染消息。 'MessageItem' 负责从'textarea' 获取价值 - 答案的主体。但我无法将 this.state.value(textarea.value) 从 MessageItem 传输到父组件。如果我将 'subFunction' 放在子组件中,我无法更改 this.state.mes

import React from 'react'
import ReactDOM from 'react-dom'
const url="api-url";

class MessageItem extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
         value:'',
      };
    };

 handleChange(event) {
        this.setState({value: event.target.value});
     }
render() {
return (
  <div className="message_wrap" key={this.props.message_id}>
                                <div className="message_body">
                                       {this.props.message_body}
                                </div>            
                                 <div className="input-field col s12">
                                     <textarea value={this.state.value} onChange={this.handleChange.bind(this)}/>
                                     <label htmlFor="textarea1">
                                         Ответ
                                     </label>
                                <button onClick={this.props.onClick}>
                                    Отправить
                                </button>
                        </div>
                    </div>
    );
  }
}
class Message extends React.Component {
   constructor(props) {
      super(props);
      this.state = {
         mes:[],
      };
    };
   componentDidMount(){
    fetch(url).then(function(response){
        return response
    }).then(function (response) {
        return response.json()
    }).then((data)=>{
        this.setState({mes:data})
    })
    }
    subFunction(user_id, value) {
   /*This method have to send answer with user id and textarea value*/
    }
    render() {
        return (
            <div>
            {this.state.mes.map((index)=>
                (
                    <MesItem
                             key={index.message_id}
                             message_body={index.message_body}
                             onClick={this.subFunction.bind(this, index.user_id)}
                    />

                )
          )
            }
        </div>
        );
    }
}
ReactDOM.render(<Message/>, document.getElementById('container'));

【问题讨论】:

    标签: reactjs react-redux


    【解决方案1】:

    您正在将 function 从父组件传递给子组件,调用该函数将值从子组件传递给父组件。

    像这样:

    <button onClick={() => this.props.onClick(this.state.value)}>
         Отправить
    </button>
    

    现在在subFunction 内执行console.log,它将打印正确的值:

    subFunction(user_id, value) {
       console.log(user_id, value)
    }
    

    【讨论】:

    • 我无法理解如何在父组件的 onClick={this.subFunction.bind(this, index.user_id)} 中传递 this.state.value
    • 太棒了!这是工作!你能解释一下怎么做吗?我会非常感谢你!
    • 原因是,在每个 onclick 函数中,您都绑定了 user_id,并且您从子组件传递了值,因此每次调用该函数时,它将获得 2 个参数,user_id 和 value,this.props.onClick(this.state.value)基本上会调用父函数,它会传递输入字段的值:)
    【解决方案2】:

    ref 分配给子组件中的textareaMesItem,然后您可以获取类似的值

    class MessageItem extends React.Component {
        constructor(props) {
          super(props);
          this.state = {
             value:'',
          };
          mesItem = [];
        };
    
     handleChange(event) {
            this.setState({value: event.target.value});
         }
    render() {
    return (
      <div className="message_wrap" key={this.props.message_id}>
                                    <div className="message_body">
                                           {this.props.message_body}
                                    </div>            
                                     <div className="input-field col s12">
                                         <textarea value={this.state.value} ref={(ta) => {this.text = ta}}onChange={this.handleChange.bind(this)}/>
                                         <label htmlFor="textarea1">
                                             Ответ
                                         </label>
                                    <button onClick={this.props.onClick}>
                                        Отправить
                                    </button>
                            </div>
                        </div>
        );
      }
    }
    class Message extends React.Component {
       constructor(props) {
          super(props);
          this.state = {
             mes:[],
          };
        };
       componentDidMount(){
        fetch(url).then(function(response){
            return response
        }).then(function (response) {
            return response.json()
        }).then((data)=>{
            this.setState({mes:data})
        })
        }
        subFunction(user_id, i) {
               console.log(this.mesItem[i].text.value)
        }
        render() {
            return (
                <div>
                {this.state.mes.map((index, i)=>
                    (
                        <MesItem
                                 ref = {(ip) => {this.mesItem[i] = ip}}
                                 key={index.message_id}
                                 message_body={index.message_body}
                                 onClick={this.subFunction.bind(this, index.user_id , i)}
                        />
    
                    )
              )
                }
            </div>
            );
        }
    }
    ReactDOM.render(<Message/>, document.getElementById('container'));
    

    【讨论】:

    • Uncaught (in promise) TypeError: Cannot set property '0' of undefined ref: ip => { this.mesItem[i] = ip;
    • 初始化 mesItem
    • 我认为,正如我在'MessItem' 中的link 中看到的,它必须是 ref={this.props.inputRef} 并且在父级中:inputrRef = {(ip) => {this.mesItem [i] = ip}}。但是我对未定义的值有同样的问题..
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多