Я медленно начинаю свое приключение с React и сижу над этой проблемой несколько дней, хотел изучить аксиомы. Итак, я создаю библиотеку фильмов на основе серверного пакета Json. Все работает очень хорошо, просто я не могу сделать автоматическое обновление после каждого действия, такого как добавление редактирования или удаление нового фильма. Я знаю, что мне нужно каким-то образом передать функцию getMovie в раздел editMovie, deleteMovie и addMovie, но я совершенно не знаю, как это сделать. Я помещаю getMovie в функцию и передаю его componentDidMount для запуска в самом начале, но я не знаю, как передать его в компонент формы, чтобы поместить его в функции редактирования / удаления / добавления. Я пытался сделать это через функцию экспорта, но не вышло. вероятно, мне нужно сделать это через реквизит, но он также не хочет работать на меня :( Я был бы очень благодарен за любую помощь, так как у меня нет идей.
Компонент формы
class Form extends React.Component {
constructor(props) {
super(props)
this.state = {
name: '',
type: '',
description: '',
id: '',
movies: [],
errors: "",
}
}
handleChangeEventOne = e => {
this.setState({
name: e.target.value
})
}
handleChangeEventTwo = e => {
this.setState({
type: e.target.value
})
}
handleChangeEventThree = e => {
this.setState({
description: e.target.value
})
}
handleSubmit = e => {
e.preventDefault()
const url = `http://localhost:3000/movies/`;
if (this.state.name != "" && this.state.type != "" && this.state.description != "") {
axios
.post(url, {
name: this.state.name,
type: this.state.type,
description: this.state.description,
id: this.state.id
})
.then(res => {
// console.info(res);
// console.info(res.data);
this.setState({
movies: [this.state.name, this.state.type, this.state.description, this.state.id]
})
})
}
else {
this.setState({
errors:"Please, Fill all forms above"
})
}
}
handleRemove = e => {
// const url = `http://localhost:3000/movies/`;
const url = `http://localhost:3000/movies/${e.id}`;
axios
.delete(url)
.then(res => {
console.info(res.data);
})
.catch((err) => {
console.info(err);
})
}
editMovie = e => {
if (this.state.name != "" && this.state.type != "" && this.state.description != "") {
const url = `http://localhost:3000/movies/${e.id}`;
axios
.put(url, {
name: this.state.name,
type: this.state.type,
description: this.state.description,
})
.then(res => {
console.info(res.data);
})
.catch((err) => {
console.info(err);
})
}
else {
this.setState({
errors:"Please, Fill all forms to edit movie"
})
}
}
render() {
return (
<div>
<form onSubmit = {this.handleSubmit}>
<input type = "text" placeholder = "Movie" onChange = {this.handleChangeEventOne}/>
<input type = "text" placeholder = "Type of movie" onChange = {this.handleChangeEventTwo}/>
<textarea placeholder = "Description of the movie"
onChange = {this.handleChangeEventThree}></textarea>
<input id = "addMovie" type = "submit" value = "Add movie" ></input>
<p>{this.state.errors}</p>
</form>
<List removeClick = {this.handleRemove} editClick = {this.editMovie}/>
</div>
)
}
}
Компонент списка
class List extends React.Component {
constructor(props) {
super(props)
this.state = {
movies: [],
}
}
componentDidMount() {
this.getMovie()
}
getMovie = () => {
const url = `http://localhost:3000/movies`;
console.info(url);
axios
.get(url)
.then(res => {
console.info(res.data);
const movies = res.data;
this.setState({
movies: movies,
})
})
.catch((err) => {
console.info(err);
})
}
// }
editMovie = (event, e) => {
event.preventDefault();
console.info("it works with edit!");
if (typeof this.props.editClick === "function") {
this.props.editClick(e)
} else {
console.info("Doesn't work with edit");
}
}
removeMovie = (event, e) => {
event.preventDefault();
console.info("it works with remove!");
if (typeof this.props.removeClick === "function") {
this.props.removeClick(e)
} else {
console.info("Doesn't work with remove");
}
}
render() {
return (
<div className = "movieList">
{this.state.movies.map(e =>
<ul>
<li data-id = {e.id} onClick = {event => this.editMovie(event, e)}>
Title: {e.name}
</li>
<li data-id = {e.id} onClick = {event => this.editMovie(event, e)}>
Type: {e.type}
</li>
<li data-id = {e.id} onClick = {event => this.editMovie(event, e)}>
Description: {e.description}
</li>
<button className = "removeMovie" type = "submit" onClick = {event => this.removeMovie(event, e)}>Delete</button>
</ul>)}
</div>
)
}
}



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


Он не обновляется, потому что он вызывается только один раз после полной загрузки компонента. Что вам нужно, так это триггер, который запускается после обновления.
Для них есть методы жизненного цикла, которые предоставляет React.
Вы должны переместить свой метод getMovie() в componentWillReceiveProps() или componentDidUpdate().
Если вы используете последнюю версию React, вы должны использовать getDerivedStateFromProps().
Эти три метода будут выполняться каждый раз, когда вы обновляете состояние. Однако эти методы полезны в разных случаях использования (которые вам нужно решить).
Надеюсь это поможет ;)
этот метод запускается после каждого выполненного обновления. вы должны поместить туда условия if, чтобы проверить, какие условия вы действительно хотите получить. некоторые могут быть ненужными
хм, я понимаю, но в компоненте формы я попытался установить такие условия, как componentDidUpdate() { if (this.handleRemove() || this.editMovie()) { this.getMovie() }, и взамен получаю ошибку. Невозможно прочитать свойство preventDefault из undefined.
как функции используются как условные? Разве вам не следует назначать переменную для каждого обработчика? как условие для isRemovedButtonClicked?
да, это кажется таким простым, и, вероятно, это так, но я думаю, у меня случится сердечный приступ, извини, друг за много глупых вопросов, но я действительно хочу, наконец, справиться с этим React ... В любом случае, если я хорошо помню, в стандартном js я мог бы сделать let removeMovie = (event,e) => {...}, но вот показывает ошибки, что это невозможно. Но это то, что вы имеете в виду? Чтобы назначить переменную более или менее таким образом, просто исправьте одну? Пробовал делать var isRemovedButtonClicked = removeMovie(events) =>{...} а потом ставил на componentDidUpdate() { if (isRemovedButtonClicked === true) { this.getMovie()}
присоединяйтесь к chat.stackoverflow.com/rooms/177075/… для дальнейшего обсуждения
У меня 15 репутации, и мне нужно 20, чтобы начать там болтать ... Могу я написать вам на slack / fb / email или еще что-нибудь?
вот, сейчас 20?
У меня 20 представителей, спасибо, я также могу видеть, что вы там пишете, но когда я вхожу в чат, я все еще вижу уведомление, что я не могу говорить, пока у меня не будет 20 представителей ... возможно, для продолжения требуется некоторое время
перейти по ссылке еще раз?
пробовал несколько раз и не работает, чтобы не продлевать здесь, я пришлю заявку и спрошу модераторов, что происходит, и когда у меня будет доступ к чату, я дам вам знать
Привет, спасибо за ответ :) на самом деле он работает более или менее хорошо, я имею в виду, что я использовал componentDidUpdate (), поскольку это был только рабочий метод (о других двух, я узнаю о них в первый раз, узнаю позже), но он обновляется каждую секунду как я вижу в журнале консоли. Раньше я делал нечто подобное с setInterval, и эффект был таким же, но я предполагаю, что это ненужная трата ресурсов. Я новичок, все в порядке, он продолжает обновляться, даже если не выполняется никаких действий? Или он должен запускаться, когда я совершаю какое-то действие?