首页  >  问答  >  正文

重新运行useEffect:提交函数后的操作指南

大家好!在我的项目中,我在useeffect中执行了一个获取数据的函数,但是当我向firestore中添加一个新元素时,我希望useEffect再次运行,这样列表中就会包含新增的元素,有人能给我一些建议吗?

useEffect(() => {
    if (session) {
      fetchTodos();
    }
  }, [session]);

  const fetchTodos = async () => {
    const fetchedtodos = [];

    const querySnapshot = await getDocs(collection(db, session.user.uid));

    querySnapshot.forEach((doc) => {
      return fetchedtodos.push({ id: doc.id, data: doc.data() });
    });

    setTodos(fetchedtodos);
  };

const submitHandler = async (todo) => {
    
    const data = await addDoc(collection(db, session.user.uid), {
      todo,
      createdAt: serverTimestamp(),
      type: "active",
    });

    
  }

我希望当我运行submitHandler时,useeffect再次运行,这样列表就会是最新的

P粉218775965P粉218775965426 天前587

全部回复(2)我来回复

  • P粉455093123

    P粉4550931232023-09-11 09:31:29

    根据我的经验,完成你想要做的事情的最佳方法是在后端对修改数据的请求返回差异,然后相应地修改你的状态:

    const submitHandler = async (todo) => {
        const data = await addDoc(collection(db, session.user.uid), {
            todo,
            createdAt: serverTimestamp(),
            type: 'active',
        });
    
        setTodos((prev) => [...prev, data]);
    };

    这样,你就不必在同一会话中为大部分相同的数据进行大量请求。

    当然,如果多个客户端/用户可以修改你的后端数据,或者你无法控制端点的响应内容,这种方法并不理想。

    希望对你有所帮助。

    回复
    0
  • P粉878542459

    P粉8785424592023-09-11 09:27:48

    要让useEffect钩子再次运行,唯一的方法是在依赖数组中更改某些内容,或者根本不提供数组,并通过更改props或state来重新渲染组件。请参阅useEffect文档

    您可以在调用addDoc之后直接调用fetchTodos

    const submitHandler = async (todo) => {
        
      const data = await addDoc(collection(db, session.user.uid), {
        todo,
        createdAt: serverTimestamp(),
        type: "active",
      });
    
      return fetchTodos();
      
    }

    回复
    0
  • 取消回复