Выпадающий список на основе выбора первого выпадающего списка с использованием MDB-reactjs

#reactjs #bootstrap-material-design #mdbreact

#reactjs #bootstrap-материал-дизайн #mdbreact ( прерывание ) #bootstrap-material-design #mdbreact

Вопрос:

Этот вопрос может звучать как дублирующий, когда у вас так много примеров в StackOverflow о раскрывающемся списке react на основе другого раскрывающегося списка. По какой-то странной причине я не могу исправить проблему в своем коде. Я не совсем уверен, происходит ли это из-за фреймворка MDBreact. Я тоже довольно новичок в react. ребята, любая помощь будет очень признательна.

 import React, { Component } from "react";
import {
  MDBContainer,
  MDBBtn,
  MDBModal,
  MDBModalBody,
  MDBModalHeader,
  MDBModalFooter
} from "mdbreact";


import "../../App.css";

class ModalInvenAddItems extends Component {
  constructor(props) {
    super(props);
    this.state = {
      modal: false,
      tools: [
        {
          name: "machine",
          lists: [
            "Lathe",
            "Milling m/c",
            "drillingm/c",
            "hand grinder",
            "hand drill",
            "pedestal grinder",
            "belt sander",
            "hand chainsaw  ",
            "Angle Grinder"
          ]
        },
        {
          name: "Hand-tools",
          lists: [
            "spanners",
            "screw drivers",
            "hammers",
            "allenkeys",
            "punch",
            "hacksaw",
            "files",
            "pliers",
            "center punches",
            "scribes"
          ]
        },
        {
          name: "cutting-tools",
          lists: [
            "Auger Bits",
            "Taper shank Twist drill",
            "strisght shank Twist drill",
            "Countersink Drills",
            "mill cutters",
            "lathe tools",
            "taps",
            "threadcutting tools",
            "oil stones",
            "emery papers"
          ]
        },
        {
          name: "Measurment-Instruments",
          lists: [
            "vernier-calipers",
            "ruler",
            "compass",
            "x-callipers",
            "spirit level",
            "tape"
          ]
        },
        {
          name: "cleaning-tools",
          lists: ["brushes", "Dustbins", "Vacuum Cleaner", "Rugs","Dustpans "]
        },
        {
          name: "fastners",
          lists: [
            "screws",
            "wood screws",
            "machine screws",
            "thread cutting m/c screws",
            "nuts",
            "Hex",
            "heavy hex",
            "flange",
            "washers",
            "flat",
            "fender",
            "external tooth lock",
            "split lock",
            "internal Tooth lock",
            "bolts",
            "revet"
          ]
        },
        {
          name: "fluids",
          lists: ["cutting oil", "lubrication", "glues"]
        },
        {
          name: "Clamping-tools",
          lists: [
            "F-clamps",
            "bar-clamps",
            "c-clamps",
            "vices",
            "t-bolts",
            "step blocks",
            "parallel blocks"
          ]
        },
        {
          name: "safety-equipments",
          lists: ["goggles", "ear-muffs"]
        }
      ],
      selectedCategory: "select the category",
      selectedList: []
    };
    this.toggle = this.toggle.bind(this);
    this.handleChange = this.handleChange.bind(this);
  }

  toggle = () => {
    this.setState({
      modal: !this.state.modal
    });
  };

  handleChange(e) {
    this.setState({ selectedCategory: e.target.value });
  }

  render() {
    let divstyle = {
      color: "blue",
      fontStyle: "italic",
      fontWeight: "semi-bold"
    };

    let toolgroup = this.state.tools.filter(tool => {
      return tool.name === this.state.selectedCategory;
    });

    return (
      <MDBContainer>
        <a
          style={divstyle}
          className="btnadditem"
          title="Add new items"
          onClick={this.toggle}
        >
          <i className="fas fa-plus" />
        </a>
        <MDBModal
          id="modalAdditems"
          isOpen={this.state.modal}
          toggle={this.toggle}
        >
          <MDBModalHeader toggle={this.toggle}>
            Add new Inventory Item
          </MDBModalHeader>
          <MDBModalBody>
            <div className="form-group">
              <label>Description</label>
              <input type="email" className="form-control invModal" />
              <label>Category</label>
              <div>
                <select
                  className="browser-default custom-select"
                  onChange={this.handleChange}
                  value={this.state.selectedCategory}
                >
                  {this.state.tools.map((toolCategory, i) => {
                    return <option key={i}>{toolCategory.name}</option>;
                  })}
                </select>
              </div>
              <div>
                <select>
                  {toolgroup[0].lists.map((list, i) => {
                    return <option key={i}>{list}</option>;
                  })}
                </select>
              </div>
            </div>
          </MDBModalBody>
          <MDBModalFooter>
            <MDBBtn color="secondary" onClick={this.toggle}>
              Close
            </MDBBtn>
            <MDBBtn color="primary" onClick={this.postdata}>
              Save changes
            </MDBBtn>
          </MDBModalFooter>
        </MDBModal>
      </MDBContainer>
    );
  }
}

export default ModalInvenAddItems;
  

Ошибка, которую я получаю, — «TypeError: не удается прочитать свойство ‘lists’ из undefined»

Ребята, заранее извините, если мой вопрос звучит глупо. Я новичок в reactjs

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

1. что делать, если нет выбранного инструмента? Это ошибка, которую вы получаете

Ответ №1:

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

 render() {
let divstyle = {
  color: "blue",
  fontStyle: "italic",
  fontWeight: "semi-bold"
};

let toolgroup = this.state.tools.filter(tool => {
  return tool.name === this.state.selectedCategory;
});

// validate lists and set it to empty array, if toolgroup is empty 
const lists = toolgroup amp;amp; toolgroup.length amp;amp; toolgroup[0].lists || [];

// create select option values
const items = this.state.tools.map((toolCategory, i) => (
  <option key={i}>{toolCategory.name}</option>
));

// create second select option items
const toolgroupItems = lists.map((list, i) => (
  <option key={i}>{list}</option>
));

return (
  <MDBContainer>
    <a
      style={divstyle}
      className="btnadditem"
      title="Add new items"
      onClick={this.toggle}
    >
      <i className="fas fa-plus" />
    </a>
    <MDBModal
      id="modalAdditems"
      isOpen={this.state.modal}
      toggle={this.toggle}
    >
      <MDBModalHeader toggle={this.toggle}>
        Add new Inventory Item
      </MDBModalHeader>
      <MDBModalBody>
        <div className="form-group">
          <label>Description</label>
          <input type="email" className="form-control invModal" />
          <label>Category</label>
          <div>
            <select
              className="browser-default custom-select"
              onChange={this.handleChange}
              value={this.state.selectedCategory}
            >
              {items}
            </select>
          </div>
          <div>
            <select>
              {toolgroupItems}
            </select>

          </div>
        </div>
      </MDBModalBody>
      <MDBModalFooter>
        <MDBBtn color="secondary" onClick={this.toggle}>
          Close
        </MDBBtn>
        <MDBBtn color="primary" onClick={this.postdata}>
          Save changes
        </MDBBtn>
      </MDBModalFooter>
    </MDBModal>
  </MDBContainer>
 );
}
  

рабочий пример