如何在 React 中用 JSON 数据填充下拉列表?

Posted

技术标签:

【中文标题】如何在 React 中用 JSON 数据填充下拉列表?【英文标题】:How to fill dropdown with JSON data in React? 【发布时间】:2018-08-02 05:39:40 【问题描述】:

我尝试使用 JSON 格式的数据填充下拉列表,但现在下拉列表为空(未找到结果...)

我肯定有一个错误,我不明白我在哪里混淆。

我将附上我的 API 屏幕。

我想获得 Station 和 NameStation..

API for Stations

我的代码:

import React,  Component  from 'react';
import Select from 'react-select';
import 'react-select/dist/react-select.css';

function parseStations(stations)
  return stations.map((station) => 
    return  label: station.NameStation, value: station.Station ;
  );


export default class Weather extends Component 
  constructor(props) 
    super(props);
    this.state = 
      options: [
         value: true, label: 'Yes' ,
         value: false, label: 'No' 
      ], stations: [

      ],
      value: null
    
    this.onChange = this.onChange.bind(this);
  
  onChange(event) 
    this.setState( value: event.value );
    console.log('Boolean Select value changed to', event.value);
  

  componentDidMount() 
    this.getStations();
  

  getStations() 
    fetch('http://localhost:56348/api/stations', 
      data: 'Station',
      data: 'NameStation',
      method: "GET"
    ).then(res => res.json())
      .then(res => this.setState( stations: parseStations(res.stations) ))
      //.then(res => this.setState( stations: res.stations ))
      //.catch(e => )
  

  render() 
    return (
      <div className="MasterSection">
        <div className="wrapper">
          <div className="section">Изберете № на станция</div>
          <Select
            onChange=this.onChange
            //options=this.state.options
            options=this.state.stations
            value=this.state.value
            clearable=false
          />
        </div>
        <div class="section">
          <input type="text" class="form-control" placeholder="Брой дни назад" aria-label="Username" aria-describedby="basic-addon1"></input>
        </div>
        <div class="section">
          <button type="button" class="btn btn-outline-dark">Покажи</button>
        </div>
      </div>
    );
  

【问题讨论】:

【参考方案1】:

您似乎打错了命名道具 stations 而不是 options

<Select
    onChange=this.onChange
    options=this.state.stations // here
    value=this.state.value
    clearable=false
/>

编辑:您需要先解析 json 以传递适当的对象数组,如下所示:[ label: nameStation, value: Station ]

编辑 2:这是您的数据的解析器:

function parseStations(stations)
  return stations.map((station) => 
    return  label: station.NameStation, value: station.Station ;
  );

您可以在设置状态之前在异步请求中调用它:

.then(res => this.setState( stations: parseStations(res.stations) ))

【讨论】:

@ZlatkaPijeva 将 parseStations 函数放在组件类之外或将其声明为方法(如果声明为方法,请删除“函数”) 现在我只有两个错误: 第 19 行:'Station' is not defined no-undef 第 19 行:'NameStation' is not defined no-undef @ZlatkaPijeva 您在初始状态下添加了[ label: nameStation, value: Station ],我写这个只是为了说明您需要传递给 Select 选项的对象格式,只需删除它并将初始状态设置为空数组就像你以前一样:stations: [ ] 我删除 [ label: nameStation, value: Station ] 并留下空数组,但下拉列表仍然为空(未找到结果):( @ZlatkaPijeva 可能将 res.stations 更改为 res.stations.Stations【参考方案2】:

    componentDidMount() 仅在 render() 完成后执行。所以getStations() 不可能在你的 UI 被渲染的时候被执行。将setState 放在componentDidMount() 中并不是一个好主意,因为它会触发重新渲染。请改用componentWillMount()

    更正Dyo提到的错字并使用options=this.state.stations

【讨论】:

componentDidMount() 中获取数据是一个好习惯,您不能指望在使用componentWillMount() 进行第一次渲染之前获得数据,因此您还需要设置初始状态和重新渲染也会发生。 (也是componentWillMount will be deprecated in the future) @Dyo 我明白你的意思,我只关心setState。由于fetch() 本质上是异步的,因此也无法将它们分成两个不同的功能。你认为setState() 里面的componentDidMount() 可以吗? 是的,当您在异步函数中设置状态时,对于同步操作,构造函数是更好的选择。

以上是关于如何在 React 中用 JSON 数据填充下拉列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中用 JSON 数据填充表格?

如何使用 JSON 数据填充下拉列表作为 jQuery 中的 ajax 响应

如何在 React Handsontable 中映射列类型“下拉”源中的数据?

jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表

excel表VBA中用代码如何建立多级combobox下拉菜单

如何在excel中用公式法从(学校 年级 班级) 三列数据中提取不重复的唯一的值?