Я пытаюсь передать параметр компоненту, но при этом получаю ошибку Uncaught (in promise) ReferenceError: post is not defined - это критическая строка:
<NewPost onAddPost = {(e) => this.addPost(post, e)}/>
Я тоже эту версию пробовал,
<NewPost onAddPost = {this.addPost(post)}/>
но с тем же сообщением об ошибке (но теперь вся страница не отображается вообще).
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
posts: [],
loading: true
};
}
componentDidMount() {
axios.get('/posts')
.then(response => {
this.setState({ posts: response.data, loading: false });
});
}
addPost(post){
console.info('in "addPost"');
const oldPosts = this.state.posts;
this.setState({posts: oldPosts.push(post)})
}
render() {
return (
<div>
<NewPost onAddPost = {(e) => this.addPost(post, e)}/>
<Posts posts = {this.state.posts} loading = {this.state.loading} />
</div>
)
}
}
export default App
class NewPost extends React.Component {
constructor(props) {
super(props);
this.state = {
namee: '',
description: ''
}
this.handleChangeEventNamee = this.handleChangeEventNamee.bind(this);
this.handleChangeEventDescr = this.handleChangeEventDescr.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChangeEventNamee(event) {
this.setState({
namee: event.target.value
});
}
handleChangeEventDescr(event) {
this.setState({
description: event.target.value
});
}
handleSubmit(event) {
event.preventDefault();
const form_data = {
namee: this.state.namee,
description: this.state.description
};
axios.post('/posts/testtt', { form_data })
.then(res => {
this.props.onAddPost(res.data);
})
}
render () {
return (
<div style = {{'marginBottom': '20px'}}>
<form onSubmit = {this.handleSubmit}>
<input name='namee' value = {this.state.namee} onChange = {this.handleChangeEventNamee} />
<input name='description' value = {this.state.description} onChange = {this.handleChangeEventDescr} />
<button onClick = {this.handleItem}>Submit</button>
</form>
</div>
);
}
}
export default NewPost
Я пробовал разные варианты передачи туда параметра, разные способы вызова этой функции, но все равно возникает ошибка сообщение не определено. Что мне здесь еще не хватает?
Заранее спасибо.



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


Сообщение об ошибке очень четкое - сообщение не определено в обработчике события рендеринга.
В настоящее время у вас есть два обработчика событий, одна анонимная функция, определенная в вашем методе рендеринга (onAddPost = {(e) => this.addPost(post, e)} - сообщение здесь не определено, только e!), И еще одна в определении вашего класса - addPost(post) { ... }.
Я думаю, вы хотели сделать что-то вроде этого:
<NewPost onAddPost = {this.addPost} />
И привяжите обработчик событий к компоненту следующим образом:
addPost = (post) => {
console.info('in "addPost"');
const oldPosts = this.state.posts;
this.setState({posts: oldPosts.push(post)})
}
Обновлено: Кроме того, вам следует избегать изменения состояния компонента напрямую, как вы это сделали в этой строке: this.setState({posts: oldPosts.push(post)}). Вместо этого вы должны создать новый экземпляр массива, например: this.setState({ posts: [...oldPosts, push] }). Состояние компонента React всегда следует рассматривать как неизменное - только когда-либо обновляется с помощью setState.
@devserkan, спасибо. Но этот способ обновления состояния, это будет только текст (содержимое) post в state.posts, он не будет добавлять туда все данные post, такие как post.id, post.created_at и т. д., Это правильно? Кроме того, если возникнет ошибка на стороне бэкенда - по какой-то причине этот post не будет добавлен в базу данных, приведенный выше код все равно добавит post в state.posts (несогласованные данные во внешнем и внутреннем интерфейсе), является что правильно?
Нет, он добавляет пост в целом, а не только текст. Если при добавлении поста в бэкэнд возникнет ошибка, вы обработаете ее в своей функции. Если есть успех, вы установите состояние, если ошибка - нет. Кроме того, ваша функция делает то же самое с этим предложением. Вы устанавливаете состояние, ничего не проверяя.
Когда я добавляю новый пост в state.posts, я не могу распечатать ни элемент post.id, ни какой-либо другой атрибут свойства.
Мы ничего не можем сказать, если не увидим хорошей информации. Просто следите за своими данными с помощью некоторой отладки, например console.info. Когда вы добавляете сообщение, какие данные вы получаете обратно с сервера? Это нормально или нет. Если да, то каково предыдущее состояние перед добавлением публикации и каково последнее состояние?
Я предлагал то же самое, но также писал кое-что о настройке состояния.
this.setState( prevState => ( { posts: [ ...prevState.posts, post] } ) )