Вам нужно записать это как:
onClick={() => this.props.newPostCreated(this.state.post)}>
В противном случае он выполняется внутри JSX {..}
каждый раз, когда вызывается render()
при выполнении setState(..)
.Лучше написать это без использования функции arrow из соображений производительности.
class NewPost extends Component {
// ..
onBtnClick = () => {
this.props.newPostCreated(this.state.post);
};
render() {
return (
// ..
<button onClick={this.onBtnClick}>Add Post</button>
</div>
);
}
}
Я также нахожу конструкцию вашего состояния и функцию handleChange немного странной и неправильной.Я напишу класс как:
class NewPost extends Component {
state = {
post: {
title: "",
content: "",
author: "Max"
}
};
handleChange = ({ target }) => {
this.setState(prevState => ({
post: {
...prevState.post,
[target.name]: target.value
}
}));
};
onBtnClick = () => {
this.props.newPostCreated(this.state.post);
};
render() {
const { post: { content, title, author } } = this.state;
return (
<div className="NewPost">
<h1>Add a Post</h1>
<label>Title</label>
<input
type="text"
name="title"
value={title}
onChange={this.handleChange}
/>
<label>Content</label>
<textarea
rows="4"
name="content"
value={content}
onChange={this.handleChange}
/>
<label>Author</label>
<select
name="author"
value={author}
onChange={this.handleChange}
>
<option value="Max">Max</option>
<option value="Manu">Manu</option>
</select>
<button onClick={this.onBtnClick}>Add Post</button>
</div>
);
}
}