Как обработать автозаполнение {onChange} в MUI v5 с помощью пользовательского крючка

#javascript #reactjs #react-hooks #material-ui

#язык JavaScript #реагирует на #реагируют-крючки #материал-пользовательский интерфейс

Вопрос:

Я использую пользовательский хук, который проверяет и обрабатывает функцию onChange.

У меня нет проблем с обработкой onChange для большинства компонентов (ввод, выбор, текстовое поле); Я использую следующий синтаксис для обработки onChange, который работает нормально, за исключением автозаполнения.

Нет компонентов автозаполнения:

 onChange = {handleInputChange}  const handleInputChange = (e) =gt; {  const { name, value } = e.target;  setValues({  ...values,  [name]: value,  });  if (validateOnChange) validate({ [name]: value });  };  

Давайте посмотрим на цель e. введите описание изображения здесь

Но когда его сравнивают с автозаполнением, он совсем не похож на приведенный выше снимок экрана. Я не могу получить имя или значение, чтобы правильно отслеживать его с помощью заданных значений.

введите описание изображения здесь

Ответ №1:

Я использовал реквизит функции :

 const {onChange} = props;   lt;Autocomplete  onChange={(e, value) =gt; onChange(value)}  

если вы хотите увидеть это полностью :

 import * as React from 'react'; import TextField from '@mui/material/TextField'; import Autocomplete from '@mui/material/Autocomplete'; import CircularProgress from '@mui/material/CircularProgress'; import {useRef} from "react";  export default function Asynchronous(props) {  const {onChange, name, getListData, label = "name", id = "id", showName,defaultValue,disabled,required,value,noOption="No Option"} = props;  const [open, setOpen] = React.useState(false);  const [options, setOptions] = React.useState([]);  const [filters, setFilters] = React.useState(null);  const [loadingApi, setLoadingApi] = React.useState(false)  const loading = open amp;amp; options.length === 0;  let timeOut = useRef(null);   const getData = async (search = "") =gt; {  setLoadingApi(true)  const data = await getListData(search); // For demo purposes.  // console.log(data)  setLoadingApi(false);  // console.log(data)  if(data)  setOptions([...data]);  }   React.useEffect(() =gt; {   if (!loading) {  return undefined;  }  getData();   }, [loading]);   React.useEffect(() =gt; {  if (filters !== null) {  if (timeOut.current !== null)  clearTimeout(timeOut.current);   timeOut.current = setTimeout(() =gt; getData(filters), 500);  }  }, [filters]);   React.useEffect(() =gt; {  if (!open) {  setOptions([]);  }  }, [open]);   return (  lt;Autocomplete  disabled={disabled}  id={name}  name={name}  sx={{width: "100%"}}  open={open}  onOpen={() =gt; {  setOpen(true);  }}  onClose={() =gt; {  setOpen(false);  }}  defaultValue={defaultValue}  value={value}  isOptionEqualToValue={(option, value) =gt; option?.[id] === value?.[id]}  getOptionLabel={(option) =gt; option?.[label]}  options={options}  onChange={(e, value) =gt; onChange(value)}  loading={loadingApi}  noOptionsText={noOption}  renderInput={(params) =gt; (  lt;TextField variant="standard"  name={name}  required={required}  variant="standard"  {...params}  label={showName}  onChange={(e) =gt; setFilters(e.target.value)}  InputProps={{  ...params.InputProps,  onblur:() =gt; {},  endAdornment: (  lt;React.Fragmentgt;  {loadingApi ? lt;CircularProgress color="inherit" size={20}/gt; : null}  {params.InputProps.endAdornment}  lt;/React.Fragmentgt;  ),  }}  /gt;  )}  /gt;  ); }  

Комментарии:

1. Спасибо, как вы можете изменить мой handleInputChange для работы с вашим решением. из вашего компонента вы установили onChange={handleInputChange} как вы можете обрабатывать реквизиты оттуда?

2. Я предполагаю ,что вам нужно использовать Формик или что-то в этом роде, чтобы получить значение с его именем из ввода или textaread и т. Д…

3. и если вы создадите свой код в песочнице, это может помочь другим