#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? Кажется, это (если я правильно понимаю) то, чего ты хочешь … ?