Правильный способ использования useEffect () для обновления при изменении данных - PullRequest
0 голосов
/ 28 апреля 2020

UseEffect ниже отображает, извлекает данные и отображает их один раз (используя пустой массив для второго параметра в useEffect).

Мне нужно повторно запускать useEffect каждый раз, когда пользователь изменяет данные в базе данных (когда пользователь использует топор ios .post).

То, что я пробовал

  • , используя [tickets], но это просто заставляет useEffect работать бесконечно
  • также используя [tickets.length] и [tickets, setTickets]
  • , пытаясь использовать реквизиты в качестве параметра, но не нашли ничего полезного

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() }]);

  };

1 Ответ

1 голос
/ 28 апреля 2020

Вам нужно следить за tickets и возвращать, если у него есть данные, которые не вызывают бесконечность l oop:

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