javascript - Reactjs - 通过在自动完成组件( Material UI)中的每个输入更改上点击 API 来更新选项

标签 javascript reactjs autocomplete material-ui

我是 Reactjs 的初学者。我想创建一个自动完成组件,在每次输入更改时都会触发 API 并相应地更新选项。我正在使用 Material UI 提供的自动完成组件。据我了解,给出的示例 here访问一个 API 并在本地过滤它。我尝试使用 Material 组件提供的 InputChange Prop 。我还发现了这个分析器 - https://stackoverflow.com/a/59751227/8090336 .但想不出正确的方法。

import Autocomplete from "@material-ui/lab/Autocomplete";
import TextField from "@material-ui/core/TextField";
import {CircularProgress} from "@material-ui/core";
import debounce from 'lodash/debounce';

const SelectField = ({inputLabel}) => {
    const [ open, setOpen ] = React.useState(false);
    const [ options, setOptions ] = React.useState([]);
    const [ inputValue, setInputValue ] = React.useState("");
    const loading = open && options.length === 0;

    const onInputChange = debounce((event, value) => {
        console.log("OnInputChange",value);
        setInputValue(value);
        (async() => {
            const response = await fetch('https://api.tvmaze.com/search/shows?q='+inputValue);
            console.log("API hit again")
            let movies = await response.json();

            if(movies !== undefined) {
                setOptions(movies);
                console.log(movies)
            }
        })();
    }, 1500);

    return (
        <Autocomplete
            style={{ width:300 }}
            open={open}
            onOpen={() => {
              setOpen(true);
            }}
            onClose={() => {
              setOpen(false);
            }}
            getOptionLabel={(option) => option.show.name}
            onInputChange={onInputChange}
            options={options}
            loading={loading}
            renderInput={(params) => (<TextField
                {...params}
                label={inputLabel}
                variant="outlined"
                InputProps={{
                  ...params.InputProps,
                  endAdornment: (
                      <React.Fragment>
                          {loading ? <CircularProgress color="inherit" size={20} />: null }
                          {params.InputProps.endAdornment}
                      </React.Fragment>
                  ),
                }}
              />
            )}
        />
    );
}

export default SelectField;

最佳答案

我遇到过这个问题,我在用户输入时手动调用 API。找到 link为沙箱。检查自动完成中呈现的文本字段的 onChange Prop

// *https://www.registers.service.gov.uk/registers/country/use-the-api*
import fetch from "cross-fetch";
import React from "react";
import TextField from "@material-ui/core/TextField";
import Autocomplete from "@material-ui/lab/Autocomplete";
import CircularProgress from "@material-ui/core/CircularProgress";


export default function Asynchronous() {
  const [open, setOpen] = React.useState(false);
  const [options, setOptions] = React.useState([]);
  const loading = open && options.length === 0;


  const onChangeHandle = async value => {
// this default api does not support searching but if you use google maps or some other use the value and post to get back you reslut and then set it using setOptions 
    console.log(value);

    const response = await fetch(
      "https://country.register.gov.uk/records.json?page-size=5000"
    );

    const countries = await response.json();
    setOptions(Object.keys(countries).map(key => countries[key].item[0]));
  };

  React.useEffect(() => {
    if (!open) {
      setOptions([]);
    }
  }, [open]);

  return (
    <Autocomplete
      id="asynchronous-demo"
      style={{ width: 300 }}
      open={open}
      onOpen={() => {
        setOpen(true);
      }}
      onClose={() => {
        setOpen(false);
      }}
      getOptionSelected={(option, value) => option.name === value.name}
      getOptionLabel={option => option.name}
      options={options}
      loading={loading}
      renderInput={params => (
        <TextField
          {...params}
          label="Asynchronous"
          variant="outlined"
          onChange={ev => {
            // dont fire API if the user delete or not entered anything
            if (ev.target.value !== "" || ev.target.value !== null) {
              onChangeHandle(ev.target.value);
            }
          }}
          InputProps={{
            ...params.InputProps,
            endAdornment: (
              <React.Fragment>
                {loading ? (
                  <CircularProgress color="inherit" size={20} />
                ) : null}
                {params.InputProps.endAdornment}
              </React.Fragment>
            )
          }}
        />
      )}
    />
  );
}


关于javascript - Reactjs - 通过在自动完成组件( Material UI)中的每个输入更改上点击 API 来更新选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61970103/

相关文章:

javascript - 相对定位的 div 内的绝对定位仍然没有留在原地

javascript - React 子组件中父 html 元素的引用

reactjs - 运行 npm test 时出现 TypeError : environment. dispose 不是函数

java - Wicket AutoCompleteTextField 模型转换

javascript - 根据所选产品从数据数组填充价格

javascript - Mootools 使用变量变形

javascript - 2 级 DOM 处理无法正常工作 javascript

javascript - 使用 HTTP-on-modify-request 重定向 URL

reactjs - Flow React : Cannot create element because React. 组件 [1] 不是 React 组件

php - 无法在 PHP 中构建自动完成文本框