React.js , используя функцию find() для поиска по состоянию

#javascript #arrays #reactjs #find

#javascript #массивы #reactjs #Найти

Вопрос:

Я столкнулся с проблемой при попытке найти объект в массиве объектов (который также является состоянием) с помощью метода find(). Интересно, что при использовании того же кода, за исключением случаев, когда массив объектов присваивается постоянной переменной (что означает, что это не состояние), все работает нормально. Я работал над состоянием, каким оно было, затем я работал над копией состояния, но безрезультатно. Здесь я пересылаю весь компонент React, несколько упрощенный для целей этого запроса (первоначально я извлекаю этот массив с сервера и, используя один идентификатор, хочу распечатать другие свойства данного объекта):

 import React, { useState } from "react";
import "./App.css";

function About() {
  const [posts, setPosts] = useState([]);

  const post = [
    { userId: 1, id: 1, title: "sunt", author: "Tom" },
    { userId: 1, id: 2, title: "qui est esse", author: "Tom" },
    { userId: 1, id: 3, title: "ea molestias", author: "Tom" },
    { userId: 1, id: 4, title: "eum et est occaecati", author: "Tom" },
  ];

  const button = <button onClick={() => setPosts(post)}>Click me</button>;
  //id of one of the object
  const ItemId = 2;
  console.log(posts);
  //trying to find the object that has id: 2 an then print other
  //  key -values pairs from that prticular object
  let copyState = [...posts];
  console.log(["state copied"], copyState);
  let bla = copyState.find((item) => item.id === ItemId);
  console.log(bla);
  // pritns: {userId: 1, id: 2, title: "qui est esse",author: "Tom"}

  // console.log(bla.title)
  //prints : undefined

  // console.log(bla.author)
  //prints: undefined
  //console.log(typeof 'bla')
  // prints: string

  return (
    <div>
      <h1>About Page</h1>
      {button}
    </div>
  );
}

export default About;

 

Нажатие на кнопку загружает состояние, а затем путем раскомментирования консоли.начнут появляться ошибки журнала. Первый console .log (bla) печатает правильный объект с идентификатором has ana: 3. Но затем следующая консоль.журналы пытаются распечатать другие свойства из этого объекта, и это вызывает ошибки. Как я упоминал ранее, когда я делал то же самое, но не в состоянии, я смог получить доступ к этим другим свойствам, используя точечную нотацию, например, bla . автор и имя «Том» были напечатаны на консоли. Ценю любую помощь здесь, большое спасибо

Комментарии:

1. спасибо большое, это помогло!

Ответ №1:

Я попытался запустить ваш код и работает, как ожидалось. Давайте проверим код:

Когда компонент отображается в первый раз, posts устанавливается как пустой массив.

Затем вы пытаетесь получить find элемент из posts with id 2 и сохранить его как bla переменную.

Поскольку posts пусто, bla является undefined . Затем вы пытаетесь прочитать title и author свойство bla , но поскольку bla оно не определено, у вас возникает ошибка : TypeError: Cannot read property 'title' of undefined .

Если вы условно регистрируете свойства (пример использования необязательной цепочки), код будет работать, и компонент будет отображаться правильно. Затем, после нажатия кнопки, posts состояние устанавливается в массив объектов, find функция вернет объект, и в ваших журналах будут показаны правильные данные.

Просто еще один совет: последний console.log: typeof 'bla' , должен быть typeof bla без '

Ответ №2:

Я нашел основную причину ошибки. При рендеринге компонента posts отображается пустой массив и console.log(bla.title) попробуйте получить доступ к заголовку из объекта bla. Так что либо вам нужно скопировать начало после щелчка, либо попытаться использовать optional chaining operator заголовок для доступа, например console.log(bla?.title)

Комментарии:

1. Спасибо большое, это помогло

2. извините, приятель, это не позволяет мне голосовать, по-видимому, я этого еще не заработал. Я вернусь сюда, когда смогу

Ответ №3:

При первоначальном отображении значение bla равно null, поскольку массив posts is empty [] . Обработайте случай, когда find нет результата, проверив значение null. Попробуйте фрагмент.

 function About() {
  const [posts, setPosts] = React.useState([]);

  const post = [
    { userId: 1, id: 1, title: "sunt", author: "Tom" },
    { userId: 1, id: 2, title: "qui est esse", author: "Tom" },
    { userId: 1, id: 3, title: "ea molestias", author: "Tom" },
    { userId: 1, id: 4, title: "eum et est occaecati", author: "Tom" },
  ];

  const button = <button onClick={() => setPosts(post)}>Click me</button>;

  
  const ItemId = 2;
  console.log(posts);

  let copyState = [...posts];
  console.log(["state copied"], copyState);

  let bla = copyState.find((item) => item.id === ItemId);
  console.log(bla);

  if (bla) {
    console.log(bla.title)
    console.log(bla.author)
  } else {
    console.log('bla is null/undefined');
  }

  return (
    <div>
      <h1>About Page</h1>
      {button}
    </div>
  );
}


ReactDOM.render(<About />, document.getElementById('app')); 
 <script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>

<div id="app"></div>