【问题标题】:reload the useEffect function when post data : reactJS发布数据时重新加载 useEffect 函数:reactJS
【发布时间】:2022-01-23 14:19:21
【问题描述】:

我有这个 useEffect 它有一个 get 函数和一个名为 sentchat 的函数,它有一个 axios.post 方法来发布一些数据我通过 post 方法发布的数据是在 useffect 方法 axios get 中获取的,但我必须重新加载页面才能看到发布的数据我希望它自动发生

 function sentchat(e) {
    e.preventDefault();

    const config = {
      headers: {
        Authorization: `token ` + localStorage.getItem("token"),
      },
    };
    const data = { receiver: props.id, message: inputField };
    axios
      .post("messages/send-message/", data, config)
      .then((res) => {
        console.log(res.receiverDetails);
      })
      .catch((error) => {
        console.log(error);
      });
  }

  useEffect(() => {
    const config = {
      headers: {
        Authorization: `token ` + localStorage.getItem("token"),
      },
    };

    axios
      .get("messages/get-all-messages/?receiver=" + props.id, config)
      .then((res) => {
        console.log(res.receiverDetails);
        setdata(res.data.receiverDetails);
        setMessage(res.data.messages);
      });
  }, [props.id]);

【问题讨论】:

  • 发帖成功后,您可以执行 sendchat 函数中 useEffect 中的代码。最好把代码放到一个函数中,你可以像函数 fetchData() {...} 一样重用它。然后在 useEffect(()=>{fetchData()},[]) 和 sendchat 函数中调用函数

标签: reactjs


【解决方案1】:

更新答案。

添加一个引用(我稍后会解释原因)

    const mountedRef = useRef(true)

把你的 useEffect 改成这个

      useEffect(() => {
        if(mountedRef.current){
          getData();
        }
        return function cleanup() {
          mountedRef.current = false
        };
      }, [getData]);

我们将添加一个新的回调

    const getData = useCallback(async () => {
    const config = {
      headers: {
        Authorization: `token ` + localStorage.getItem("token"),
      },
    };
        const res = await axios.get("messages/get-all-messages/?receiver=" + props.id, config)
        //Also adding to check we have a response otherwise you will be setting the state of undefined which will crash.
        if(res.status === 200){
         //We use the ref here to confirm that this component is still mounted otherwise you will get leak errors.
          if(mountedRef.current){
             console.log(res.receiverDetails);
             setdata(res.data.receiverDetails);
             setMessage(res.data.messages);
          }
        }
      }, [])

现在您可以在需要时调用 getData()。

所以只需将此添加到您的帖子回复中

 function sentchat(e) {
    e.preventDefault();

    const config = {
      headers: {
        Authorization: `token ` + localStorage.getItem("token"),
      },
    };
    const data = { receiver: props.id, message: inputField };
    axios
      .post("messages/send-message/", data, config)
      .then((res) => {
        console.log(res.receiverDetails);
        //ADD LINE HERE
        getData()
      })
      .catch((error) => {
        console.log(error);
      });
  }

【讨论】:

  • send聊天方法中没有setState调用时,数据如何触发事件?
  • ???在回复中,他致电setData(res.data.receiverDetails);
  • @matt_roki2 我尝试了你的答案,但它变成了无限循环的 api 调用我希望它只发生在那些
  • @meon 是的,让我更新我的答案以修复循环给我 5 输入它
  • okee 慢慢来@matt_roki2
猜你喜欢
  • 2018-03-13
  • 2010-11-07
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
相关资源
最近更新 更多