React Select - How to show / iterate through data from api call in option instead of hardcoding options?

前端 未结 3 650
悲哀的现实
悲哀的现实 2021-02-09 09:57

I am using react-select and I don\'t want to hard code the options which should be displayed, but options is data I am fetching from an api. I can\'t really find anything and wh

相关标签:
3条回答
  • 2021-02-09 10:02

    In your return component you can simply pass the cities that is fetched from api as

    import Select from 'react-select';
    import {availableCities} from '../utils/api.js';
    
    let isLoadingExternally = false;
    
    class App extends React.Component {
    
        constructor(props) {
        super(props);
        this.state = {
            selectedOption: '',
            clearable: true,
            cities: [],
        } 
    }
    componentDidMount() {
        isLoadingExternally = true;
        availableCities()
            .then(res => {
                this.setState({
                    cities: res.Cities.name
                }, () => {
                    isLoadingExternally = false;
                })
                console.log("hello", this.state.cities)
            })
    }
    
    handleChange(selectedOption) {
        this.setState({selectedOption});
    }
    render(){
    return (
        <div>
            <Select
                    name="form-field-name"
                    value={this.state.value}
                    onChange={this.handleChange}
                    clearable={this.state.clearable}
                    searchable={this.state.searchable}
                    labelKey={'name'}
                    valueKey={'code'}
                    isLoading={isLoadingExternally}
                    options={this.state.cities}                  
                />
        </div>
    )
    }
    }
    

    There are lots of configurable options available in the docs.

    0 讨论(0)
  • 2021-02-09 10:13

    The issue here comes from the objects in your array. react-select needs an array of objects with following keys in order to understand it: value and label.

    So, in render, you could replace

    let options = this.state.cities.map(function (city) {
      return city.name;
    })
    

    by, for example,

    let options = this.state.cities.map(function (city) {
      return { value: city.countryCode, label: city.name };
    })
    

    or, like pritesh pointed out, simply tell react-select what keys to use like

    render () {
      return (
        <div>
          <Select
            name="form-field-name"
            value={this.state.value}
            onChange={this.handleChange}
            clearable={this.state.clearable}
            searchable={this.state.searchable}
            labelKey='name'
            valueKey='countryCode'
            options={this.state.cities}                  
          />
        </div>
      )
    }
    

    Hope this helps you out!

    0 讨论(0)
  • 2021-02-09 10:26

    Try this :

    renderList() {
     return (this.state.responseData.map(data =>({label:data.Name,value:data.value})))
    }
    

    and Call :

     <Select
        options={this.renderList()}
    />
    
    0 讨论(0)
提交回复
热议问题