UseEffect .map не является функцией React Hooks

Вот моя проблема: я устанавливаю состояние currentUser, иногда неопределенное, иногда нет (из API). Затем я передаю его второму useEffect, я устанавливаю состояние оператора связи, а затем, когда я пытаюсь получить пользователей от этого оператора связи на основе идентификатора,CARSER.ID по какой-то причине кажется неопределенным.

Что я здесь делаю неправильно?

Я использую этот useEffect для наблюдения за любыми изменениями текущего пользователя, вошедшего в систему. Я передаю пользователя из службы аутентификации в состояние currentUser.

useEffect(() => {
  const user = AuthService.getCurrentUser();
  // console.info(user);

  if (user) {
    setCurrentUser(user);
    // console.info(currentUser);
  } else {
    console.info("user not logged");
  }
}, []);

Я пытаюсь передать идентификатор от currentUser в конечную точку выборки для useEffect ниже, чтобы получить носитель, к которому подключен пользователь/руководитель.

// Fetches the carrier that the user is supervisor in 


const [carrier, setCarrier] = useState({

});

useEffect(() => {
    fetch(`http://localhost:8080/supervisor/${currentUser.id}/carriers`, {
        headers: new Headers({
            'Authorization': 'Bearer ' + currentUser.accessToken, 
          }), 
    })
    .then(response => response.json())
    .then(json => setCarrier(json))
}, [carrier])

const [employees, setEmployees] = useState([

])

Затем я передаю оператору.id конечной точке, чтобы получить пользователей, подключенных к конкретному оператору связи, в котором находится пользователь.

// fetches the users from the specific carrier

useEffect(() => {
  fetch(`http://localhost:8080/supervisor/carriers/${carrier.id}/employees/`, {
      headers: new Headers({
          'Authorization': 'Bearer ' + currentUser.accessToken, 
        }), 
  })
  .then(response => response.json())
  .then(json => setEmployees(json))
}, [employees])



 {employees.length > 0 && employees.map((employeeCarrier) => (   
      <Slide direction = "up" in = {employees} mountOnEnter unmountOnExit>
      <TableRow key = {employeeCarrier.id}>
            <TableCell>{employeeCarrier.fullname}</TableCell>
            <TableCell>{employeeCarrier.email}</TableCell>
            <TableCell>{employeeCarrier.crn}</TableCell>
            <TableCell>{employeeCarrier.role}</TableCell>
            <TableCell>{employeeCarrier.address}</TableCell>
            <TableCell>{employeeCarrier.birthday}</TableCell>
            <TableCell align = "center">
            <Tooltip title = "Modify">
                        {/* <IconButton aria-label = "modify" size = "small" onClick = {() => handleClickOpenEditUser(user)}> */}
                            <EditIcon />
                         {/* </IconButton> */}
                        </Tooltip> 
                      <Tooltip title = "Delete">
                        {/* <IconButton aria-label = "delete" onClick = {()=>deleteUser(user.id)}> */}
                          <DeleteIcon />
                        {/* </IconButton> */}
                       </Tooltip> 
            </TableCell>
          </TableRow>
          </Slide>
        ))}

Этот код сбивает с толку. Похоже, что первый usEffect вызовет бесконечный цикл, потому что он выполняет вызов API, который устанавливает носитель в своем обратном вызове, однако носитель является зависимостью эффекта, поэтому его установка вызовет повторный запуск эффекта. Во-вторых, ваш второй useEffect не имеет ничего общего с перевозчиком, и, учитывая, что носитель изначально является пустым объектом, когда этот эффект работает на маунте, тогда да, carrier.id будет неопределенным. В-третьих, заголовок вашего вопроса касается ошибки карты, но в вашем коде нет карты.

Jayce444 11.12.2020 00:11

Я добавил остальную часть кода, мои извинения.

Harry 11.12.2020 00:17

Поскольку второй эффект зависит от идентификатора оператора связи, я думаю, вам нужно справиться с тем, что он не определен, а также добавить его в качестве зависимости. Итак, во втором useEffect, прежде чем делать этот запрос, убедитесь, что идентификатор оператора определен: if (!!!carrier.id) return;, а затем в зависимости эффекта добавьте перевозчика: [carrier, employees]. Таким образом, он не будет выполнять запрос API, если идентификатор оператора не определен, а затем, когда оператор выбран и установлен в состояние, он выполнит этот запрос.

Jayce444 11.12.2020 00:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
206
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, я понимаю ваш вопрос. Ваша иерархия выглядит примерно так:

  1. Посмотрите, аутентифицирован ли пользователь.
  2. Если аутентифицировано, извлеките носителей для пользователей.
  3. Если перевозчики, приведите сотрудников для перевозчика.

Итак, во-первых, как упомянул @Jayce444, ваш useEffect() проблематичен, потому что он отслеживает перевозчика, а также извлекает перевозчика.

То, что вы на самом деле хотите, это:

useEffect(() => {
  const user = AuthService.getCurrentUser();
  // console.info(user);

  if (user) {
    setCurrentUser(user);
    // console.info(currentUser);
  } else {
    console.info("user not logged");
  }
}, []);


useEffect(() => {
fetch(`http://localhost:8080/supervisor/${currentUser.id}/carriers`, {
        headers: new Headers({
            'Authorization': 'Bearer ' + currentUser.accessToken, 
          }), 
    })
    .then(response => response.json())
    .then(json => setCarrier(json))
}, [currentUser]); //Should be currentUser not carrier

Вы понимаете, почему? Только при изменении currentUser мы хотим получить перевозчика.

Расширение той же концепции:

useEffect( () => {
  fetch(`http://localhost:8080/supervisor/carriers/${carrier.id}/employees/`, {
      headers: new Headers({
          'Authorization': 'Bearer ' + currentUser.accessToken, 
        }), 
  })
  .then(response => response.json())
  .then(json => setEmployees(json))
}, [carrier])

Привлекайте новых сотрудников только при смене оператора.

Имеет ли это смысл? UseEffect в основном говорит: если эта переменная/зависимость изменится, что мне делать?

Прохладный. Рад был помочь.

Parmandeep Chaddha 11.12.2020 04:14

Другие вопросы по теме