如何在 Material UI 中使用 UseFormControl() hook?


在 React MUI 中,管理表单状态或验证表单是一个很大的任务。为了解决这个问题,MUI 提供了 useFormControl() hook。此 hook 允许根据不同的项目需求自定义状态等。在本文中,我们将探讨在 React 的 Material UI 中使用 UseFormControl() hook 的方法。

useFormControl API

useFormControl API 或 hook 返回父 FormControl 组件的上下文值。它提供了一个抽象层,允许管理表单状态和给定表单控件的验证。

API 返回对象

useFormControl hook 返回不同的值,下面我们讨论了一些重要的返回值:

  • value.adornedStart − 这是一个布尔值返回值,表示子 Input 或 Select 组件是否具有起始装饰。

  • value.setAdornedStart − 这是一个函数类型返回值,设置 adornedStart 状态值。

  • value.color − 这是一个字符串类型返回值,表示正在使用的主题颜色。

  • value.disabled − 这是一个布尔值返回值,表示组件是否处于禁用状态。

  • value.variant − FormControl 组件及其子组件正在使用的变体。

  • value.onBlur − 只有当输入字段失去焦点时才调用的函数。

  • value.onFilled − 只有当输入字段完全填充时才调用的函数。

  • value.fullWidth − 这是一个布尔值返回值,表示组件是否占据其容器的全部宽度。

  • value.hiddenLabel − 这是一个布尔值返回值,表示输入字段标签是否隐藏。

  • value.error − 这是一个布尔值返回值,表示组件是否处于错误状态。

  • value.filled − 这是一个布尔值返回值,表示输入是否已填充。

  • value.focused − 这是一个布尔值返回值,表示组件及其子组件是否处于焦点状态。

  • value.required − 这是一个布尔值返回值,表示输入字段标签是否显示为必填项。

  • value.size − 组件的大小。

如何在 MUI 中使用 useFormControl() hook

以下是如何在 Material UI 中使用 useFormControl hook 的步骤:

步骤 1:创建 React 应用程序

在 MUI 中使用 useFormControl hook 的第一步是创建一个 React 应用程序。要创建一个新的 React 应用,请在终端中运行以下命令:

npx create react app formcontrolproject

项目创建完成后,运行以下命令导航到其目录:

cd formcontrolproject

步骤 2:在 React 中添加 MUI

创建 React 应用后,就可以将 Material UI 安装到 React 应用程序中。要安装 MUI,请运行以下命令:

npm install @mui/material @emotion/react @emotion/styled

步骤 3:定义 hook

现在,是时候定义 useFormControl hook 了,以便我们可以在 React MUI 中创建表单控件或添加任何输入元素。以下是在 React 中定义 hook 的方法:

import { useFormControl } from '@mui/material/FormControl';
const UseFormControl() {
   const valueobject = useFormControl() || {};
   …
}
//Add the App component below this

就是这样!现在我们已经成功学习了在 MUI 中使用 useFormControl hook 的步骤。让我们来看一些不同方法的示例。

示例

在这个例子中,我们使用了 useFormControl hook 来向用户显示输入字段是否处于焦点状态。当用户在输入框中输入任何文本时,会显示一个辅助文本,显示输入框处于焦点状态。value.focused 返回文本字段是否处于焦点状态。

//App.js file
import React, { useMemo } from "react";
import { FormControl, FormHelperText, OutlinedInput, useFormControl } from "@mui/material";

function CustomFormControl() {
   const { focused } = useFormControl() || {};
   const customHelperTxt = useMemo(() => {
      if (focused) {
         return 'You are editing...';
      }

      return 'Add name';
   }, [focused]);
   return <FormHelperText>{customHelperTxt}</FormHelperText>;
}
const App = () => {
   return (
      <div style={{
         padding: 40,
         width: '20%',
         display: 'flex',
         flexDirection: 'column',
         gap: 20}}>
         <FormControl>
            <OutlinedInput placeholder="Enter your name" />
            <CustomFormControl />
         </FormControl>
      </div>
   );
};

export default App;

要运行以上代码,请运行以下命令:

npm run start

输出

示例

在这个例子中,我们使用了 useFormControl hook 来向用户显示输入字段是否已填充。当用户在输入框中输入任何文本时,会显示一个辅助文本,显示输入字段是否已填充。value.filled 返回文本字段输入是否已填充。

import React, { useMemo } from "react";
import { FormControl, FormHelperText, OutlinedInput, useFormControl } from "@mui/material";

function CustomFormControl() {
   const { filled } = useFormControl() || {};
   const customHelperTxt = useMemo(() => {
      return filled ? 'You have filled the name' : 'Ahh! No name has been entered.';
   }, [filled]);

   return <FormHelperText>{customHelperTxt}</FormHelperText>;
}

const App = () => {
   return (
      <div style={{
         padding: 40,
         display: 'flex',
         flexDirection: 'column',
         gap: 20}}>
         <FormControl>
            <OutlinedInput placeholder="Enter your name" fullWidth />
            <CustomFormControl />
         </FormControl>
      </div>
   );
};

export default App;

要运行以上代码,请运行以下命令:

npm run start

输出

示例

在这个例子中,我们使用了 useFormControl hook 来向用户显示输入字段是否为必填项。这里我们使用了 value.required 来检查文本标签是否显示输入是必填项。当用户在输入框中输入任何文本时,会显示一个辅助文本,显示一条消息。

//App.js file
import React, { useMemo } from "react";
import { FormControl, FormHelperText, OutlinedInput, useFormControl } from "@mui/material";

function CustomFormControl() {
   const { required } = useFormControl() || {};
   const customHelperTxt = useMemo(() => {
      return required ? 'Enter name' : 'This field is required!';
   }, [required]);

   return <FormHelperText>{customHelperTxt}</FormHelperText>;
}
const App = () => {
   return (
      <div style={{
         padding: 40,
         display: 'flex',
         flexDirection: 'column',
         gap: 20}}>
         <FormControl>
            <OutlinedInput placeholder="Enter your name" fullWidth />
            <CustomFormControl />
         </FormControl>
      </div>
   );
};

export default App;

要运行以上代码,请运行以下命令:

npm run start

输出

示例

在这个例子中,我们使用了 useFormControl hook 来创建一个自定义 TextField 组件。此文本字段允许使用名为“multiline”的 prop 输入多行内容。“multiline” prop 允许用户通过提供文本框区域来输入大量内容。当用户在输入框中输入大量内容时,会显示一个辅助文本,显示一条消息。

//App.js file
import React, { useMemo } from "react";
import { FormControl, FormHelperText, OutlinedInput, useFormControl } from "@mui/material";

function CustomFormControl() {
   const { filled } = useFormControl() || {};

   const customHelperTxt = useMemo(() => {
      if (filled) {
         return 'You content is too long!';
      }  
   }, [filled]);

   return <FormHelperText>{customHelperTxt}</FormHelperText>;
}

const App = () => {
   return (
      <div style={{
         padding: 40,
         width: '20%',
         display: 'flex',
         flexDirection: 'column',
         gap: 20}}>
         <FormControl>
            <OutlinedInput placeholder="Enter content" multiline />
            <CustomFormControl />
         </FormControl>
      </div>
   );
};

export default App;

要运行以上代码,请运行以下命令:

npm run start

输出

结论

本文讨论了如何在 React MUI 中使用 useFormControl hook。在本文中,我们学习了使用 React 实现此 hook 的完整步骤,并了解了 useFormControl hook API 的返回值。本文还讨论了不同的示例,例如使用必填输入、已填充、已聚焦等,以及它们各自的输出。

更新于:2023年11月1日

652 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告