代码之家  ›  专栏  ›  技术社区  ›  Thuan Nguyen

React Select可以加载异步数据

  •  0
  • Thuan Nguyen  · 技术社区  · 6 年前

    我正在尝试使用 react-select 插件。

    在实施这个项目的过程中,我遇到了一些棘手的问题。请在此处查看我的源代码: https://codesandbox.io/s/j148r99695

    1. 我遇到的问题是,我想从服务器中获取所有genreslist数据,并将它们映射到选择组件。但不管怎么说,或者我做错了什么,都不起作用。请参阅上面的源代码以帮助我。

    2. 我从中获取数据 Movies 组件。它工作得很好,我把道具传给 FormFilter 组件: <FormFilter genresList={this.state.genres} /> .而且在 窗体筛选器 组件,我检查 this.props.genresList ,它是可用的。但当我试图把它分配给 窗体筛选器 州和 console.log("state", this.state.genres); 那个。它是空的。有人能告诉我为什么吗?

    3. 违约 反应选择 使用 value label 显示数据以选择组件。但你知道有些情况我们必须定制。我通过使用map转换到其他数组来尝试它。但这是最好的办法?我怎么定做 valueKey labelKey .

    我在用 反应选择 测试版2.

    更新:我的项目被修复了。请查看下面的链接。不知怎么的,它不起作用。我在源代码中得到了赞扬。

    https://codesandbox.io/s/moym59w39p

    2 回复  |  直到 6 年前
        1
  •  1
  •   Paolo Dell'Aguzzo    6 年前

    为了使其正常工作,我更改了formfilter.js实现:

    import React, { Component } from "react";
    import * as Animated from "react-select/lib/animated";
    import AsyncSelect from "react-select/lib/Async";
    
    class FormFilter extends Component {
      constructor(props) {
        super(props);
        this.state = {
          inputValue: "",
          selectedOption: "",
          genres: []
        };
      }
    
      selectGenreHandleChange = newValue => {
        const inputValue = newValue.replace(/\W/g, "");
        this.setState({ inputValue });
        console.log(inputValue);
      };
    
      componentDidMount() {
        this.genresOption();
      }
    
      filterGenres = inputValue => {
        const genres = this.genresOption();
        //HERE - return the filter
        return genres.filter(genre =>
          genre.label.toLowerCase().includes(inputValue.toLowerCase())
        );
      };
    
      promiseOptions = inputValue => {
        return new Promise(resolve => { // HERE - you have to return the promise
          setTimeout(() => {
            resolve(this.filterGenres(inputValue));
          }, 1000);
        });
      };
    
      genresOption() {
        const options = [];
        const genres = this.props.genresList.genres; //HERE - array is genres in genresList
            if (genres && genres instanceof Array) {
              genres.map(genre => options.push({ value: genre.id, label: genre.name}));
            }
        return options;
      }
    
      render() {
        const { inputValue } = this.state;
    
        if (this.state.genres) console.log("state", this.state.genres);
    
        if (this.props.genresList)
          console.log("Movies props", this.props.genresList);
    
        return (
          <div className="filter_form">
            <span className="search_element full">
              <label htmlFor="genres">Genres</label>
              <AsyncSelect
                className="select genres"
                classNamePrefix="tmdb_select"
                isMulti
                isSearchable="true"
                isClearable="true"
                cacheOptions
                components={Animated}
                value={inputValue}
                defaultOptions
                onInputChange={this.selectGenreHandleChange}
                loadOptions={this.promiseOptions}
              />
            </span>
          </div>
        );
      }
    }
    
    export default FormFilter;
    

    我写了一个评论“这里-某物”让你知道我改变了什么。没有大问题:)

        2
  •  1
  •   Chintan Kukadiya    6 年前

    我在你身上做了些改变 FIDDLE 这对我很有用

    有点像

    import React, {Component} from "react";
    import { render } from 'react-dom';
    import Movies from './Movies';
    
    import "./styles.css";
    
    class App  extends Component {
    render() {
      return (
        <div className="App">
          <Movies />
        </div>
      );
    }
    }
    
    let a = document.getElementById("root");
    render(<App />, a);