mui 文本字段是 Material-UI 中的基本组件,旨在高效、时尚地捕获用户输入。本指南探讨了其构建变体、通过颜色和样式进行的广泛自定义以及提升应用程序 UI/UX 的实际用例。
mui 文本字段为 Web 应用程序中的用户输入提供了高度适应性的界面组件,支持一系列样式、配置和用户交互。无论您是收集简单的文本输入、密码还是更复杂的多行条目,mui 文本字段都可以通过强大的自定义选项灵活地满足这些需求。
Material-UI 为基本 mui 文本字段提供了三种不同的构建变体,每种变体都针对不同的 UI 偏好和用户体验进行了定制:
使用代码实现:
import * as React from 'react'; import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; // BasicTextFields Component: Demonstrates different TextField variants. export default function BasicTextFields() { return ( // Container component for form elements with specified margins and width <Box component="form" sx={{ '& > :not(style)': { m: 1, width: '25ch' } }} // Apply margin and width to each TextField noValidate // Disables browser validation autoComplete="off" // Disables autocomplete feature > {/* Outlined TextField: Uses a border to define the input area */} <TextField id="outlined-basic" label="Outlined" variant="outlined" /> {/* Filled TextField: Includes a background fill to highlight the input area */} <TextField id="filled-basic" label="Filled" variant="filled" /> {/* Standard TextField: Features a minimalist design with a bottom underline */} <TextField id="standard-basic" label="Standard" variant="standard" /> </Box> ); }
mui 文本字段可以处理各种标准表单属性,从而增强功能和用户交互。这些属性包括必需、禁用和类型等选项,这些选项对于指导用户输入和维护表单完整性至关重要。此外,helperText 属性对于提供有关字段输入的上下文、解释其实用程序或提供有关预期格式的指导特别有用。
以下是关键的表单道具:
使用代码实现:
import * as React from 'react'; import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; // FormPropsTextFields Component: Showcases TextField with various props and states. export default function FormPropsTextFields() { return ( // Container for the form elements with specified margins and width <Box component="form" sx={{ '& .MuiTextField-root': { m: 1, width: '25ch' } }} noValidate // Disables HTML5 validation autoComplete="off" // Turns off auto-completion > {/* Section for Outlined TextFields with various configurations */} <div> <TextField required id="outlined-required" label="Required" defaultValue="Hello World" // Pre-filled text /> <TextField disabled id="outlined-disabled" label="Disabled" defaultValue="Hello World" // Pre-filled text, non-interactive /> <TextField id="outlined-password-input" label="Password" type="password" // Hides the text input autoComplete="current-password" /> <TextField id="outlined-read-only-input" label="Read Only" defaultValue="Hello World" slotProps={{ input: { readOnly: true } }} // Non-editable input /> <TextField id="outlined-number" label="Number" type="number" // Numeric input slotProps={{ inputLabel: { shrink: true } }} // Label configuration /> <TextField id="outlined-search" label="Search field" type="search" // Optimized for search input /> <TextField id="outlined-helperText" label="Helper text" defaultValue="Default Value" helperText="Some important text" // Additional information for the user /> </div> {/* Section for Filled TextFields, similar configurations as above, different variant */} <div> <TextField required id="filled-required" label="Required" defaultValue="Hello World" variant="filled" /> <TextField disabled id="filled-disabled" label="Disabled" defaultValue="Hello World" variant="filled" /> // Remaining Filled TextFields omitted for brevity </div> {/* Section for Standard TextFields, similar configurations as above, different variant */} <div> <TextField required id="standard-required" label="Required" defaultValue="Hello World" variant="standard" /> <TextField disabled id="standard-disabled" label="Disabled" defaultValue="Hello World" variant="standard" /> // Remaining Standard TextFields omitted for brevity </div> </Box> ); }
mui 文本字段中的多行属性是一项强大的功能,可将标准文本字段转换为 TextareaAutosize 元素,使其成为需要较长文本条目(例如评论、描述或反馈表单)的输入的理想选择。此功能在用户需要提供超过单行文本的详细信息的表单中特别有用。
对于需要更多地控制文本字段大小的场景,可以使用 minRows 和 maxRows 属性来设置其高度的最小和最大边界。当您想要保持一定的布局美感或处理预计在特定长度限制内的表单输入时,这特别有用。
使用代码实现:
import * as React from 'react'; import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; // MULTILINE TEXT FIELDS COMPONENT: Demonstrates various multiline TextField configurations. export default function MultilineTextFields() { return ( // Container for the multiline TextField elements with specified margins and width <Box component="form" sx={{ '& .MuiTextField-root': { m: 1, width: '25ch' } }} noValidate // Disables browser validation autoComplete="off" // Turns off auto-completion > {/* OUTLINED TEXTFIELDS GROUP */} <div> <TextField id="outlined-multiline-flexible" label="Multiline" multiline maxRows={4} // Allows flexible number of rows up to 4 /> <TextField id="outlined-textarea" label="Multiline Placeholder" placeholder="Placeholder" // Placeholder text for empty field multiline /> <TextField id="outlined-multiline-static" label="Multiline" multiline rows={4} // Fixed number of rows defaultValue="Default Value" // Pre-filled text /> </div> {/* FILLED TEXTFIELDS GROUP */} <div> <TextField id="filled-multiline-flexible" label="Multiline" multiline maxRows={4} variant="filled" // Filled style variant /> <TextField id="filled-textarea" label="Multiline Placeholder" placeholder="Placeholder" multiline variant="filled" /> <TextField id="filled-multiline-static" label="Multiline" multiline rows={4} defaultValue="Default Value" variant="filled" /> </div> {/* STANDARD TEXTFIELDS GROUP */} <div> <TextField id="standard-multiline-flexible" label="Multiline" multiline maxRows={4} variant="standard" // Standard style variant /> <TextField id="standard-textarea" label="Multiline Placeholder" placeholder="Placeholder" multiline variant="standard" /> <TextField id="standard-multiline-static" label="Multiline" multiline rows={4} defaultValue="Default Value" variant="standard" /> </div> </Box> ); }
mui 文本字段中的 select 属性通过内部集成 Select 组件将标准文本字段转换为下拉菜单。此修改允许在预定义选项之间进行无缝选择,这使得它在用户必须从设置列表中进行选择的表单中特别有用。
使用代码实现:
import * as React from 'react'; import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; import MenuItem from '@mui/material/MenuItem'; // Currency options for the select dropdown. const currencies = [ { value: 'USD', label: '$' }, { value: 'EUR', label: '€' }, { value: 'BTC', label: '฿' }, { value: 'JPY', label: '¥' }, ]; // SELECT TEXT FIELDS COMPONENT: Demonstrates TextField with select dropdowns. export default function SelectTextFields() { return ( // Container for the select TextField elements with specified margins and width <Box component="form" sx={{ '& .MuiTextField-root': { m: 1, width: '25ch' } }} noValidate // Disables browser validation autoComplete="off" // Turns off auto-completion > {/* OUTLINED SELECT TEXTFIELDS GROUP */} <div> <TextField id="outlined-select-currency" select label="Select" defaultValue="EUR" // Pre-selected currency helperText="Please select your currency" // Additional information for the user > {currencies.map((option) => ( <MenuItem key={option.value} value={option.value}> {option.label} </MenuItem> ))} </TextField> <TextField id="outlined-select-currency-native" select label="Native select" defaultValue="EUR" slotProps={{ select: { native: true } }} // Uses native select element helperText="Please select your currency" > {currencies.map((option) => ( <option key={option.value} value={option.value}> {option.label} </option> ))} </TextField> </div> {/* FILLED SELECT TEXTFIELDS GROUP */} <div> <TextField id="filled-select-currency" select label="Select" defaultValue="EUR" variant="filled" // Filled style variant helperText="Please select your currency" > {currencies.map((option) => ( <MenuItem key={option.value} value={option.value}> {option.label} </MenuItem> ))} </TextField> <TextField id="filled-select-currency-native" select label="Native select" defaultValue="EUR" variant="filled" slotProps={{ select: { native: true } }} helperText="Please select your currency" > {currencies.map((option) => ( <option key={option.value} value={option.value}> {option.label} </option> ))} </TextField> </div> {/* STANDARD SELECT TEXTFIELDS GROUP */} <div> <TextField id="standard-select-currency" select label="Select" defaultValue="EUR" variant="standard" // Standard style variant helperText="Please select your currency" > {currencies.map((option) => ( <MenuItem key={option.value} value={option.value}> {option.label} </MenuItem> ))} </TextField> <TextField id="standard-select-currency-native" select label="Native select" defaultValue="EUR" variant="standard" slotProps={{ select: { native: true } }} helperText="Please select your currency" > {currencies.map((option) => ( <option key={option.value} value={option.value}> {option.label} </option> ))} </TextField> </div> </Box> ); }
Input Adornments in Material-UI's mui textfield offer a flexible way to incorporate additional elements like prefixes, suffixes, or interactive icons directly within the text field.
Implementation with Code:
import * as React from 'react'; import Box from '@mui/material/Box'; import IconButton from '@mui/material/IconButton'; import Input from '@mui/material/Input'; import FilledInput from '@mui/material/FilledInput'; import OutlinedInput from '@mui/material/OutlinedInput'; import InputLabel from '@mui/material/InputLabel'; import InputAdornment from '@mui/material/InputAdornment'; import FormHelperText from '@mui/material/FormHelperText'; import FormControl from '@mui/material/FormControl'; import TextField from '@mui/material/TextField'; import Visibility from '@mui/icons-material/Visibility'; import VisibilityOff from '@mui/icons-material/VisibilityOff'; // INPUT ADORNMENTS COMPONENT: Demonstrates various ways to use Input Adornments with TextField and FormControl. export default function InputAdornments() { const [showPassword, setShowPassword] = React.useState(false); const handleClickShowPassword = () => setShowPassword((show) => !show); const handleMouseDownPassword = (event) => event.preventDefault(); const handleMouseUpPassword = (event) => event.preventDefault(); return ( <Box sx={{ display: 'flex', flexWrap: 'wrap' }}> {/* OUTLINED VARIANT GROUP */} <div> <TextField label="With normal TextField" id="outlined-start-adornment" sx={{ m: 1, width: '25ch' }} InputProps={{ startAdornment: <InputAdornment position="start">kg</InputAdornment>, }} /> <FormControl sx={{ m: 1, width: '25ch' }} variant="outlined"> <OutlinedInput id="outlined-adornment-weight" endAdornment={<InputAdornment position="end">kg</InputAdornment>} aria-describedby="outlined-weight-helper-text" /> <FormHelperText id="outlined-weight-helper-text">Weight</FormHelperText> </FormControl> <FormControl sx={{ m: 1, width: '25ch' }} variant="outlined"> <InputLabel htmlFor="outlined-adornment-password">Password</InputLabel> <OutlinedInput id="outlined-adornment-password" type={showPassword ? 'text' : 'password'} endAdornment={ <InputAdornment position="end"> <IconButton aria-label="toggle password visibility" onClick={handleClickShowPassword} onMouseDown={handleMouseDownPassword} onMouseUp={handleMouseUpPassword} edge="end" > {showPassword ? <VisibilityOff /> : <Visibility />} </IconButton> </InputAdornment> } label="Password" /> </FormControl> <FormControl fullWidth sx={{ m: 1 }}> <InputLabel htmlFor="outlined-adornment-amount">Amount</InputLabel> <OutlinedInput id="outlined-adornment-amount" startAdornment={<InputAdornment position="start">$</InputAdornment>} label="Amount" /> </FormControl> </div> {/* FILLED VARIANT GROUP */} <div> <TextField label="With normal TextField" id="filled-start-adornment" sx={{ m: 1, width: '25ch' }} InputProps={{ startAdornment: <InputAdornment position="start">kg</InputAdornment>, }} variant="filled" /> <FormControl sx={{ m: 1, width: '25ch' }} variant="filled"> <FilledInput id="filled-adornment-weight" endAdornment={<InputAdornment position="end">kg</InputAdornment>} aria-describedby="filled-weight-helper-text" /> <FormHelperText id="filled-weight-helper-text">Weight</FormHelperText> </FormControl> <FormControl sx={{ m: 1, width: '25ch' }} variant="filled"> <InputLabel htmlFor="filled-adornment-password">Password</InputLabel> <FilledInput id="filled-adornment-password" type={showPassword ? 'text' : 'password'} endAdornment={ <InputAdornment position="end"> <IconButton aria-label="toggle password visibility" onClick={handleClickShowPassword} onMouseDown={handleMouseDownPassword} onMouseUp={handleMouseUpPassword} edge="end" > {showPassword ? <VisibilityOff /> : <Visibility />} </IconButton> </InputAdornment> } /> </FormControl> <FormControl fullWidth sx={{ m: 1 }} variant="filled"> <InputLabel htmlFor="filled-adornment-amount">Amount</InputLabel> <FilledInput id="filled-adornment-amount" startAdornment={<InputAdornment position="start">$</InputAdornment>} /> </FormControl> </div> {/* STANDARD VARIANT GROUP */} <div> <TextField label="With normal TextField" id="standard-start-adornment" sx={{ m: 1, width: '25ch' }} InputProps={{ startAdornment: <InputAdornment position="start">kg</InputAdornment>, }} variant="standard" /> <FormControl variant="standard" sx={{ m: 1, mt: 3, width: '25ch' }}> <Input id="standard-adornment-weight" endAdornment={<InputAdornment position="end">kg</InputAdornment>} aria-describedby="standard-weight-helper-text" /> <FormHelperText id="standard-weight-helper-text">Weight</FormHelperText> </FormControl> <FormControl sx={{ m: 1, width: '25ch' }} variant="standard"> <Input id="standard-adornment-password" type={showPassword ? 'text' : 'password'} endAdornment={ <InputAdornment position="end"> <IconButton aria-label="toggle password visibility" onClick={handleClickShowPassword} onMouseDown={handleMouseDownPassword} onMouseUp={handleMouseUpPassword} > {showPassword ? <VisibilityOff /> : <Visibility />} </IconButton> </InputAdornment> } /> </FormControl> <FormControl fullWidth sx={{ m: 1 }} variant="standard"> <InputLabel htmlFor="standard-adornment-amount">Amount</InputLabel> <Input id="standard-adornment-amount" startAdornment={<InputAdornment position="start">$</InputAdornment>} /> </FormControl> </div> </Box> ) };
The margin prop in the mui textfield component is a practical attribute that allows you to control the vertical spacing of the text field within a form. This can be crucial for achieving the desired layout and ensuring that the form is visually appealing.
The margin prop accepts three values: none, dense, and normal. Each of these settings adjusts the amount of space around the text field, affecting how compact or spread out the form elements appear.
Implementation with Code:
import * as React from 'react'; import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; // RedBar Component: Displays a red horizontal bar to visually separate elements. function RedBar() { return ( // Styling applied using a function to access the theme for conditional styles <Box sx={(theme) => ({ height: 20, // Fixed height for the bar backgroundColor: 'rgba(255, 0, 0, 0.1)', // Light red background color ...theme.applyStyles('dark', { // Conditional style application for dark themes backgroundColor: 'rgb(255 132 132 / 25%)', }), })} /> ); } // LayoutTextFields Component: Demonstrates TextField components with different margin settings. export default function LayoutTextFields() { return ( <Box sx={{ display: 'flex', // Flexbox container for layout flexDirection: 'column', // Arranges children vertically '& .MuiTextField-root': { width: '25ch' }, // Standard width applied to all TextFields }} > <RedBar /> <TextField label={'margin="none"'} id="margin-none" /> // TextField with no margin <RedBar /> <TextField label={'margin="dense"'} id="margin-dense" margin="dense" /> // TextField with dense margin for tighter spacing <RedBar /> <TextField label={'margin="normal"'} id="margin-normal" margin="normal" /> // TextField with normal margin for standard spacing <RedBar /> </Box> ); }
In React, components like mui textfield can be either controlled or uncontrolled, which refers to how their state is managed.
Implementation with Code:
import * as React from 'react'; import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; // StateTextFields Component: Demonstrates the use of controlled and uncontrolled TextField components. export default function StateTextFields() { // State hook for controlling the TextField value const [name, setName] = React.useState('Cat in the Hat'); return ( // Container for the form elements with specific margin and width styles <Box component="form" sx={{ '& > :not(style)': { m: 1, width: '25ch' } }} // Apply margin and width to each TextField noValidate // Disables browser validation autoComplete="off" // Turns off auto-completion > {/* CONTROLLED TEXTFIELD */} <TextField id="outlined-controlled" label="Controlled" // Label for the TextField value={name} // Controlled value linked to state onChange={(event) => { setName(event.target.value); // Update state based on input }} /> {/* UNCONTROLLED TEXTFIELD */} <TextField id="outlined-uncontrolled" label="Uncontrolled" // Label for the TextField defaultValue="foo" // Initial value for the uncontrolled TextField /> </Box> ); }
Material-UI's Input component provides a streamlined way to handle user inputs in forms. It supports various states such as default values, placeholders, disabled inputs, and error handling.
Implementation with Code:
import * as React from 'react'; import Box from '@mui/material/Box'; import Input from '@mui/material/Input'; // Accessibility label configuration for inputs. const ariaLabel = { 'aria-label': 'description' }; // Inputs Component: Demonstrates various configurations of MUI Input components. export default function Inputs() { return ( // Form container that applies margin to each input and disables browser validation and autocomplete. <Box component="form" sx={{ '& > :not(style)': { m: 1 } }} // Margin applied to all direct children except <style> elements noValidate // Disables HTML form validation. autoComplete="off" // Prevents the browser from auto-filling input fields. > {/* STANDARD INPUT */} <Input defaultValue="Hello world" // Sets initial value for the input inputProps={ariaLabel} // Accessibility properties /> {/* INPUT WITH PLACEHOLDER */} <Input placeholder="Placeholder" // Displays placeholder text when the input is empty inputProps={ariaLabel} // Accessibility properties /> {/* DISABLED INPUT */} <Input disabled // Disables the input field defaultValue="Disabled" // Sets initial value for the input inputProps={ariaLabel} // Accessibility properties /> {/* ERROR INPUT */} <Input defaultValue="Error" // Sets initial value for the input error // Indicates an error with a visual cue inputProps={ariaLabel} // Accessibility properties /> </Box> ); }
The color prop changes the highlight color of the text field when focused.
Implementation with Code:
import * as React from 'react'; import Box from '@mui/material/Box'; import TextField from '@mui/material/TextField'; // ColorTextFields Component: Demonstrates TextField components styled with various color schemes. export default function ColorTextFields() { return ( // Form container applying margin and width to each TextField component <Box component="form" sx={{ '& > :not(style)': { m: 1, width: '25ch' } }} // Specifies margin and width for direct children noValidate // Disables HTML5 validation autoComplete="off" // Disables browser auto-completion > {/* OUTLINED TEXTFIELD WITH SECONDARY COLOR */} <TextField label="Outlined secondary" // Label text for the TextField color="secondary" // Applies the secondary color theme focused // Keeps the TextField visually focused /> {/* FILLED TEXTFIELD WITH SUCCESS COLOR */} <TextField label="Filled success" // Label text for the TextField variant="filled" // Uses the filled variant of the TextField color="success" // Applies the success color theme, often green focused // Keeps the TextField visually focused /> {/* STANDARD TEXTFIELD WITH WARNING COLOR */} <TextField label="Standard warning" // Label text for the TextField variant="standard" // Uses the standard variant, minimal styling color="warning" // Applies the warning color theme, often yellow or orange focused // Keeps the TextField visually focused /> </Box> ); }
Throughout this guide, we've explored the diverse capabilities of the MUI TextField component, covering its variants, styles, colors, and additional functionalities like select options and input adornments.
The versatility of MUI components allows developers to build comprehensive, responsive, and accessible user interfaces. For further customization and deeper understanding, refer to the official Material-UI documentation.
以上是MUI TextField:构建变体、颜色和样式的详细内容。更多信息请关注PHP中文网其他相关文章!