【问题标题】:Mapping a nested array from JSON in react with a dropdown list从 JSON 映射嵌套数组以响应下拉列表
【发布时间】:2020-07-02 09:14:04
【问题描述】:

我正在我父亲的网站上制作一个表格,您可以在其中提交有关您的汽车的信息,然后您稍后会收到一封电子邮件,为您提供报价。

无论如何,在表格内有一个选择列表,您可以在其中选择您的汽车品牌,然后还有另一个选择列表提供所选汽车品牌的型号。我有一个包含汽车品牌及其各自型号的 JSON 文件,但我似乎无法让它按照我想要的方式运行。在这个版本的代码中,第二个下拉列表显示了列表中的所有车型,而不仅仅是选定的汽车品牌车型,因为经过多次尝试我无法找出正确的代码。任何帮助将不胜感激!

这是 JSON 文件 carModels.json 的 sn-p

    [
    {
      "brand": "Acura",
      "models": [
        "2.2CL",
        "2.3CL",
        "3.0CL",
        "3.2CL",
        "ILX",
        "Integra",
        "Legend",
        "MDX",
        "NSX",
        "RDX",
        "3.5 RL",
        "RL",
        "RSX",
        "SLX",
        "2.5TL",
        "3.2TL",
        "TL",
        "TSX",
        "Vigor",
        "ZDX"
      ]
    },
    {
      "brand": "Alfa Romeo",
      "models": [
        "164",
        "8C Competizione",
        "GTV-6",
        "Milano",
        "Spider"
      ]
    },
    {
      "brand": "AMC",
      "models": [
        "Alliance",
        "Concord",
        "Eagle",
        "Encore",
        "Spirit"
      ]
    },
    {
      "brand": "Aston Martin",
      "models": [
        "DB7",
        "DB9",
        "DBS",
        "Lagonda",
        "Rapide",
        "V12 Vantage",
        "V8 Vantage",
        "Vanquish",
        "Virage"
      ]
    },
    {
      "brand": "Audi",
      "models": [
        "100",
        "200",
        "4000",
        "5000",
        "80",
        "90",
        "A3",
        "A4",
        "A5",
        "A6",
        "A7",
        "A8",
        "allroad",
        "Cabriolet",
        "Coupe",
        "Q3",
        "Q5",
        "Q7",
        "Quattro",
        "R8",
        "RS 4",
        "RS 5",
        "RS 6",
        "S4",
        "S5",
        "S6",
        "S7",
        "S8",
        "TT",
        "TT RS",
        "TTS",
        "V8 Quattro"
      ]
    },
    {
      "brand": "Avanti",
      "models": [
        "Convertible",
        "Coupe",
        "Sedan"
      ]
    },
    {
      "brand": "Bentley",
      "models": [
        "Arnage",
        "Azure",
        "Brooklands",
        "Continental",
        "Corniche",
        "Eight",
        "Mulsanne",
        "Turbo R"
      ]
    }
  ]

我的代码

import React, { Component } from 'react'
import { Col, Button, Form, FormGroup, Label, Input, FormText, Row } from 'reactstrap'

import carModels from "./carModels"


export class carousel extends Component {

  constructor(props) {
    super(props);
    this.state = {
      carMake: ''
    }
  }

  handleChange = (event) => {
    this.setState({carMake: this.state.carMake = event.target.value });
    console.log(this.state.carMake)
  };


  render() {


    return (
                <div>
                   <Input className="inputBrand" type="select" name="carbrand" id="carBrand" onChange={this.handleChange}>
                     <option>Choose brand</option>
                     {carModels.map((carBrand, index) => {
                       return <option>{carBrand.brand}</option>
                     })}
                  </Input>
                  <Input className="inputBrand" type="select" name="carmodel" id="carModel">
                     <option>Choose model</option>
                     {carModels.map((carBrand, index) => {
                       return carBrand.models.map((brandModels, index) => {
                          return <option>{brandModels}</option>
                       })
                     })}
                  </Input>
                </div>

【问题讨论】:

    标签: javascript arrays json reactjs nested


    【解决方案1】:

    试试这个,然后在你的地图中为第二个下拉菜单应用一个 if 条件:

        return (
                    <div>
                       <Input className="inputBrand" type="select" name="carbrand" id="carBrand" onChange={this.handleChange}>
                         <option>Choose brand</option>
                         {carModels.map((carBrand, index) => {
                           return <option>{carBrand.brand}</option>
                         })}
                      </Input>
                      <Input className="inputBrand" type="select" name="carmodel" id="carModel">
                         <option>Choose model</option>
                         {carModels.map((carBrand, index) => {
                              if(carBrand.brand == this.state.carMake){
                                  return carBrand.models.map((brandModels, index) => {
                                      return <option>{brandModels}</option>
                                  })
                               }
                          })}
                      </Input>
                    </div>
    )
    

    【讨论】:

    • 非常感谢!这么少的添加造成了不同。我似乎不太明白为什么 if 条件会修复它,你能帮我打开一点吗?
    • 那是因为如果你想要你选择的汽车品牌模型,你需要从 json 数组中过滤它,然后只从那个品牌中获取特定的模型,你最初是打印所有的。
    • 我明白了那部分,但我的意思是 if 条件并没有改变实际 map 函数中的任何内容,这让我感到困惑
    【解决方案2】:

    你应该这样处理汽车选择

     handleChange = (event) => {
          //we are storing selected index, instead of model name
          this.setState({carMake:event.target.selectedIndex });
         console.log(this.state.carMake)
        };
    

    您应该将所选汽车的车型列表呈现为

    renderCarModles=()=>{
      if(this.state.carMake=='')return <option>select car </option>;
       //using selected index to fetch models
       let carModels=carModels[this.state.carMake].models;
        return carModels.map((brandModels, index) => {
                          return <option>{brandModels}</option>
                       })
    
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-09
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2021-07-04
      • 2019-08-13
      • 1970-01-01
      相关资源
      最近更新 更多