我有一个CommentList组件和一个CommentForm组件。我的CommentList在其状态下有一个CommentForm组件数组,称为注释。
这是CommentList的呈现:
render () {
return (
<div>
<button type='button' className='btn btn-default' onClick= {this.onAddComment}>Ajouter commentaire</button>
<br /><br />
{this.state.comments}
</div>
)
}
这是我作为道具传递给孩子的删除方法。
onDelete (i) {
var comments = this.state.comments
delete comments[i]
this.setState({ comments: comments })
}
我现在才意识到,除非将“ this.state.comments”包装在div这样的div中,否则删除操作将无效:
render () {
return (
<div>
<button type='button' className='btn btn-default' onClick={this.onAddComment}>Ajouter commentaire</button>
<br /><br />
<div>
{this.state.comments}
</div>
</div>
)
}
}
我知道我需要在渲染之前将Component包裹在div中,但是为什么除非我包裹列表,删除操作才能起作用?
编辑:
这是我用来设置状态并填充评论数组的功能
loadComments () {
Axios.get(`${API}/${this.props.candidate_id}/comments.json`)
.then(response => {
let comments = response.data.map((obj, index) => {
return (
<CommentForm
key={index}
index={index}
baskets={this.state.baskets}
comment={obj}
onDelete={this.onDelete}
candidate_id={this.props.candidate_id} />
)
})
this.setState({ comments: comments })
})
}
答案 0 :(得分:0)
使用切片而不是删除。您需要获取新数组,因为状态是不可变的。
onDelete(i) {
this.setState(ps => {
[...ps.comments.slice(0, i), ...ps.comments.slice(i + 1)];
});
}
答案 1 :(得分:0)
您的代码有2个问题
onDelete
时,将直接定义该方法,但是将映射到i
的参数是不确定的。更改
onDelete={this.onDelete}
to
onDelete={() => this.onDelete(index)}
我还建议comments
仅直接包含响应,并在jsx
中使用render
,而不要保持其状态。
loadComments() {
Axios.get(`${API}/${this.props.candidate_id}/comments.json`).then(
response => {
this.setState({ comments: response.data });
}
);
}
onDelete(i) {
let updatedComments = this.state.comments.filter((comment, index) => {
return index !== i;
});
this.setState({ comments: updatedComments });
}
render() {
return (
<div>
<button
type="button"
className="btn btn-default"
onClick={this.onAddComment}
>
Ajouter commentaire
</button>
<br />
<br />
<div>
{this.state.comments.map((obj, index) => {
return (
<CommentForm
key={index}
index={index}
baskets={this.state.baskets}
comment={obj}
onDelete={() => this.onDelete(index)}
candidate_id={this.props.candidate_id}
/>
);
})}
</div>
</div>
);
}