javascript - 设置没有删除项目的状态
问题描述
我在这里有一个使用 react 和 firebase 的待办事项列表。我可以成功地从 firebase 中删除一个项目并添加一个。问题是在删除项目后对重新渲染做出反应。我正在玩它,我意识到我做错了什么,但不知道如何解决我的问题。
这是我的 componentDidMount 方法,我将状态设置为等于 Firebase 发送的数据。
componentDidMount() {
this.todosRef.on('child_added', snapshot => {
const todo = { key: snapshot.key, value: snapshot.val() }
this.setState({ todos: this.state.todos.concat( todo ) });
});
this.todosRef.on('child_removed', snapshot => {
const removedTodo = { key: snapshot.key, value: snapshot.val() }
const index = this.state.todos.indexOf(removedTodo);
this.setState({ todos: this.state.todos.splice(index, removedTodo)
});
});
}
正如您所看到的,每当我删除一个项目并将其调用this.setState({ todos: this.state.todos.splice(index, removedTodo) });
时,它会将状态设置为一个空数组(因为我试图将状态设置为我刚刚删除的项目...),它会重新呈现页面并且什么都不显示。我希望它重新渲染页面并且仍然有剩余的待办事项。
解决方案
indexOf
只会查找具有完全相同对象引用的对象,因此即使您创建一个具有与要删除的待办事项完全相同的数据的新对象,它也不会起作用,遗憾的是。
您可以改为filter
使用与 相同的key
项目snapshot.key
。
this.todosRef.on('child_removed', snapshot => {
this.setState(previousState => {
const todos = previousState.todos.filter(todo => todo.key !== snapshot.key);
return { todos };
});
});
推荐阅读
- java - 在recyclerView中获取json数据
- javascript - 如何在 iOS 13 上的 Safari 中检测设备名称而不显示正确的用户代理?
- javascript - 为什么这有效(JavaScript)?
- java - 使用不可变地图保留排序?
- java - isMultipartContent(request) 不起作用。我不知道发生了什么,它应该返回 true 但它返回 false
- node.js - 与外部 postgres 数据库的连接超时
- aws-lambda - 针对同一 Github 存储库中不同项目的 AWS CI/CD 流程
- xamarin - 有没有办法在某个日期之后停止触发通知?
- java - Spring i18n - 混淆默认语言环境
- python - 试图找出一种方法让我的 Twitter 机器人根据请求的日期向用户发送推文