使用Firebase问题反应阵列图

还有祖兹维奇

因此,在我使用React,Firebase和Node创建的这个基本任务应用程序方面,我遇到了一个小问题。我在heroku上托管了工作版本(将在下面发布链接),因此您可以使用它来了解我的意思。

我的问题

如果您访问到我的应用程序的链接,则可以看到,当您最初单击“获取任务”按钮时,任务不会加载到屏幕上。单击两次即可将列表填充到屏幕上。

另外,当您单击关闭图标尝试删除特定任务时,好吧……您将用两只眼睛看到发生了什么,大声笑。

我的想法尽管我很高兴它至少能奏效,但我觉得主要的罪魁祸首是我在grabTasks函数内部创建的代码。不要问为什么我用变量名x创建一个随机的空数组,我也不知道,这是我可以使用它的唯一方法。我已经阅读了所有的firebase文档,所以我希望这里的人可以启发我解决问题,甚至可以提出解决此问题的更好方法。下面的代码和链接。

链接到工作的Heroku App

App.js

// App.js
export default class App extends Component {
  constructor(props) {
    super(props);

    this.state = { tasks: [] };
    this.grabTasks = this.grabTasks.bind(this);
    this.handleDelete = this.handleDelete.bind(this);
  }

  // Grabs the list of tasks from the firebase database
  // and then sets the state to x.
  grabTasks() {
    var x = [];
    db.ref('tasks').on('value', function(snapshot) {
       return x = snapshot.val();
    });
    this.setState({ tasks : x });
  }

  // In charge of removing the task items when they are clicked.
  // This function is passed to TaskItems via props
  handleDelete(taskToDelete) {
       var newTasks = _.reject(this.state.tasks, function(task) {
           return task == taskToDelete
       });
       this.setState({tasks: newTasks});
     }

  render() {
    return (
      <div id="wrapper">
        <div id="navigation">
          <Navbar />
        </div>
        <div id="content">
          <div className="container">
            <div className="row">
              <h2>Tasks</h2>
              <div onClick={this.grabTasks} className="btn">Get Tasks</div>
              <TaskItems tasks={this.state.tasks} handleDelete={this.handleDelete} />
            </div>
          </div>
        </div>
      </div>
    )
  }
}

TaskItems.js

// TaskItems Child Component
const TaskItems = (props) => {
  var hello = props.tasks.map((task,index) => {
    return(
      <li className="collection-item" key={index}>
        {task}
        <a onClick={props.handleDelete.bind(this, task)}>
          <i className="fa fa-times-circle remove-task" aria-hidden="true"></i>
        </a>
      </li>
    );
  });

  return (
    <div>
      <ul className="collection">
        {hello}
      </ul>
    </div>
  );
}

export default TaskItems

皮阮

db.ref('tasks')是一个异步方法。您不应该将其视为同步。试试这个:

grabTasks() {
 var that = this;
 db.ref('tasks').on('value', function(snapshot) {
   var x = snapshop.val();
   that.setState({tasks : x})
 });
}

要在屏幕加载时执行这些任务:

componentDidMount(){
  this.grabTasks();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章