Я не могу создать новую карту с реакцией

Проблема: Я хочу написать программу, которая добавляет новую карту при нажатии кнопки. Я могу подключиться и изменить состояние, но нет новых карт. (Нет проблем, что значение в состоянии постоянное. Главное — это формирование новой карты).

Выше есть два разных компонента. Когда кнопка нажата (такое же состояние), я хочу, чтобы была создана новая карта. Но я не мог написать код.


карта.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;

Когда вы говорите «новая карта», что именно вы имеете в виду? В настоящее время у вас есть один объект Card. Нажатие на кнопку устанавливает пару значений, используемых для рендеринга этого объекта. Если вы хотите иметь несколько карт, то, вероятно, где-то у вас будет массив. Где вы это отслеживаете? Семантически я бы не ожидал, что компонент под названием Card будет набором карточек. Я ожидал, что это будет карта. И компонент, который его содержит, будет поддерживать коллекцию, а также функциональные возможности для изменения этой коллекции.

David 20.06.2019 22:22

Посмотрите на компоненты React List. Хороший способ сделать это — компонент CardList, который отображает массив компонентов Card.

Kevin Welch 20.06.2019 22:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
540
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите создавать новую карту каждый раз, когда вы нажимаете кнопку, вам следует создать массив карт, который сопоставляет каждую новую карту с компонентом. Таким образом, вы будете получать новую карту с каждым кликом вместо изменения старой карты.

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;

Первая карта пустая. Как я могу предотвратить это?

user11264432 20.06.2019 22:38

Вы можете удалить первую карту, просто оставив this.state = { cards: [] };. Или вам необходима видимость первой карты перед кликом?

zilijonas 21.06.2019 06:50

Когда вы вызываете метод clickEvent, вы не добавляете другое значение к state, а перезаписываете существующие: imgUrl и fullName.

Вам нужно создать массив карточек и отобразить их методом map внутри return.

Если первая карта пока пуста, вы можете начать с пустого массива в состоянии cards: [] и отображать компонент CardStyle, только если this.state.cards.length > 0.

Другие вопросы по теме