Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase onSnapShot一直在呼叫_Javascript_Reactjs_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript Firebase onSnapShot一直在呼叫

Javascript Firebase onSnapShot一直在呼叫,javascript,reactjs,firebase,google-cloud-firestore,Javascript,Reactjs,Firebase,Google Cloud Firestore,我是新手。使用firebase处理ToDo应用程序 import React, { useState, useEffect } from "react"; import "./App.css"; import ToDoInput from "./ToDoInput"; import db from "./firebase"; import ToDoItem from "./ToDoItem";

我是新手。使用firebase处理ToDo应用程序

import React, { useState, useEffect } from "react";
import "./App.css";
import ToDoInput from "./ToDoInput";
import db from "./firebase";
import ToDoItem from "./ToDoItem";

function App() {
  const [toDos, setToDos] = useState([{ id: 1, task: "asd", status: false }]);
  useEffect(() => {
    console.log("User effect");
    db.collection("ToDo")
      .orderBy("createdAt")
      .onSnapshot((snapshot) => {
        setToDos(
          snapshot.docs.map((doc) => ({
            id: doc.id,
            task: doc.data().task,
            createdAt: doc.data().createdAt,
            status: doc.data().status,
          }))
        );
      });
  });
  return (
    <div className="app">
      <ToDoInput />
      {toDos.map((toDo) => (
        <ToDoItem
          key={toDo.id}
          task={toDo.task}
          createdAt={toDo.createdAt}
          status={toDo.status}
        />
      ))}
    </div>
  );
}

export default App;
import React,{useState,useffect}来自“React”;
导入“/App.css”;
从“/ToDoInput”导入ToDoInput;
从“/firebase”导入数据库;
从“/ToDoItem”导入ToDoItem;
函数App(){
const[toDos,setToDos]=useState([{id:1,任务:“asd”,状态:false}]);
useffect(()=>{
console.log(“用户效果”);
数据库收集(“待办事项”)
.orderBy(“创建数据”)
.onSnapshot((快照)=>{
塞托多斯(
snapshot.docs.map((doc)=>({
id:doc.id,
任务:doc.data().task,
createdAt:doc.data().createdAt,
状态:doc.data().status,
}))
);
});
});
返回(
{toDo.map((toDo)=>(
))}
);
}
导出默认应用程序;
在上面的代码中,onSnapshot函数不断触发相同的数据,并且UI处于不断呈现状态


您需要在
useffect
中传递一个空数组参数。这样,该函数将仅在组件上第一次调用。您的代码将在组件上运行,并且每次状态更改时都会运行。由于您正在
useffect
中更改状态,因此您陷入了一个循环中

这样做:

useEffect(() => {
    console.log("User effect");
    db.collection("ToDo")
      .orderBy("createdAt")
      .onSnapshot((snapshot) => {
        setToDos(
          snapshot.docs.map((doc) => ({
            id: doc.id,
            task: doc.data().task,
            createdAt: doc.data().createdAt,
            status: doc.data().status,
          }))
        );
      });
  }, []); 
阅读更多关于它的信息