Как получить данные из объекта массива javascript / JSON и использовать их в React JS

Как я уже сказал в комментарии, .col-md-* работает для vw> = 768, поэтому выглядит правильно для меня. См. здесь .

Вернемся к вашему коду, вам нужно пройти один уровень с классами сетки. Кроме того, чтобы сделать работу .order-*, вам нужно использовать числа (см. здесь ). Попробуйте изменить свои классы следующим образом:

...

Проверить обновленные Fiddle

-1
задан Asad Javed 19 January 2019 в 16:29
поделиться

1 ответ

Сначала вам нужно разобрать значения транспортного средства в отдельные массивы элементов опций JSX. Я предпочитаю делать это с помощью функции приведения ...

const vehicles = this.state.veh_data.reduce((acc, veh) => {
      let make = Object.keys(veh)[0],
          vehModels = veh[make];

      return {
            makes: [
                  ...acc.makes,
                  <option value={make}>{make}</option>
            ],
            models:[
                  ...acc.models,
                  ...vehModels.map(model => {
                       return <option value={model}>{model}</option>
                  })
            ]  
       };
},{makes:[], models:[]});

Поскольку каждый элемент в вашем массиве veh_data является объектом, вам необходимо получить доступ к его первому (и единственному) свойству с помощью Object.keys (), чтобы получить все ключи объекта, а затем просто захватить первый (и единственный) ключ.

Доступ к модели можно получить, получив значение этого ключа в каждом объекте, над которым вы перебираете

...

<FormGroup>
      <Input type="select" name="select1" id="select1">
      <option selected disabled>Make</option>
      {vehicles.makes}
      </Input>
</FormGroup>

...

<FormGroup>
  <Input type="select" name="select2" id="select2">
        <option selected disabled>Model</option>
        {vehicles.models}
  </Input>
</FormGroup>

...

Учитывая контекст, я также не вижу необходимости хранить veh_data в состоянии компонента, что является пустой тратой ресурсов, если только эти данные не будут обновлять пользовательский интерфейс динамически, поэтому это будет полное решение .... [ 1113]

https://jsfiddle.net/mfpv1L6s/

(ПРИМЕЧАНИЕ: я понимаю, что это не даст вам полного решения, которое вы «должны» искать, как покажет варианты моделей для каждого транспортного средства, а не только модели, относящиеся к выбранной в настоящий момент марке, но это должно стать хорошей отправной точкой для вас.)

ДОПОЛНИТЕЛЬНЫЙ КРЕДИТ: Я бы также проанализировал этот вариант ценности представления чему-то более привлекательному, как это ...

keyToOption(key){
        return key.split('-')
                .map(word=> word.slice(0,1).toUpperCase + word.slice(1))
                .join(' ');
 }

Затем добавьте его в функцию приведения, как это ...

makes: [
    ...acc.makes,
    <option value={make}>{this.keyToOption(make)}</option>
],

Я включил вышеупомянутое в JSFiddle

(Полный рабочий пример ....)

import React, { Component } from "react";
import { Form, FormGroup, Input } from "reactstrap";
// import { veh_data } from '../shared/vehicle_make_and_models'
const veh_data = [
  { "alfa-romeo": ["145", "90", "Alfa 6", "Alfasud"] },
  { "aston-martin": ["15", "2-Litre", "AM Vantage", "Atom", "Cygnet", "DB2"] },
  { audi: ["100", "200", "A1", "A2", "A3", "A4", "A5", "A6", "A7"] }
];

const vehicles = parseVehicleList(veh_data)

class ImgAndForm extends Component { 
  state = { modelSelected: null };

  handleSearch(event) {
    alert("Search button clicked");
    event.preventDefault();
  }

  handleModelChange(event) {
    console.log(event.target.value);
    this.setState({ modelSelected: event.target.value });
  }

  render() {
    const selectedModels =
      this.state.modelSelected && this.state.modelSelected.length ? (
        vehicles.models[this.state.modelSelected]
      ) : (
        <option value="">(Please Select Make)</option>
      );

    return (
      <div>
        <header className="headerbg d-flex">
          <div className="container my-auto">
            <div className="row">
              <div className="offset-1 col-10 offset-lg-0 col-lg-4">
                <div id="search-form-div" className="container">
                  <div className="row">
                    <div className="col-12 my-4">
                      <h3>Search</h3>
                      <Form onSubmit={this.handleSearch}>
                        <FormGroup>
                          <Input
                            onChange={e => this.handleModelChange(e)}
                            type="select"
                            name="select1"
                            id="select1"
                          >
                            <option value="">Make</option>
                            {vehicles.makes}
                          </Input>
                        </FormGroup>
                        <FormGroup>
                          <Input type="select" name="select2" id="select2">
                            {selectedModels}
                          </Input>
                        </FormGroup>
                        <FormGroup>
                          <Input type="select" name="select3" id="select3">
                            <option value="">Min Price</option>
                            <option value="500">500</option>
                          </Input>
                        </FormGroup>
                        <FormGroup>
                          <Input type="select" name="select4" id="select4">
                            <option value="">Max Price</option>
                            <option value="2000">2000</option>
                          </Input>
                        </FormGroup>
                        <FormGroup>
                          <Input
                            type="submit"
                            name="search"
                            id="search"
                            className="btn btn-primary"
                            value="Search"
                          />
                        </FormGroup>
                      </Form>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </header>
      </div>
    );
  }
}

export default ImgAndForm;

function parseVehicleList(data) {
  return data.reduce(
    (acc, veh, i) => {
      let make = Object.keys(veh)[0],
        vehModels = veh[make];

      return {
        makes: [
          ...acc.makes,
          <option key={make + i} value={make}>
            {keyToOption(make)}
          </option>
        ],
        models: {
          ...acc.models,
          [make]: vehModels.map((model, i) => {
            return (
              <option key={make + model + i} value={model}>
                {keyToOption(model)}
              </option>
            );
          })
        }
      };
    },
    { makes: [], models: {} }
  );
}

function keyToOption(key) {
  return key
    .split("-")
    .map(word => word.slice(0, 1).toUpperCase() + word.slice(1))
    .join(" ");
}
0
ответ дан cantuket 19 January 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: