ReactJS Как передать значения дочернего компонента родительскому компоненту

У меня есть коды ниже

chat.js

import React from 'react';
import '../styles/Chat.css';
import Web from '../services/Web';

class Chat extends React.Component {

 constructor(props) {
    super(props);

    this.state = {
        msg:''
    };
    this.sendMessage = this.sendMessage.bind(this);
 }

 sendMessage () {
    this.props.updatecommentText(this.refs.newText.value, this.props.index);
    this.setState({ msg: '' });
 }

 render() {
   return (
     <div className = "Chat-container">
      <div className = "Chat-row">
        <div className = "Chat-column">
          <div className = "Chat-card">
            <div className = "Chat-body">
               <div className = "Chat-title">React Based Chatbot</div>
               <div className = "Chat-messages">
                 { this.props.children } 
           </div>
           </div>
            <div className = "Chat-footer">
                  <textarea className = "Chat-input" ref = "newText"></textarea>
                  <button className = "Chat-submit" onClick = {this.sendMessage} defaultValue = { this.props.children }>Send</button>
            </div>
          </div>
        </div>
      </div>
     </div>
   );
 }
}


export default Chat;

Web.js

import React, { Component } from 'react';
import PropTypes from "prop-types";
import { Link } from "react-router-dom";
import Chat from '../components/Chat';

class Web extends React.Component {

   constructor(props){
      super(props);

      this.state = {
         messages:["Hi, How can I help you ?"
         ]
      };
      this.sendtobot = this.sendtobot.bind(this);
  }

  sendtobot(newText, i){
     var arr = this.state.messages
     arr.push(newText)
     this.setState({messages: arr})
  }

  eachMessage(message, i){
        return (<Chat key = {i} index = {i} updatecommentText = { this.sendtobot.bind(this) }>{ message }</Chat>);
  }

  render(){
     return(
       <div>
         {this.state.messages.map(this.eachMessage.bind(this))}
       </div>
     )
  }

}

export default Web;

Я хотел взять входные данные из Chat.js и отправить их в Web.js и поместить это значение в сообщения массива, а затем снова отобразить этот массив в this.props.children в Chat.js

Но при запуске кода я получаю сообщение об ошибке this.props.updatecommentText is not a function.. Может кто-нибудь помочь мне с этим.

как указано ниже @bamse, похоже, что это работает: codeandbox.io/s/52zr6y73xn У него есть какой-то странный код, но функционально он работает. Вы уверены, что что-то не упустили?

dubes 24.07.2018 15:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
80
4

Ответы 4

Вы можете передать состояние дочернего компонента родительскому компоненту, используя redux также как глобальное состояние.

Не могли бы вы объяснить это или привести пример того же

pravash panigrahi 24.07.2018 11:45

Это кажется плохим советом. Почему для этого нужно использовать параметры URL или вводить сокращение? Не дает ли React возможности сделать это?

dubes 24.07.2018 15:43

Так не реагирует, есть ли такая функция для реализации?

Shahriat Hossain 24.07.2018 16:36

Вы дважды связали this.sendtobot. это должно быть только в конструкторе. как это

eachMessage(message, i) { return ( <Chat key = {i} index = {i} updatecommentText = {this.sendtobot} > { message } </Chat> ); }

Кажется, ваш код работает. Здесь - это песочница с вашим кодом.

Я не уверен, что это работает так, как вы ожидаете, но работает без ошибок.

Да ... я только что видел это

pravash panigrahi 25.07.2018 10:14

Edit 610v6oo5qz

Изменив эти 3 функции в веб-компоненте, он начинает выглядеть как чат только с одним текстовым полем.

  sendtobot(newText, i) {
    this.setState({ messages: [...this.state.messages, newText] })
  }

  eachMessage(message, i) {
    return (<p>{message}</p>);
  }

  render() {
    return (
      <div>
        {this.state.messages.map(this.eachMessage.bind(this))}
        <Chat updatecommentText = {this.sendtobot}/>
      </div>
    )
  }

Это сработало ... но выходило за пределы этого окна чата

pravash panigrahi 25.07.2018 10:39

Другие вопросы по теме