Попытка построить чемпион Выберите экран с помощью React - PullRequest
0 голосов
/ 04 мая 2020

Я все еще изучаю React и пытаюсь построить экран выбора чемпиона (в данном случае это имя hashiras). Я беру данные из массива в приложении «Реакция» и пытаюсь выбрать один из них, чтобы отобразить переключатель, в котором был выбран этот чемпион (хашира). Однако я немного запутался в состоянии и пытался отобразить имя выбранной хаширы среди четырех, которые у меня есть в массиве. Также мои изображения не отображаются.

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

Моя последняя цель - переключить форму для ввода собственного имени пользователя после того, как выбрана хасира, которую я попробую сам.

import React, {Component} from 'react';
import ReactDOM from 'react-dom';
import {render} from 'react-dom';
import {rengokuimg} from './Images/rengokuIMG.png';
import {sanemiimg} from './Images/rengokuIMG.png';
import {shinobuimg} from './Images/rengokuIMG.png';
import {giyuuimg} from './Images/rengokuIMG.png';


let hashiraList=[
    {"name":"Rengoku Kyojiro", "description":"Flame Hashira", "age":20, "element":"Flame","imgsource":rengokuimg,"Choice":"Rengoku Chosen"},
    {"name":"Giyuu Tomioka", "description":"Water Hashira", "age":21, "element":"Water","imgsource":giyuuimg,"Choice":"Giyuu Chosen"},
    {"name":"Sanemi Shinazugawa", "description":"Wind Hashira", "age":22, "element":"Wind","imgsource":sanemiimg,"Choice":"Sanemi Chosen"},
    {"name":"Shinobu Kocho", "description":"Insect Hashira", "age":22, "element":"Poison","imgsource":shinobuimg,"Choice":"Shinobu Chosen"}
]

const Hashira =({name, description,element,age,imgsource,Choice}) => {
    return(
        <section>
            <h2>Name: {name}</h2>
            <p>Description: {description}</p>
            <div><img src={imgsource}/></div>
            <p>Element: {element}</p>

            {/* <button onClick={()=>console.log({name},console.log({age}))}>Choose </button> */}
            <button onClick={()=>console.log({Choice})}>Select the {element} hashira</button>
        </section>
    )
}
const NotSelected=()=>
    <div>
        <h1>No Hashira Selected.</h1>
    </div>


const Selected=()=>
    <div><h2>You have chosen hashira</h2></div>

class HashiraSelect extends React.Component{
    state = {
        Chosen : false,
        formdisplay :false,
        selected:false
    }
    toggleOpenClosed({name}){
        this.setState({
            Chosen: !this.state.Chosen,
            selected: {name}
        })
    }
    render(){
        console.log(this.state)
        const {hashiras} = this.props
        return(
            <div>
                {this.state.selected ? <Selected/> : <NotSelected/>}
                            {/* <h1> Have you chosen a Hashira : {this.state.Chosen ? 'Chosen' : 'Not yet'}</h1> */}

            {hashiras.map(
                (hashira, idx) =>
                 <Hashira 
                 key={idx} 
                 name={hashira.name} 
                 description={hashira.description} 
                 age={hashira.age} 
                 element={hashira.element}
                 Choice={hashira.Choice}
                 imgsource={hashira.imgsource}
                 Selected={this.state.Selected}
                 />
            )}
            {/* <button onClick ={this.toggleOpenClosed}>Choose</button> */}


        </div>
        )
    }
}

{/* <Hashira name="Sanemi" description="The wind Hashira." element="Wind"/> */}

render(

    <HashiraSelect hashiras={hashiraList}/>,


    document.getElementById('root')
)

Еще раз спасибо за помощь.

Ссылка в песочнице

1 Ответ

1 голос
/ 04 мая 2020

Обработчик onChange должен быть создан в HashiraSelect. Передайте этот обработчик как опору компоненту Hashira. Когда нажата кнопка button, передайте выбранное значение hashira обработчику onChange и установите его в состояние.

Проверьте РАБОЧИЙ ДЕМО

const Hashira = ({
  name,
  description,
  element,
  age,
  imgsource,
  Choice,
  onChange
}) => {
  return (
    <div>
      <section>
        <h2>Name: {name}</h2>
        <p>Description: {description}</p>
        {/* <div><img src={rengokuimg}/></div> */}
        <p>Element: {element}</p>

        {/* <button onClick={()=>console.log({name},console.log({age}))}>Choose </button> */}
        <button onClick={() => onChange(Choice)}>
          Select the {element} hashira
        </button>
      </section>
    </div>
  );
};

class HashiraSelect extends React.Component {
  state = {
    Chosen: false,
    formdisplay: false,
    choice: null
  };
  toggleOpenClosed() {
    this.setState({
      Chosen: !this.state.Chosen
    });
  }

  onChange = choice => {
    this.setState({ choice, Chosen: true });
  };
  render() {
    console.log(this.state);
    const { hashiras } = this.props;
    const { choice } = this.state;
    return (
      <div>
        <h1>
          Have you chosen a Hashira : {this.state.Chosen ? "Chosen" : "Not yet"}
        </h1>
        {choice && <h2>{`Hashira Chosen:${choice}`}</h2>}
        {hashiras.map((hashira, idx) => (
          <Hashira
            key={idx}
            name={hashira.name}
            description={hashira.description}
            age={hashira.age}
            element={hashira.element}
            Choice={hashira.Choice}
            onChange={this.onChange}
            //  imgsource={hashira.imgsource}
            Selected={this.state.Selected}
            //  Choice={this.state.Chosen}
          />
        ))}
        {/* <button onClick ={this.toggleOpenClosed}>Choose</button> */}
      </div>
    );
  }
}

//  <Hashira name="Sanemi" description="The wind Hashira." element="Wind"/>

render(
  <HashiraSelect hashiras={hashiraList} />,

  document.getElementById("root")
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...