当前位置: 首页 > 知识库问答 >
问题:

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

赫连棋
2023-03-14

我是ReactJS的初学者。我想创建一个自动完成组件,在每个输入更改时,API都会被点击,选项也会相应地更新。我正在使用材料UI提供的自动完成组件。按照我的理解,这里给出的示例命中一次API并在本地过滤它。我尝试使用material组件提供的InputChange道具。我还找到了这个anser-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;

共有1个答案

阙博容
2023-03-14

我曾经遇到过这个问题,当用户输入时,我手动调用API。找到沙盒的链接。检查autocomplete中呈现的textfield的onChange属性

// *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>
            )
          }}
        />
      )}
    />
  );
}


 类似资料:
  • 我正在学习反应和反应形式,并试图创建一个动态和可扩展的形式。我已经设置了具有的状态,并基于该类型,显示相应的输入类型(因此它可以是文本、文本区域、单选、选择、日期或复选框)。我试图写一个函数,这样它将动态设置基于的表单输入,但我卡住了试图实现相同的变化。 所以如果,或,等等。 请检查此工作代码沙盒。 看看这个完整的代码片段:- 我仍在努力学习并花时间与ReactJS在一起,因此任何帮助都将不胜感激

  • 我有一个材质ui自动完成元素 当我单击按钮时,我希望这个元素得到焦点。 我尝试使用这里描述的引用,如何以编程方式对焦点输入作出反应 它适用于其他元素,但不适用于自动完成 请帮忙

  • 我正在我的项目中使用一个材料UI自动完成组件(“faculdade”字段)。然而,当我关注这个组件时,动画/过渡是由中间向外展开的。我希望动画像“密码”字段。从左到右。但我不知道该如何改变这一点。有人知道吗?

  • 问题内容: 在下方,您可以找到有关自动完成功能的MUI文档的示例,在该示例中,我已经在选项列表之前将链接传递给了google。但是,我无法单击该选项,事件目标只是MuiAutocomplete,而不是我正在传递的事件。 https://codesandbox.io/s/material-demo- egi6p 有趣的是,对自动完成功能开放 使它能够按预期工作。 目前,我正在使用onMouseDow

  • 我只想更改每一行最后一个单词的文本颜色。Im使用Jquery UI的autocomplete功能,因此Im使用带有'ui-menu-item'类的li元素 我不明白怎么做这件事,有人能帮帮我吗? 例如,一行是:“this is a test”,我想像这样改变颜色“this is a test”(测试是红色)

  • 问题内容: 我正在使用jQuery UI自动完成功能。我可以将其与jQuery UI提供的示例一起使用,如下所示: 这可以正常工作。但是我需要使用JSON作为数据源,可以像这样检索它:http://mysite.local/services/suggest.ashx?query = ball 如果要转到该URL,我将像这样返回JSON: 如何使用我的URL作为数据源? 我试过像这样更改source