如何在不同 select 的变化上使用 react-select-async-paginate 库?

How to use react-select-async-paginate library on change of different select?

我正在尝试实现 2 select 框 第一个 select 框将是简单的 select 框。 第二个 select 框将具有无限滚动功能,为此,我正在使用 react-select-async-paginate 库。

问题说明

AsyncPaginate 是 react-select-async-paginate 库的组件。它使用 loadOptions 函数属性将选项加载到 select 框中,它期望 return 值为 {options: [], hasMore: false}.

在我的代码中,在 loadOptions 属性中,我正在调用 loadHostOptions 函数来获取选项。在更改第一个下拉列表时,我正在调用 loadHostOptions 函数。但在这种情况下,正确的选项不会反映在第二个下拉列表中。

任何人都可以帮助我如何在第一个下拉列表的变化中加载选项吗?

Here is codesandbox

代码

import React from "react";

import { AsyncPaginate } from "react-select-async-paginate";

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      firstSelectVal: "",
      value: null
    };
  }

  firstSelectChange = (event) => {
    this.setState({ firstSelectVal: event.target.value });
    if (event.target.value) {
      this.loadHostOptions("java", []);
    }
  };

  onPagiChange = (event) => {
    this.setState({ value: event});
  };

  loadHostOptions = async (search, prevOptions) => {
    if (search === "java") {
      const responseJSON = {
        results: [
          {
            value: 1,
            label: "Java"
          }
        ],
        has_more: false
      };

      return {
        options: responseJSON.results,
        hasMore: responseJSON.has_more
      };
    } else {
      const responseJSON = {
        results: [
          {
            value: 1,
            label: "Java"
          },
          {
            value: 2,
            label: "C++"
          },
          {
            value: 3,
            label: "Python"
          },
          {
            value: 4,
            label: "Node"
          },
          {
            value: 5,
            label: "Go, Lang"
          }
        ],
        has_more: false
      };

      return {
        options: responseJSON.results,
        hasMore: responseJSON.has_more
      };
    }
  };

  render() {
    return (
      <div>
        <h1>react-select-async-paginate</h1>
        <h2>1st Selectbox</h2>
        <select
          id="lang"
          onChange={this.firstSelectChange}
          value={this.state.firstSelectVal}
        >
          <option value="">Select</option>
          <option value="java">Java</option>
        </select>
        {this.state.firstSelectVal ? (
          <>
            <h2>2nd Selectbox</h2>
            <AsyncPaginate
              value={this.state.value}
              loadOptions={(search, prevOptions) =>
                this.loadHostOptions(search, prevOptions)
              }
              onChange={(e) => this.onPagiChange(e)}
            />
          </>
        ) : (
          ""
        )}
      </div>
    );
  }
}

export default App;

您必须将 onPagiChange 函数更改为

onPagiChange = (event) => {
   this.setState({ value: event});
};

即设置整个 event 作为值而不是 event.value

更新

实际问题是,无论何时单击 AsyncPaginate 字段,它都会调用 loadHostOptions 函数并将当前值传递给 search 参数。在这种情况下,无论您输入什么,都将是 search 的值。 因此,如果您想使用第一个 Select 框的值来过滤第二个框的选项,则必须直接在 loadHostOptions 函数内直接使用 this.state.firstSelectVal 。像这样

  loadHostOptions = async (search, prevOptions) => {
    if (this.state.firstSelectVal === "java") {
      const responseJSON = {
        results: [
          {
            value: 1,
            label: "Java"
          }
        ],
        has_more: false
      };

      return {
        options: responseJSON.results,
        hasMore: responseJSON.has_more
      };
    } else {
      const responseJSON = {
        results: [
          {
            value: 1,
            label: "Java"
          },
          {
            value: 2,
            label: "C++"
          },
          {
            value: 3,
            label: "Python"
          },
          {
            value: 4,
            label: "Node"
          },
          {
            value: 5,
            label: "Go Lang"
          }
        ],
        has_more: false
      };

      return {
        options: responseJSON.results,
        hasMore: responseJSON.has_more
      };
    }
  };