Axios запрос + реагировать хуки внутри функции карты вызывает бесконечный цикл - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь отобразить количество задач по проекту. Вызов запроса axios с помощью

getTasksByProject(_id);

вызывает цикл, в котором "nbrOfTasks" устанавливается бесконечно часто. Как я могу предотвратить это?

//Schema
const taskSchema = new mongoose.Schema({
  title: String,
  project: { type: ObjectId, ref: 'Project' },
})

const projectSchema = new mongoose.Schema ({
  name: String
})

Код:

const List = ({ match }) => {
  const [projects, setProject] = useState([]);
  const [nbrOfTasks, setNbrOfTasks] = useState();

  const getTasksByProject = ( _id) => {
    axios.get(`/api/tasks/tasksByProject/${_id}`)
    .then(response => {
      setNbrOfTasks(response.data.length);
    })
  }

  const loadProjects = () => {
    axios.get('/api/projects/').then(response => {
      setProject(response.data)
    })
  }

  useEffect(() => {
    loadProjects();
  }, [])

  return (
    <>
      <Table singleLine columns={4} striped>
        <Table.Header>
          <Table.Row>
            <Table.HeaderCell>Name</Table.HeaderCell>
            <Table.HeaderCell>#Tasks</Table.HeaderCell>
          </Table.Row>
        </Table.Header>

        <Table.Body>
          {projects.map((project) => {
            const { _id, name, status, description } = project;

            getTasksByProject(_id);

            return (
              <Table.Row key={_id}>
                <Table.Cell>{`${name}`}</Table.Cell>
                <Table.Cell>{nbrOfTasks}</Table.Cell>
              </Table.Row>
            )
          })}
        </Table.Body>
      </Table>
    </>
  )
}

export default List;

1 Ответ

0 голосов
/ 09 ноября 2019

hlo kiwi, вы не можете установить внутри функции рендеринга (вы вызвали getTasksByProject (_id); внутри функции рендеринга, которая изменяет состояние, снова вызывает функцию рендеринга и т. Д.). Это приводит к бесконечному циклу.

Вы можете

const loadProjects = () => {
                axios.get('/api/projects/').then(response => {
                  response.data.map((project) => {
                        const { _id, name, status, description } = project;
                         axios.get(`/api/tasks/tasksByProject/${_id}`)
                .then(response => {


                })
      //here prepare new array with ({project_id,project_name,task length}) and use this array in render function instead

                })
              }

ИЛИ лучшим решением было бы создание новой конечной точки, которая возвращала бы массив с ({project_id, project_name, длина задачи})

...