#sql #database #reactjs #components #reload
#sql #База данных #reactjs #Компоненты #перезагрузить
Вопрос:
Я все еще новичок в React (самообучение) и, похоже, не могу понять, как перезагрузить дочерние элементы компонента при изменении базы данных. Прямо сейчас моя настройка выглядит следующим образом: Пример компоновки компонента.
У меня есть три компонента, содержащиеся в одном большем компоненте под названием Contact. Первый компонент в Contact находится сверху и называется SendAMessage , затем под ним находятся два компонента, называемые LeaveAComment и FetchComments (на изображении называются CommentList, но в реальном коде FetchComments); LeaveAComment и FetchComments находятся рядом друг с другом.
Прямо сейчас FetchComments отображает все комментарии, содержащиеся в базе данных, а LeaveAComment добавляет в базу данных. Проблема в том, что компонент FetchComments не отображает никаких новых комментариев, созданных компонентом LeaveAComment, если вкладка не обновлена или не удалена из нее. Мне нужна помощь в попытке найти способ перезагрузки отображаемого списка комментариев, содержащегося в FetchComments, при каждом обновлении базы данных. Или, если есть способ, перезагрузить дочерние элементы FetchComments с помощью кнопки «Отправить» в LeaveAComment.
Пока я понимаю, что родительский компонент может передавать реквизиты дочернему компоненту, но не обязательно наоборот; поскольку LeaveAComment и FetchAComment являются родными братьями, я не уверен, что делать. Любая помощь была бы высоко оценена. Вот код, который у меня есть на данный момент:
export class LeaveAComment extends Component {
constructor(props) {
super(props);
this.state = {
name: "",
comment: "",
date: ""
}
this.onChangeName = this.onChangeName.bind(this);
this.onChangeComment = this.onChangeComment.bind(this);
this.onSubmit = this.onSubmit.bind(this);
}
onChangeName(e) {
this.setState({
name: e.target.value
})
}
onChangeComment(e) {
this.setState({
comment: e.target.value
})
}
onSubmit(e) {
e.preventDefault();
console.log(`The values are ${this.state.name}, ${this.state.comment}, and ${this.state.date}`);
var data = new FormData(e.target);
//console.log(data)
fetch("api/Comment", {
method: 'POST',
body: data
})
// Clear input boxes
this.setState({
name: "",
comment: "",
date: ""
})
// Re-load FetchComments.js here?
}
render() {
return (
<div>
<header>
<h2> Leave A Comment </h2>
</header>
<form
onSubmit={this.onSubmit}
method="POST">
<label> Name: </label>
<input
name= "name"
className="form-control" value=''
value={this.state.name}
onChange={this.onChangeName}/>
<br />
<label> Comment: </label>
<input
name="comment"
className="form-control"
value={this.state.comment}
onChange={this.onChangeComment}/>
<br />
<div
name="date"
className="form-control"
value={new Date().getDate()}
hidden>
</div>
<input type="submit" value="Submit" className="btn btn-primary" />
</form>
</div>
);
}
}
export class FetchComments extends Component {
constructor() {
super();
this.state = {
loading: true,
commentList: []
};
}
componentDidMount() {
fetch('api/Comment')
.then(res => res.json())
.then(cl => this.setState({ loading: false, commentList: cl },
() => console.log("successfully fetched all comments", cl)))
}
renderCommentTable() {
return (
< div className = "container" >
<div className="panel panel-default p50 uth-panel">
<table className="table table-hover">
<thead>
<tr>
<th> Name </th>
<th> Comment </th>
<th> Time Stamp </th>
</tr>
</thead>
<tbody>
{this.state.commentList.map(c =>
<tr key={c.id}>
<td>{c.name} </td>
<td>{c.comment}</td>
<td> {new Intl.DateTimeFormat('en-US').format(c.comentDate)} </td>
</tr>
)}
</tbody>
</table>
</div>
</div >
)
}
render() {
let contents = this.state.loading ? <p> <img src="/Icons/LoadingPaopu.gif" alt="Loading Paopu Icon" /> </p>
: this.renderCommentTable(this.state.commentList);
return (
<div>
<h2> Comment List </h2>
{contents}
</div>
);
}
}
Комментарии:
1. Вам необходимо использовать платформу Redux (или альтернативную) для поддержания состояния вашего приложения. Это позволит компонентам прослушивать (подписываться) на текущие изменения и обновлять себя соответствующим образом.
2. Хорошо, спасибо! Я собираюсь подробнее изучить его использование и, вероятно, вернусь к нему после того, как узнаю больше.
3. Это может помочь вам начать medium.com/@supunbhagya /…