У меня есть коды ниже
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..
Может кто-нибудь помочь мне с этим.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете передать состояние дочернего компонента родительскому компоненту, используя redux также как глобальное состояние.
Не могли бы вы объяснить это или привести пример того же
Это кажется плохим советом. Почему для этого нужно использовать параметры URL или вводить сокращение? Не дает ли React возможности сделать это?
Так не реагирует, есть ли такая функция для реализации?
Вы дважды связали this.sendtobot. это должно быть только в конструкторе.
как это
eachMessage(message, i) {
return (
<Chat
key = {i}
index = {i}
updatecommentText = {this.sendtobot}
>
{ message }
</Chat>
);
}
Кажется, ваш код работает. Здесь - это песочница с вашим кодом.
Я не уверен, что это работает так, как вы ожидаете, но работает без ошибок.
Да ... я только что видел это
Изменив эти 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>
)
}
Это сработало ... но выходило за пределы этого окна чата
как указано ниже @bamse, похоже, что это работает: codeandbox.io/s/52zr6y73xn У него есть какой-то странный код, но функционально он работает. Вы уверены, что что-то не упустили?