如何在 React 中用 JSON 数据填充下拉列表?
How to fill dropdown with JSON data in React?
我尝试用 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>
);
}
}
似乎你打错了命名道具 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) }))
componentDidMount()
仅在render()
完成后执行。因此 getStations()
无法在 UI 呈现时执行。在 componentDidMount()
中 setState
不是一个好主意,因为它会触发重新渲染。请改用 componentWillMount()
。
更正 Dyo 提到的错字并使用 options={this.state.stations}
我尝试用 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>
);
}
}
似乎你打错了命名道具 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) }))
componentDidMount()
仅在render()
完成后执行。因此getStations()
无法在 UI 呈现时执行。在componentDidMount()
中setState
不是一个好主意,因为它会触发重新渲染。请改用componentWillMount()
。更正 Dyo 提到的错字并使用
options={this.state.stations}