Я могу просматривать данные массива, но не могу получить к ним доступ после выборки

#arrays #dictionary #fetch #undefined

#массивы #словарь #выборка #не определено

Вопрос:

У меня есть функция, которая создает компонент на основе количества элементов (целей) в массиве. Я продолжаю получать сообщение об ошибке, что функция не может сопоставить «цели» с неопределенными. Основываясь на проведенном мной исследовании, он пытается отобразить данные до того, как они появятся. При тестировании этого я могу консольно регистрировать проекты, но не могу получить доступ к массиву. Изначально я использовал axios, но повторил ту же проблему с помощью выборки. Я также пытался условно отобразить компоненты безрезультатно. Я также использую ‘useEffect’. Я был бы признателен за любую помощь в этом.

Мое состояние (я пробовал инициализировать как пустой объект, так и массив):

 const [projs, setProjs] = useState({});
  

Моя выборка:

     async function getProjects(){
    await fetch(`${config.api.invokeUrl}/users/${11111}`)
       .then(res => res.json())
       .then(data => {
           setProjs(data);
       });
  

};

И моя функция map:

     useEffect(() => {
    // fetchProjects();
    getProjects();

  }, []);

  let index = 0;

  
const createGoal =  projs[current].goals amp;amp; projs[0].goals.map(goal => {
    return <Goal 
        goalDetails={goal} 
        projectManager={projectManager}
        index={index  }
        />
})
  

.
console.log(«проекты»,projs.projects)

возвращает массив проектов

 console.log("projects",projs.projects[0])
  

возвращает «не удается прочитать свойство ‘0’ из неопределенного»

Спасибо

Ответ №1:

Я понял, что асинхронность / ожидание с помощью .then были избыточными, поэтому я изменил свою выборку на это:

     async function getProjects(){
    let response = await fetch(`${config.api.invokeUrl}/users/${11111}`);
    let data = await response.json();
    setProjects(data.projects)
     };
 
  

Создал переменную goals и создал для нее троичную:

     const goals = projects[current].goals
let createGoal = goals ? goals.map(goal => {
    return <Goal 
        goalDetails={goal} 
        projectManager={projectManager}
        index={index  }
        />
})
: 'loading'
  

И, наконец, мне пришлось изменить свое начальное состояние, чтобы оно было объектом внутри массива. Это не сработает, если просто пустой массив, object или null

     const [projects, setProjects] = useState([{}]);