Как поднять состояние с помощью события on-click

#reactjs

#reactjs

Вопрос:

У меня есть родительский и дочерний компоненты. Дочерний элемент изменяет цвет div и обновляет победителя и выбранные элементы в состоянии. У меня есть кнопка в моем родителе. При отправке мне нужно перенести данные победителя в массив в моем родительском компоненте и отправить их в Redux. Я попытался отправить обратный вызов, но поскольку мне уже нужно вызвать событие on-click внутри дочернего элемента, я не могу понять, как это сделать.

Родительский

 import React, { Component } from "react";
import MatchCard from "../MatchCard";
import Shuffler from "../Shuffler";

class TournamentGrid extends Component {
  constructor(props) {
    super(props);

    this.state = {
      winners: [],
    };
  }

  render(playerNames) {
    let shuffled = Shuffler(this.props.playerNames);

    let newArr = shuffled.reduce(function (result, value, index, array) {
      if (index % 2 === 0) result.push(array.slice(index, index   2));
      return resu<
    }, []);

    console.log(newArr);

    return (
      <div className="inline-block flex justify-center">
        <div className="ml-2 mr-2">
          {newArr.map((players, index) => (
            <>
              <MatchCard
                key={index}
                players={players}
                handleWinner={this.handleMatchCard}
              />
            </>
          ))}
          <div className="inline-block flex justify-center">
            <button
              className="m-6 block bg-blue-500 hover:bg-blue-400 text-white font-bold py-2 px-4 border-b-4 border-blue-700 hover:border-blue-500 rounded w-55"
              onClick={this.handleClick}
            >
              {shuffled > 2 ? "Next Round" : "Final"}
            </button>
          </div>
        </div>
      </div>
    );
  }
}

export default TournamentGrid;

  

Дочерний элемент

 import React, { Component } from "react";
import PlayerCard from "./PlayerCard";
import Shuffler from "./Shuffler";

class MatchCard extends Component {
  constructor(props) {
    super(props);

    this.state = {
      selected: 0,
      winner: "",
    };
  }

  render(key, players) {
    let arr = this.props.players;
    return (
      <div className="mt-4 mb-4">
        <>
          <PlayerCard
            player={arr[0]}
            selected={this.state.selected === 1}
            handleClick={() => this.setState({ selected: 1, winner: arr[0] })}
          />
          <PlayerCard
            player={arr[1]}
            selected={this.state.selected === 2}
            handleClick={() => this.setState({ selected: 2, winner: arr[1] })}
          />
        </>
      </div>
    );
  }
}

export default MatchCard;
  

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

1. … Вызовите функцию, которую вы передаете в обработчике щелчка?

2. Вы имеете в виду объявление функции в родительском элементе?

3. … Вы уже передаете свойство, this.handleMatchCard . Это должно быть определено во время его передачи, да.

Ответ №1:

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

 // This method is defined on the Parent component.
const handleWinnerSelect = (card, selected) => {
    this.setState(e => {
        // u need to handle how the selected element is pushed on the array
        // and how remove the previous one.
        const new_state = {...e}
        new_state.push(selected)
        return new_state
    });
}
  

теперь в методе рендеринга вы можете отображать дочерние элементы с помощью этого метода в качестве реквизита. итак
, на карточке соответствия вы обрабатываете событие щелчка и вызываете handleWinnnerSelect