Сопоставление массива в объектном машинописном /Реагировать

#reactjs #typescript

#reactjs #машинописный текст

Вопрос:

Я новичок в typescript и React. Идея проекта состоит в том, чтобы получить некоторую информацию из созданного мной файла JSon (на обратной стороне) и отобразить их на карточках (спереди).

Я пытаюсь передать реквизиты из cards?.items.map единственного, я не знаю, какой правильный для получения информации cards.items (cards.items объявлен в файле cards.decl.ts )

cards.decl.ts :

 export type ICards = {
  title: string;
  items: ICardItems;
  urlSuffixe: string;
};

export type ICardItem = {
  id: number;
  img: string;
  gender: string;
  name: string;
};

export type ICardItems = ICardItem[];
 

Home.tsx :

 import React, { useState, useEffect } from "react";
import axios from "axios";
import Cards from "../Cards/Cards";
import { ICardItems, ICards } from "../../decl";
import { getCards } from "../../api";
import "./Home.css";

interface AppState {
  cards: ICards | undefined;
}

const Home = () => {
  const [appCards, setAppCards] = useState<AppState>();

  const fetchCards = async () => {
    const cardsPages = await getCards();
    setAppCards({ cards: cardsPages });
  };
  console.log(appCards);

  useEffect(() => {
    fetchCards();
  }, []);

  return (
    <div className="home">
      <Cards cards={appCards} />
    </div>
  );
};

export default Home;
 

Cards.tsx

 import React, { FC, useState } from "react";
import ListCard from "../ListCard/ListCard";
import { getCards } from "../../api/index";
import { ICardItems, ICards } from "../../decl";
import "./Cards.css";

export interface CardsProps {
  cards: ICards | undefined;
}

const Cards = ({ cards }: CardsProps) => {
  return (
    <section className="section cards">
      <div className="cards__wrap container">
        <div className="section__title">
          <h1>{cards?.title}</h1>
        </div>
        {cards?.items.map((card: ICardItem) => {
         <ListCard
          key={card.id}
          id={card.id}
          img={card.img}
          gender={card.gender}
          name={card.name}
         />;
    })}
      </div>
    </section>
  );
};

export default Cards;
 

Листкарта.tsx

 import React, { FC, useState } from "react";
import { useGlobalContext } from "../../context";
import { ICardItems, ICards } from "../../decl";
import "./ListCard.css";

export interface CardsProps {
  cards: ICards | undefined;
}
const ListCard: React.FC<CardsProps> = () => {
 

Ответ №1:

Я не совсем понимаю, о чем вы здесь спрашиваете, но я вижу проблему с вашей функцией map — она ничего не возвращает!

Изменение

 {cards?.items.map((card: ICardItem) => {
         <ListCard
          key={card.id}
          id={card.id}
          img={card.img}
          gender={card.gender}
          name={card.name}
         />;
    })}
 

Для

 {cards?.items.map((card: ICardItem) => {
         return <ListCard
          key={card.id}
          id={card.id}
          img={card.img}
          gender={card.gender}
          name={card.name}
         />;
    })}
 

Возможно, вас смутил синтаксис функции со стрелкой, который будет выглядеть так

 {cards?.items.map((card: ICardItem) => <ListCard key={card.id} id={card.id} img={card.img} gender={card.gender} name={card.name}/>)}
 

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

1. Я исправил то, что вы сказали, действительно, это лучше! Для компонента ListCard, вызываемого на карте, я получаю следующее сообщение: Элемент ListCard не имеет обязательных карточек атрибутов, а для реквизитов, объявленных в ListCard (id, img, gender …) Я понимаю: TS2322: тип ‘{ ключ: номер; идентификатор: номер; img: строка; пол: строка; имя: строка; }’ не может быть присвоен типу ‘IntrinsicAttributes amp; CardsProps amp; { дочерние элементы?: ReactNode; }’. Свойство ‘id’ не существует для типа ‘IntrinsicAttributes amp; CardsProps amp; { дочерние элементы?: ReactNode; }’.

2. @CH да, ваш компонент ListCard принимает только один реквизит: объект типа {cards: iCard} . Он не ожидает реквизитов, которые вы ему передаете

3. это моя проблема :,) Я хотел бы получить реквизит из iCards И из ICardsItem. (первый код, который я отправил

4. Нет, я не совсем понимаю, что ты имеешь в виду. Существует только один тип объекта, который вы собираетесь получить из функции map() в cards.items массиве, и это объект, который выглядит { cards: ICards } следующим образом.

5. Рассматривая это поближе, почему бы вам просто не изменить реквизит компонента ListCard на один ICardItem? Кажется, это (если я правильно понимаю) то, чего ты хочешь … ?