Проблема: Я хочу написать программу, которая добавляет новую карту при нажатии кнопки. Я могу подключиться и изменить состояние, но нет новых карт. (Нет проблем, что значение в состоянии постоянное. Главное — это формирование новой карты).
Выше есть два разных компонента. Когда кнопка нажата (такое же состояние), я хочу, чтобы была создана новая карта. Но я не мог написать код.
карта.jsx
import React from 'react'
import CardStyle from '../cardStyle/cardStyle';
class Card extends React.Component {
constructor(props){
super(props);
this.state = {
isLoading: true,
imageUrl: null,
fullName: null,
job: null
};
}
clickEvent = () => {
this.setState({
fullName: 'Furkan',
job: 'Software engineer'
});
}
render() {
let {isLoading, imageUrl, fullName, job} = this.state;
return (
<div>
<CardStyle
isLoading = {isLoading}
imageUrl = {imageUrl}
fullName = {fullName}
job = {job}
clicked = {this.clickEvent}
/>
<button onClick = {this.clickEvent}>ADD PERSON</button>
</div>
)
}
}
export default Card;
cardStyle.jsx
import React, { Component } from 'react'
import classes from "./cardStyle.css";
import Wrap from "../../Wrap/Wrap";
class CardStyle extends Component {
state = {
image: null,
fullName: null,
job: null
};
createCard = () => {
return(
<div className = {classes.Card}>
<div className = {classes.Image}>{this.props.imageUrl}</div>
<div className = {classes.Title}>{this.props.fullName}</div>
<div className = {classes.Job}>{this.props.job}</div>
</div>
)
};
render() {
return (
<Wrap>
{this.createCard()}
</Wrap>
)
}
}
export default CardStyle;
Посмотрите на компоненты React List. Хороший способ сделать это — компонент CardList, который отображает массив компонентов Card.
Если вы хотите создавать новую карту каждый раз, когда вы нажимаете кнопку, вам следует создать массив карт, который сопоставляет каждую новую карту с компонентом. Таким образом, вы будете получать новую карту с каждым кликом вместо изменения старой карты.
import React from 'react'
import CardStyle from '../cardStyle/cardStyle';
class Card extends React.Component {
constructor(props){
super(props);
this.state = {
cards: [
{
isLoading: true,
imageUrl: null,
fullName: null,
job: null
}
]
};
}
clickEvent = () => {
const cards = [
...this.state.cards,
{
fullName: 'Furkan',
job: 'Software engineer'
}
]; // This will create a new array from the old one with a new additional value
this.setState({ cards });
}
render() {
const { cards } = this.state;
return (
<div>
{cards.map((card, index) => (
<CardStyle
key = {index}
isLoading = {card.isLoading}
imageUrl = {card.imageUrl}
fullName = {card.fullName}
job = {card.job}
/>
)}
<button onClick = {this.clickEvent}>ADD PERSON</button>
</div>
)
}
}
export default Card;
Первая карта пустая. Как я могу предотвратить это?
Вы можете удалить первую карту, просто оставив this.state = { cards: [] };
. Или вам необходима видимость первой карты перед кликом?
Когда вы вызываете метод clickEvent
, вы не добавляете другое значение к state
, а перезаписываете существующие: imgUrl
и fullName
.
Вам нужно создать массив карточек и отобразить их методом map
внутри return
.
Если первая карта пока пуста, вы можете начать с пустого массива в состоянии cards: []
и отображать компонент CardStyle
, только если this.state.cards.length > 0
.
Когда вы говорите «новая карта», что именно вы имеете в виду? В настоящее время у вас есть один объект Card. Нажатие на кнопку устанавливает пару значений, используемых для рендеринга этого объекта. Если вы хотите иметь несколько карт, то, вероятно, где-то у вас будет массив. Где вы это отслеживаете? Семантически я бы не ожидал, что компонент под названием
Card
будет набором карточек. Я ожидал, что это будет карта. И компонент, который его содержит, будет поддерживать коллекцию, а также функциональные возможности для изменения этой коллекции.