@timofeus91
Junior Frontend Developer

Как осуществить перезапись useState([]) с 1 раза?

Всем доброго времени суток. Продолжение моего предыдущего вопроса. Делаю задание на React. Есть функция которая добавляет отсортированные данные в массив для рендера карточек и в этой же функции идет проверка для изменения текста. Рендер происходит корректно, но сам массив в const [cards, setCards] перезаписывается только если кнопка поиска нажата 2 раза. С 1 раза массив остается таким-же как и был и из-за этого не меняется корректно текст. При этом в функцию обязательно нужно передавать параметр data (это обычная строка из input поиска). Подскажите, пожалуйста, что я упустил?

const [cards, setCards] = React.useState([]);
 const [inputValue, setInputValue] = React.useState('Поиск');

function handleStartSearch(data) {
  
  setCards(!data ? [] : dataJson.result.filter(item =>
          (item.title.includes(data) || item.author_lastName.includes(data)
         || item.author_firstName.includes(data)))
  )
    console.log(cards);
  if(cards.length > 0) {
    setInputValue(`По вашему запросу '${data}' мы нашли`)
  }
  else {
    setInputValue(`По вашему запросу '${data}' мы ничего не нашли`)
  }
}
  • Вопрос задан
  • 552 просмотра
Решения вопроса 1
@dm1sh
В React операция setstate не синхронная, то есть, результат применения setCards будет виден только при перерендере компонента. Если вы хотите получить изменённый массив cards, то вам нужно либо создать временную переменную для этих данных и потом передать её в setCards:
const computedCards = // выражение, которое вы кладёте в setCatds
setCards (computedCards);
 console.log(computedCards);

Либо сделать чуть хитрее - следить за измением cards с помощью useEffect хука:
React.useEffect(() => {
  console.log(cards);
}, [cards]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
28 нояб. 2024, в 14:38
250000 руб./за проект
28 нояб. 2024, в 14:33
70000 руб./за проект
28 нояб. 2024, в 14:18
1500 руб./за проект