ВВЕДЕНИЕ:
В этом руководстве вы узнаете, как сбросить выбор и поля ввода в компоненте автозаполнения Material-UI. Это улучшает взаимодействие с пользователем и взаимодействие, особенно после отправки формы или подобных событий.
ОБЗОР:
Шаг 1. Настройте среду разработки, установив Material-UI и связанные пакеты.
Шаг 2. Импортируйте компонент автозаполнения для использования.
Шаг 3. Реализуйте функцию очистки, инициализируя состояние, применив механизм очистки и вызвав сброс.
Вывод: Выполнив эти шаги, вы сможете легко интегрировать очистку функциональность для более плавного взаимодействия с пользователем.
ШАГИ:
Шаг 1. Создание среды:
Прежде чем углубляться в процесс реализации, убедитесь, что Material-UI правильно установлен в вашем проекте. Используйте npm или Yarn для установки необходимых пакетов:
npm install @mui/material @emotion/react @emotion/styled
Чтобы подтвердить успешную установку, проверьте свой package.json
на наличие следующих сведений о пакете:
"dependencies": { "@emotion/react": "^**.**.*", "@emotion/styled": "^**.**.*", "@mui/material": "^**.**.**" }
Шаг 2. Импортируйте компонент автозаполнения
import Autocomplete from '@mui/material/Autocomplete';
Шаг 3. Реализация четкой функциональности (последний этап)
1. Инициализация состояния:
Определите переменную состояния, которая будет изменена при вызове функции, ответственной за запуск процесса очистки:
const [resetInputField, setResetInputField] = useState(false);
2. Примените механизм очистки:
Вставьте переменную "resetInputField" в свойство "key" компонентов автозаполнения, предназначенных для очистки, как показано ниже:
<div className="inputsWrapper"> <> <Autocomplete disablePortal className="singleInput" id="tags-outlined" onChange={(e, option) => setUserInfo(e, option, "leastFavorite")} getOptionLabel={(option) => option.title} options={top100Films} key={resetInputField} renderInput={(params) => ( <TextField {...params} label="Least Favorites" placeholder="Least Favorites" /> )} /> </> <> <Autocomplete disablePortal multiple onChange={(e, option) => setUserInfo(e, option, "favorites")} className="multipleSelect" id="tags-outlined" options={top100Films} getOptionLabel={(option) => option.title} key={resetInputField} renderInput={(params) => ( <TextField {...params} label="Favorites" placeholder="Favorites" /> )} /> </> </div>
Примечание. Чтобы избежать ошибки «Обнаружено два дочерних элемента с одним и тем же ключом», убедитесь, что эти компоненты не являются прямыми братьями и сестрами. Поместите их в подходящий контейнер, например фрагмент или элемент div, как показано выше.
3. Вызов сброса:
Внутри обработчика отправки формы вызовите функцию setResetInputField, чтобы сбросить поля ввода, как показано ниже:
// FUNCTION TO HANDLE FORM SUBMISSION const handleFormSubmission = async (event) => { event.preventDefault(); setLoading(true); // API CALL SIMULATION try { setTimeout(() => { setLoading(false); setResetInputField((prev) => !prev); }, 2000); } catch (error) { setLoading(false); console.log(error); } }; // END OF FUNCTION TO HANDLE FORM SUBMISSION
Заключение
Выполняя эти шаги, вы сможете легко интегрировать функцию очистки в компонент автозаполнения Material-UI, обеспечивая более плавное взаимодействие с пользователем. Ваши поля ввода будут сброшены по мере необходимости после отправки формы.
Бонус: полный код для справки:
import { useState } from "react"; import "./App.css"; import { Autocomplete, TextField } from "@mui/material"; function App() { // LOADING STATE WHEN FORM IS SUBMITTED const [loading, setLoading] = useState(false); // VARIABLE TO RESET INPUT FIELDS AFTER FORM SUBMISSION const [resetInputField, setResetInputField] = useState(false); // OPTIONS ARRAY const top100Films = [ { title: "The Shawshank Redemption", year: 1994 }, { title: "The Godfather", year: 1972 }, { title: "The Godfather: Part II", year: 1974 }, { title: "The Dark Knight", year: 2008 }, { title: "12 Angry Men", year: 1957 }, { title: "Schindler's List", year: 1993 }, { title: "Pulp Fiction", year: 1994 }, { title: "The Lord of the Rings: The Return of the King", year: 2003, } ]; // FUNCTION TO HANDLE FORM SUBMISSION const handleFormSubmission = async (event) => { event.preventDefault(); setLoading(true); // API CALL SIMULATION try { setTimeout(() => { setLoading(false); setResetInputField((prev) => !prev); }, 2000); } catch (error) { setLoading(false); console.log(error); } }; // END OF FUNCTION TO HANDLE FORM SUBMISSION const setUserInfo = (e, data, type) => { console.log(e, data, type); }; return ( <div className="formWrapper"> <form className="form" onSubmit={handleFormSubmission}> <div className="inputsWrapper"> <> <Autocomplete disablePortal className="singleInput" id="tags-outlined" onChange={(e, option) => setUserInfo(e, option, "leastFavorite")} getOptionLabel={(option) => option.title} options={top100Films} key={resetInputField} renderInput={(params) => ( <TextField {...params} label="Least Favorites" placeholder="Least Favorites" /> )} /> </> <> <Autocomplete disablePortal multiple onChange={(e, option) => setUserInfo(e, option, "favorites")} className="multipleSelect" id="tags-outlined" options={top100Films} getOptionLabel={(option) => option.title} key={resetInputField} renderInput={(params) => ( <TextField {...params} label="Favorites" placeholder="Favorites" /> )} /> </> </div> <button type="submit" className="submitFormBtn" disabled={loading}> Submit </button> </form> </div> ); } export default App;