Булевый тип в state React

Собственно, есть такой код на React:

import './App.css';
import Car from './Car/Car';
import { useState } from 'react';

function App() {
  const state = {
    cars: [
      {name: 'Ford Focus', year: 2016},
      {name: 'Audi A7', year: 2019},
      {name: 'Mazda CX5', year: 2017}
    ]
  }

  const [ pageTitle, setPageTitle ] = useState('Cars');
  const changeTitleHandler = newTitle => {
    setPageTitle(newTitle);
  }

  const [ showCars, setShowCars ] = useState(false);
  const toggleCarsHandler = () => {
    setShowCars(!showCars);
  }

  const divStyle = {
    textAlign: 'center',
  }

  return (
    <div style={divStyle}>
      <h2>{pageTitle}</h2>
      <button onClick={toggleCarsHandler}>Toggle</button>
      { state.showCars
          ? state.cars.map((car, i) => {
            return (
              <Car 
                key={i}
                name={car.name}
                year={car.year}
                onChangeTitle={() => changeTitleHandler(car.name)}
              />
            )
          }) 
        : null
      }
    </div>
  );
}

export default App;

Я хочу реализовать следующую логику: раньше мой код просто выводил информацию про машины, теперь я хочу, чтобы это происходило по нажатию на кнопку, а при повторном нажатии хочу информацию снова скрывать. Для этого я через тернарный оператор проверяю значение showCars (true-вывести, false - скрыть):

{ state.showCars
          ? state.cars.map((car, i) => {
            return (
              <Car 
                key={i}
                name={car.name}
                year={car.year}
                onChangeTitle={() => changeTitleHandler(car.name)}
              />
            )
          }) 
        : null
      }

И непосредственно используемая мной функция toggleCarsHandler, которая меняет значение state:

  const [ showCars, setShowCars ] = useState(false);
  const toggleCarsHandler = () => {
    setShowCars(!showCars);
  }

Непосредственно вопрос: почему сам showCars не появился в State? VsCode дает мне такую подсказку на 32 строке, но я ничего не смог придумать. Буду благодарен за объяснения


Ответы (1 шт):

Автор решения: Slavik

Объявленная переменная (константа) state в коде - это просто объект, который не имеет отношения к реактовскому состоянию и вызов функции (хука) useState никак не влияет на этот объект.

В данном коде достаточно использовать showCars, как уже подсказали в комментариях к вопросу. Также рекомендую к прочтению документацию про хук состояния.

Там как раз в примерах есть описание состояния в качестве свойства класса и аналогичное использование хука в функциональных компонентах.

Использование состояния в классах:

this.state = {showCars: true};
this.setState({showCars: !this.state.showCars});

Эквивалентно использованию хука в функциональных компонентах:

const [showCars, setShowCars] = useState(true);
setShowCars(!showCars);
→ Ссылка