Значок компонента реакции при нажатии, чтобы отобразить всплывающую форму?

#javascript #reactjs #forms #onclick #components

#язык JavaScript #реагирует на #формы #onclick #Компоненты

Вопрос:

Я пытаюсь создать страницу, на которой отображаются сообщения пользователя в React, и я хочу реализовать значок, при нажатии на который будет отображаться всплывающая форма для отправки нового сообщения другому пользователю.

Я попытался реализовать состояние и изменить состояние при нажатии на значок, отображая форму и вызывая функцию showForm, хотя при нажатии на значок ничего не происходит — сообщение не регистрируется и, похоже, ничего не вызывается.

MessageList.js:

 const MESSAGING_URL = 'http://localhost:8080/messages'; const SEND_MESSAGE_URL = 'http://localhost:8080/messages/send-message'; class MessageList extends Component {   constructor(props) {  super(props);  this.state = {showForm: false, messages: [], token: '', topic: '', message: '', recipientUsername: '', username: localStorage.getItem("username")};  }  componentDidMount() {  const payload = {  "username": this.state.username,  "password": localStorage.getItem("password")  };  fetch(MESSAGING_URL, {  method: 'POST',  headers: {  "Accept": "application/json",  "Content-Type": "application/json",  "Authorization": localStorage.getItem("token")  },  body: JSON.stringify(payload)  })  .then(response =gt; response.json())  .then(data =gt; console.log(data));  }  showForm = () =gt; {  console.log("showForm fired")  return (  lt;divgt;  lt;form onSubmit={this.onSubmit}gt;  lt;labelgt;  Recipient Username:  lt;input  name="recipientUsername"  type="text"  value={this.state.recipientUsername}  onChange={this.handleInputChange} /gt;  lt;/labelgt;  lt;br /gt;  lt;labelgt;  Topic:  lt;input  name="topic"  type="text"  value={this.state.topic}  onChange={this.handleInputChange} /gt;  lt;/labelgt;  lt;br /gt;  lt;labelgt;  Message:  lt;input  name="message"  type="text"  value={this.state.message}  onChange={this.handleInputChange} /gt;  lt;/labelgt;  lt;input type="submit" value="Submit" /gt;  lt;/formgt;  lt;/divgt;  );  }   onSubmit(event) {  event.preventDefault();  const payload = {  "username": this.state.username,  "recipient-username": this.state.recipientUsername,  "topic": this.state.topic,  "message": this.state.message  };  fetch(SEND_MESSAGE_URL, {  method: 'POST',  headers: {  "Accept": "application/json",  "Content-Type": "application/json",  "Authorization": localStorage.getItem("token")  },  body: JSON.stringify(payload)  })  .then(response =gt; response.json())  .then(data =gt; this.setState({messages: data}));  }    render() {  const {messages, isLoading} = this.state;   if (isLoading) {  return lt;pgt;Loading...lt;/pgt;;  }   const messageList = messages.map(message =gt; {  return lt;tr key={message.messageId}gt;  lt;td style={{whiteSpace: 'nowrap'}}gt;{message.senderUsername}lt;/tdgt;  lt;tdgt;{message.recipientUsername}lt;/tdgt;  lt;tdgt;{message.topic}lt;/tdgt;  lt;tdgt;{message.message}lt;/tdgt;  lt;/trgt;  });   return (  lt;divgt;  lt;AppNavbar/gt;  lt;Container fluidgt;  lt;i className="fas fa-plus" onClick={() =gt; this.setState({showForm: true}) }gt;lt;/igt;  lt;button onClick={() =gt; this.setState({showForm: true}) }gt;Add New Applicationlt;/buttongt;  lt;h3gt;Messageslt;/h3gt;  lt;Table className="mt-4"gt;  lt;theadgt;  lt;trgt;  lt;th width="25%"gt;Sender Usernamelt;/thgt;  lt;th width="25%"gt;Recipient Usernamelt;/thgt;  lt;th width="25%"gt;Topiclt;/thgt;  lt;th width="25%"gt;Messagelt;/thgt;  lt;/trgt;  lt;/theadgt;  lt;tbodygt;  {messageList}  lt;/tbodygt;  lt;/Tablegt;  lt;/Containergt;  lt;/divgt;  );  } } export default MessageList;  

Любая помощь была бы очень признательна, спасибо.

Комментарии:

1. Не похоже, что вы где-то визуализируете всплывающее окно. При возврате метода визуализации {this.state.showForm === true amp;amp; this.showForm()}

2. @a.mola Спасибо за ответ, извините, что я так долго не отвечал. Для кода, который вы прокомментировали, я поместил его в onClick={} в этом lt;кнопка onClick={this.state.showForm === true amp;amp; this.showForm()}gt;Добавить новое приложениеlt;кнопка onClick={this.state.showForm === true amp;amp; this.showForm()}gt;lt;/кнопкаgt;

3. @a.mola Тем не менее, теперь я получаю эту ошибку: Неперехваченная ошибка типа: функция.применить-это не функция, спасибо.

4. Не помещайте код в опору onClick кнопки, поместите его туда, где вы хотите, чтобы форма отображалась. т. е. где-то в функции возврата рендеринга компонента.