javascript - 为什么评论没有立即出现在我的 React 应用项目中?
问题描述
我正在开发我的第一个 React 应用程序,但在尝试为博客创建评论部分时遇到了困难。每当我在帖子下发表评论时,它不会立即出现,而是在我刷新或返回页面后出现。在我的控制台中,它们确实会立即出现。谁能帮我解决这个问题?
评论添加
function CommentAdd(props) {
const {handleCommentSubmit} = props;
const [comment, setComment] = useState('');
return (
<div>
<div className="card mt-4 mb-3">
<div className="card-header"><strong>Comments</strong></div>
<div className="card-body">
<textarea name="comments" className="form-control" placeholder="Add a new comment"
onChange={event => setComment(event.target.value)} value={comment}/>
</div>
</div>
<div>
<button className="btn btn-primary mr-3" onClick={event => {
handleCommentSubmit(comment);
setComment('');
}}>Comment</button>
</div>
</div>
);
}
export default CommentAdd;
评论组
class CommentGroup extends Component {
constructor(props) {
super(props);
this.state = {
body: [],
postId: props.postId,
storyParts: props.storyParts || [],
datePublished: new Date(),
isLoaded: false
}
this.handleCommentSubmit = this.handleCommentSubmit.bind(this);
}
async componentDidMount() {
await this.setState({comments: this.props.comments});
}
handleCommentSubmit(data) {
console.log(JSON.stringify(data));
const postData = {
body: data,
postId: this.state.postId,
datePublished: new Date(),
};
console.log(postData)
axios.create(postData).then((response) => {
console.log('response', response.data);
let comments = this.state.comments;
if (response.data)
comments.unshift({
id: response.data.storyId,
body: response.data.body,
localDate: response.data.localDate,
})
this.setState({comments: this.props.comments});
});
}
renderComments() {
return this.props.comments.map((comment, index) => {
const {finishStoryId, storyId, body, localDate} = comment;
return (
<Comment key={index} storyId={storyId} body={body} localDate={localDate} finishStoryId={finishStoryId}/>
);
})
}
render() {
return (
<div>
{this.renderComments()}
<CommentAdd handleCommentSubmit={this.handleCommentSubmit}/>
</div>
);
}
}
export default CommentGroup;
解决方案
我在你的代码中看到:
async componentDidMount() {
await this.setState({comments: this.props.comments});
}
我的假设是,如果这是您的情况,comments
则已CommentGroup
作为道具传递给。您不需要将评论设置为CommentGroup
状态。
您也应该将函数传递updateComments
给CommentGroup
,CommentGroup
父级应如下所示:
class CommentGroupParent extends React.Component {
constructor(props) {
super(props);
this.state = {
comments: []
}
}
updateComments = (comment) => {
this.setState({ comments: [comment, ...this.state.comments]})
}
render() {
return (
<CommentGroup comments={this.state.comments} updateComments={this.updateComments} />
)
}
}
在您的CommentGroup
代码中:
// ... your code
comments.unshift({
id: response.data.storyId,
body: response.data.body,
localDate: response.data.localDate,
})
this.setState({comments: this.props.comments});
应该替换为
this.props.updateComments({
id: response.data.storyId,
body: response.data.body,
localDate: response.data.localDate,
})
附加信息
像下面这样的更新状态是反模式:
let comments = this.state.comments;
comments.unshift({
id: response.data.storyId,
body: response.data.body,
localDate: response.data.localDate,
});
this.setState({ comments: this.props.comments });
要更新状态,你unshift
甚至不应该在分配给一个状态的新变量上使用,它仍然会导致不可预知的状态变化,你的代码应该改变如下:
this.setState({
comments: [
{
id: response.data.storyId,
body: response.data.body,
localDate: response.data.localDate,
},
...this.state.comments
],
});
推荐阅读
- bash - 使用 AWK 修复演示文稿
- java - 我怎样才能让它清楚地猜谜游戏?
- angular - 我可以在没有服务器的情况下访问 Angular 6 版本吗?
- stripe-payments - 通过 API 创建计划时,条纹获得的金额与预期不同
- haskell - 为什么单子在组合下不关闭?
- python - 在 while 循环中使用生成器并在每次产量后评估
- xml - 从 CLOB XML 列中提取值
- php - 基于隐藏输入(会话变量)的 PHP 提交
- android - 是否可以制作两个 LiveData 的一个 LiveData?
- objective-c - Block没有在typeof中捕获自我,为什么?