【问题标题】:Firebase data duplicate issueFirebase 数据重复问题
【发布时间】:2019-02-01 12:07:03
【问题描述】:

我正在开发一个带有后端 firebase 的 React TODO 应用程序。我遇到的问题是,在从 firebase RTD 更新或删除节点后,从 firebase RTD 发送的数据会附加两次。

状态:

// Initialize state
this.state = {
    todos: []
}

这是我的getTodos函数,负责读取数据,在componentDidMount内部调用:

getTodos () {
    firebase.database().ref('todos').on('value', (todo) => {
        const todos = todo.val();
        // Iterate through keys
        Object.keys(todos).map(todoItem => {                
            let todo = todos[todoItem];
            // Update the todos array
            this.setState({
                todos: [...this.state.todos, todo]
            })
        })
    })
}

渲染部分:

<tbody>
{
  this.state.todos.map((todo, index) => {
     return (
        <tr key={index}>
           <td>{index + 1}</td>
           <td>{todo.title}</td>
           <td>{todo.date}</td>
           <td align="center">
           <button className="btn btn-success btn-sm" data-toggle="modal" data-target="#editModal" onClick={this.assignID.bind(this)}>
                   <i className="fa fa-pencil"></i>
               </button> &nbsp;
               <button className="btn btn-danger btn-sm" onClick={this.removeTodo.bind(this)}>
                   <i className="fa fa-trash"></i>
               </button>
                </td>
         </tr>
          )
        })
      }
    </tbody>
}

结果(删除 TODO 之前):

删除 TODO 后:

我尝试将todos 状态长度重置为零,然后调用getTodos,但这并没有解决问题。有什么想法吗?

【问题讨论】:

    标签: javascript reactjs firebase firebase-realtime-database


    【解决方案1】:

    您没有清除状态中todos 的现有内容。另外:您在循环的每次迭代中都更新状态,这是低效的。

    firebase.database().ref('todos').on('value', (snapshot) => {
        var todos = [];
        snapshot.forEach((todo) => {
            todos.push(todo.val());
        });
        this.setState({
            todos: todos
        })
    })
    

    【讨论】:

    • 我尝试在循环外使用 this.setState Object.keys(todos).map(todoItem =&gt; { todo = todos[todoItem]; }) this.setState({ todos: [...this.state.todos, todo] }) 但它只给了我数据库中的第一项
    • 我的代码首先构建了一个todos的数组,然后将整个数组设置为循环后的状态。
    猜你喜欢
    • 2018-09-13
    • 2019-10-15
    • 2019-07-31
    • 2022-12-18
    • 2020-11-03
    • 2016-10-26
    • 2015-01-31
    • 2017-09-24
    • 2017-01-01
    相关资源
    最近更新 更多