Как уже говорили другие - встроить его в повторно используемые компоненты.Начните с определения мест, где вы повторяете себя и извлекаете их.С практикой это становится легче.
Я бы начал с Карты.Вы можете использовать тип карты (вы также можете использовать интерфейс, но это личное предпочтение), а затем добавить обработчик onClickExpand, чтобы сформировать реквизиты для этого элемента управления.
type Item = {
user: string;
}
type Card = {
items: Item[];
expanded?: boolean;
numItemsShowing: number;
}
type CardProps = Card & {
onClickExpand: () => void;
};
const Card = (props: CardProps) => {
const { expanded, items, numItemsShowing, onClickExpand } = props;
return (
<div>
{items.slice(0, numItemsShowing).map((data, i) => (
<p key={i}>{data.user}</p>
))}
<a onClick={onClickExpand}>
{expanded
? <span>Show less</span>
: <span>Show more</span>
}
</a>
</div>
);
}
Тогда ваше приложение может быть проще:
type State = {
card: Card[];
}
export default class App extends React.Component<{}, State> {
state = { cards: [] };
showMore = (index: number) => () => {
this.setState({
cards: this.state.cards.map((card, i) => {
// Only modify card if it's the index we care about
if (i === index) {
return {
...card,
expanded: true,
}
}
return card;
})
});
}
addCard = () => {
const newCard = {
items: [],
expanded: false,
numItemsShowing: 0
};
this.setState({
cards: [ ...this.state.cards, newCard ] // add to end of array
});
}
render() {
return (
<div>
{this.state.cards.map((card, i) =>
<Card
{...card}
onClickExpand={this.showMore(i)}
key={i}
/>
)}
<button onClick={this.addCard}>Add Card</button>
</div>
)
}
}
Это приложение позволяет нажать кнопку, чтобы добавить новую карту в штат.