【问题标题】:Correct way to use useEffect() to update when data changes数据更改时使用 useEffect() 进行更新的正确方法
【发布时间】:2020-08-11 18:12:48
【问题描述】:

下面的 useEffect 渲染、获取数据并显示一次(使用空数组作为 useEffect 中的第二个参数)。

每次用户将数据更改到数据库时(当用户使用 axios.post 时),我都需要它重新运行 useEffect。

我试过的

  • 使用 [tickets],但这只会导致 useEffect 无限运行
  • 也使用 [tickets.length] 和 [tickets, setTickets]
  • 尝试使用 props 作为参数,但没有找到任何有用的东西

 

import React, { useState, createContext, useEffect } from "react";
import axios from "axios";

export const TicketContext = createContext();

export const TicketProvider = (props) => {
  console.log(props);
  const [tickets, setTickets] = useState([]);
  useEffect(() => {
    getTickets();
    console.log("1", { tickets });
  }, []);

  const getTickets = async () => {
    const response = await axios.get("http://localhost:4000/tickets/");
    setTickets(response.data);
  };
  return <TicketContext.Provider value={[tickets, setTickets]}>{props.children}
  </TicketContext.Provider>;
};
import React from "react";
import { useState, useEffect, useContext } from "react";
import Ticket from "../Ticket";
import { TicketContext } from "../contexts/TicketContext";

import AddBacklog from "../addData/AddBacklog";

const TicketDisplay = (props) => {
  const [tickets, setTickets] = useContext(TicketContext);

  return (
    <div className="display">
      <p>Antony Blyakher</p>
      <p>Number of Tickets: {tickets.length}</p>
      <div className="backlog">
        <h1>Backlog</h1>
        {tickets.map((currentTicket, i) => (
          <div className="ticketBlock">
            <Ticket ticket={currentTicket} key={i} />
          </div>
        ))}
      </div>
    </div>
  );
const AddBacklog = (props) => {
  const [tickets, setTickets] = useState("");

...

    axios.post("http://localhost:4000/tickets/add", newTicket).then((res) => console.log(res.data));

    setTickets((currentTickets) => [...currentTickets, { name: name, status: "backlog", id: uuid() }]);

  };

【问题讨论】:

  • 用户修改了哪些数据?
  • axios.post("localhost:4000/tickets/add", newTicket).then((res) => console.log(res.data)); setTickets((currentTickets) => [...currentTickets, { name: name, status: "backlog", id: uuid() }]);
  • 我编辑了帖子以显示添加票功能
  • 当你打电话给/tickets/add,然后你想打电话给/tickets/?使用useEffect()?
  • 我不明白你的问题,你能澄清一下吗?

标签: reactjs axios use-effect use-state use-context


【解决方案1】:

你需要注意tickets,如果它有数据不会导致无限循环,则返回:

useEffect(() => {
  if (tickets.length) return // so, we call just once
  getTickets();
  console.log("1", { tickets });
}, [tickets]);

【讨论】:

  • 这并没有在我添加新票时更新票列表
  • 如果您正在获取添加新票证的数据,那么您可以删除长度检查。您可以尝试其他满足条件的东西。
【解决方案2】:
const fetchData = () => {
axios.get("http://localhost:7000/api/getData/").then((response) => {
  console.log(response.data);
  if (response.data.success) {
    SetIsLoading(false);
  }
  setDataSource(response.data.data);
});
};


useEffect(() => {
fetchData();
if (fetchData.length) fetchData();
}, [fetchData]);

通过这种方式,您可以在数据发生任何变化时实时获取数据。

【讨论】:

  • 您好!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
猜你喜欢
  • 1970-01-01
  • 2023-01-05
  • 2018-05-27
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多