@YAHEFID

Как подгрузить данные из объекта?

Имеется такой объект, он будет у нас в redux. Объект менять не нужно.
const initialState = {
  0: [
    {
      comment: '1 сезон',
      folder: [
        {
          comment: '1 серия'
        },
        {
          comment: '2 серия'
        }
      ]
    },
    {
      comment: '2 сезон',
      folder: [
        {
          comment: '1 серия'
        },
        {
          comment: '2 серия'
        },
        {
          comment: '3 серия'
        }
      ]
    }
  ]
}

Так есть компонент ItemList, это кнопочки:
const ItemList = ({ items }) => {
  const [active, setActive] = React.useState(0);

  return (
    <ul className="items">
      {items.map(({ comment }, index) => (
        <li
          key={index}
          className={active === index ? 'item active' : 'item'}
          onClick={() => setActive(index !== active ? index : -1)}
        >
          {comment}
        </li>
      ))}
    </ul>
  );
};

Используя я сейчас его на данный момент так:
const View = () => {
  return (
    <div className="content">
      <ItemList items={obj[0]} /> // Тут я хочу выгрузить все сезоны
      <ItemList items={obj[0][1]['folder']} /> // тут я хочу выгрузить все серии к сезону, который выбран у нас в active
    </div>
  );
};

Так вот, как мне выгрузить сезоны и все серии к сезону который у нас выбран? Скорее всего, активный элемент я собираюсь вынести в redux. Но так же не знаю как правильно сделать, у нас один компонент, но используются он для двух по факту задач. Выбрать сезон и выбрать серию. Сейчас конечно клики работают на все два этих компонента которые создал.

Объясню в двух словах, что я хочу сделать: есть сериал и вот у вас есть возможность выбрать сезон и серию.
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 1
0xD34F
@0xD34F Куратор тега React
Объект менять не нужно.

Нужно.

Так будет лучше, просто поверьте:

const SERIES = [
  {
    comment: '1 сезон',
    folder: [
      { comment: '1 серия' },
      { comment: '2 серия' },
    ],
  },
  {
    comment: '2 сезон',
    folder: [
      { comment: '1 серия' },
      { comment: '2 серия' },
      { comment: '3 серия' },
    ],
  },
];

const ItemsList = ({ header, items, active, onChange }) => (
  <div>
    <h3>{header}</h3>
    <ul className="items">
      {items.map(({ comment }, i) => (
        <li
          className={`item ${active === i ? 'active' : ''}`}
          onClick={() => onChange?.(i !== active ? i : -1)}
        >
          {comment}
        </li>
      ))}
    </ul>
  </div>
);

function App() {
  const [ iSeason, setActiveSeason ] = useState(-1);
  const [ iEpisode, setActiveEpisode ] = useState(-1);
  const season = SERIES[iSeason];
  const episode = season?.folder[iEpisode];

  useEffect(() => {
    setActiveEpisode(-1);
  }, [ iSeason ]);

  return (
    <div>
      <ItemsList
        header="сезоны"
        items={SERIES}
        active={iSeason}
        onChange={setActiveSeason}
      />
      {season && <ItemsList
        header="серии"
        active={iEpisode}
        onChange={setActiveEpisode}
        items={season.folder}
      />}
      {episode && <div>Выбрали: {season.comment}, {episode.comment}</div>}
    </div>
  );
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы