Как можно идентифицировать каждый дочерний компонент одного и того же типа, представленный одним и тем же родительским компонентом - PullRequest
0 голосов
/ 10 мая 2019

Я очень плохо знаком с React и не могу понять, как различать 2 разных дочерних компонента одного типа.

В моем случае я пытаюсь создать приложение, которое позволяет сравнивать цены попоследние 5 лет для 2 разных моделей автомобилей.

У меня есть 2 SelecComponent, в качестве опций имеются производители автомобилей в базе данных, и 2 SelecComponent, где мне нужно перечислить доступные модели автомобилей в базе данных для каждой извыбранные производители автомобилей, поэтому каждый из первых 2 SC должен управлять только одним из 2 SC, в которых хранятся модели автомобилей.

Обычно я бы идентифицировал компоненты SelecComponent по разным идентификаторам и манипулировал ими с помощью jQuery, но что было былучший способ сделать это в React?

Родительский компонент:

class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      carProducers: [],
      carModels: [],
      selectedProducer: null,
      selectedModel: null
    }
  }


  //function to retrieve the carmakers in order to initialize the drop down elements in the page
  componentDidMount(){
    axios.get("/AutoExposed/API/carmakers.php")
    .then(response => {
      var data = response.data
      this.setState({
        carProducers: parseCarProducers(data)
      })
    })
    .catch(error => {
      console.log(error)
    })
  }

  //function to retrieve the car models once the car producer has been selected
  carProducerSelected1 = (selectedValue) =>{
    this.setState({selectedProducer: selectedValue}, () =>{
      axios.get("/AutoExposed/API/carmodels_GET.php?carmaker=" + this.state.selectedProducer.value)
      .then(response => {
        var data = response.data
        this.setState({
          carModels: parseCarModels(data)
        }) 
      })
      .catch(error => {
        console.log(error)
      })
    })   
  }

  carModelSelected = (selectedValue) => {
    this.setState({selectedModel: selectedValue}, ()=>{
      console.log(`The car model has just been selected: `, this.state.selectedModel.value)
    })
  }

  render(){
    return (
      <div className="App">
        <div className="container">
          <div className="row">
            <div className="col-lg-3 col-md-6 col-sm-12 col-sm-12">
            </div>
            <div className="col-lg-3 col-md-6 col-sm-12 col-sm-12">
              <SelectComponent selectOptions={this.state.carProducers} onOptionSelected={this.carProducerSelected}/>
            </div>
            <div className="col-lg-3 col-md-6 col-sm-12 col-sm-12">
              <SelectComponent selectOptions={this.state.carProducers} onOptionSelected={this.carProducerSelected}/>
            </div>
            <div className="col-lg-3 col-md-6 col-sm-12 col-sm-12">

            </div>
          </div>

          <div className="row">
            <div className="col-lg-3 col-md-6 col-sm-12 col-sm-12">

            </div>
            <div className="col-lg-3 col-md-6 col-sm-12 col-sm-12">
            <SelectComponent selectOptions={this.state.carModels} onOptionSelected={this.carModelSelected}/>
            </div>
            <div className="col-lg-3 col-md-6 col-sm-12 col-sm-12">
              <SelectComponent selectOptions={this.state.carModels} onOptionSelected={this.carModelSelected}/>
            </div>
            <div className="col-lg-3 col-md-6 col-sm-12 col-sm-12">

            </div>
          </div>

          <div className="row">
            <div className="col-lg-9 col-md-9 col-sm-12 col-sm-12">
              <ChartComp />
            </div>
          </div>
        </div>





      </div>
    );
  }

}

export default App;

Дочерний компонент:

Класс SelectComponent extends Component {state = {selectedOtptionState: null,}

optionWasSelected = (selectedOption) => {

    this.setState({selectedOtptionState: selectedOption}, () => {
        this.props.onOptionSelected(this.state.selectedOtptionState)
    })
}

render() {
    return (
        <Select 
            value={this.state.selectedOtptionState}
            onChange={this.optionWasSelected}
            options = {this.props.selectOptions} 
        /> 

    );
}

} экспорт по умолчанию SelectComponent;

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

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

Первый - поскольку у вас два разных автомобиля / производителя, вам потребуются переменные состояния для каждого из них, чтобы сохранить два разных значения и их модели (например, selectedMainProducer, selectedCompareProducer, mainCarModels, compareCarModels).Кроме того, в этом случае лучше иметь отдельные обработчики событий, чтобы различать, какой выбор используется, и установить соответствующее состояние:

<SelectComponent onOptionSelected={this.onMainProducerSelected} ... />
...
<SelectComponent onOptionSelected={this.onCompareProducerSelected} ... />
...

, а затем сохранить два различных значения и их модели в вашем состоянии, например:

onMainProducerSelected = (selectedValue) => {
  this.setState({
    selectedMainProducer: selectedValue,
  },() => {
    axios.get(api + this.state.selectedMainProducer.value).then(response => {
      var data = response.data
      this.setState({
        mainCarModels: parseCarModels(data), // <-- separate models
      });
    });
  });
}

onCompareProducerSelected = (selectedValue) => {
  this.setState({
    selectedCompareProducer: selectedValue,
  },() => {
    axios.get(api + this.state.selectedCompareProducer.value).then(response => {
      var data = response.data
      this.setState({
        compareCarModels: parseCarModels(data), // <-- separate models
      });
    });
  });
}

С этим вы затем визуализируете свои вторичные выборы на основе вашего состояния selectedMainProducer и selectedCompareProducer.

например,

<SelectComponent selectOptions={this.state.mainCarModels} ... />
...
<SelectComponent selectOptions={this.state.compareCarModels} ... />
...
0 голосов
/ 10 мая 2019

Вам нужно вернуть данные обратно в массив, затем вам нужно отобразить их и для каждой итерации (объекта) в массиве дать ему компонент.и в компоненте вы передадите ему информацию о текущих итерациях (распространяя информацию о текущем элементе в объекте компонентов компонентов) и отобразите ее в компоненте.

apiData.map(item,index)=>{ return <CarComponent {...item} key={index}/>})

теперь у вас естьвся информация о текущих автомобилях передается в реквизит, и вы можете отображать информацию

const CarComponet=props => {

      return (
          <div>

            <h1>{props.title} </h1>
              <p>{props.carMake} </p>
              <p>{props.carYear} </p>
              <p>{props.carPrice} </p>
         </div>

             )

}

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