Text Field (campo de texto)
Los campos de texto permiten a los usuarios ingresar y editar texto.
Text fields allow users to enter text into a UI. Generalmente se encuentran en formularios y diálogos.
TextField
El componente TextField
es un control de formulario completo, incluyendo una etiqueta, el campo de texto y texto de ayuda.
Soporta estilos "Standard", "Outlined" y "Filled".
<form className={classes.root} noValidate autoComplete="off">
<TextField id="outlined-basic" label="Outlined" />
<TextField id="filled-basic" label="Filled" variant="filled" />
<TextField id="standard-basic" label="Standard" variant="standard" />
</form>
Note: The standard variant of the TextField
is no longer documented in the Material Design guidelines (here's why), but Material-UI will continue to support it.
Propiedades del Form
Standard form attributes are supported e.g. required
, disabled
, type
, etc. as well as a helperText
which is used to give context about a field’s input, such as how the input will be used.
Validación
The error
prop toggles the error state, the helperText
prop can then be used to provide feedback to the user about the error.
Multiline
The multiline
prop transforms the text field into a textarea or a TextareaAutosize. Unless the rows
prop is set, the height of the text field dynamically matches its content (using TextareaAutosize). You can use the rowsMin
and rowsMax
props to bound it.
Selección
The select
prop makes the text field use the Select component internally.
Adornos de campos de texto
The main way is with an InputAdornment
. Por ejemplo, puedes usar un botón de icono para esconder o revelar una contraseña. This can be used to add a prefix, a suffix or an action to an input.
Kg
Kg
Weight
$
Kg
Kg
Weight
$
Kg
Kg
Weight
$
The filled
variant input height can be further reduced by rendering the label outside of it.
Disposición
dense
and normal
alter other styles to meet the specification. margin
prop can be used to alter the vertical spacing of inputs. Using none
(default) will not apply margins to the FormControl
, whereas dense
and normal
will.
fullWidth
can be used to make the input take up the full width of its container.
Full width!
Some important text
Some important text
Some important text
Full width!
Some important text
Some important text
Some important text
Full width!
Some important text
Some important text
Some important text
Componentes
El componente TextField
incluye y usa subcomponentes ( FormControl
, Input
, FilledInput
, InputLabel
, OutlinedInput
y FormHelperText
) que pueden ser usados directamente para personalizar campos de ingreso de texto de manera sustancial.
Puede que también hayas notado que algunas propiedades nativas de input HTML no están presentes en el componente TextField
. Esto es a propósito. El componente se encarga de programar la mayoría de las propiedades más usadas, luego depende del usuario programar las propiedades que se muestran en la siguiente demo. Aun así, se puede utilizar inputProps
(y las propiedades InputProps
e InputLabelProps
) para personalizar y evitar el código boilerplate.
Inputs personalizados
Here are some examples of customizing the component. You can learn more about this in the overrides documentation page.
La personalización no se limita a usar CSS, también puedes usar una composición de componentes personalizados para darle a tu aplicación un estilo único. A continuación sigue un ejemplo del uso del componente InputBase
, inspirado por Google Maps.
🎨 Si buscas un poco de inspiración, puedes visitar MUI Treasury's ejemplos de customizacion.
Limitaciones
Shrink
El estado "shrink" de la etiqueta del campo de texto no está siempre correcto. La etiqueta debe achicarse al momento que el campo demuestra algun texto. En algunas circunstancias, no se puede determinar el estado "shrink" (campo de números, campo de fecha y hora, campo de Stripe). Tal vez veas una superposición.
Para resolver el problema, puedes forzar el estado "shrink" de la etiqueta.
<TextField InputLabelProps={{ shrink: true }} />
o
<InputLabel shrink>Contagem</InputLabel>
Floating label
The floating label is absolutely positioned, it won't impact the layout of the page. You need to make sure that the input is larger than the label to display correctly.
type="number"
Inputs of type="number" have potential usability issues:
- Allowing certain non-numeric characters ('e', '+', '-', '.') and silently discarding others and silently discarding others
- Si se está componiendo el componente:
and more - see this article by the GOV. UK Design System team for a more detailed explanation.
For number validation, one viable alternative is to use the default input type="text" with the pattern attribute, for example:
<TextField inputProps={{ inputMode: 'numeric', pattern: '[0-9]*' }} />
In the future, we might provide a number input component.
Helper text
The helper text prop affects the height of the text field. If two text fields are placed side by side, one with a helper text and one without, they will have different heights. For example:
Please enter your name
<TextField
helperText="Please enter your name"
id="demo-helper-text-misaligned"
label="Name"
variant="standard"
/>
<TextField
id="demo-helper-text-misaligned-no-helper"
label="Name"
variant="standard"
/>
This can be fixed by passing a space character to the helperText
prop:
Please enter your name
<TextField
helperText="Please enter your name"
id="demo-helper-text-aligned"
label="Name"
variant="standard"
/>
<TextField
helperText=" "
id="demo-helper-text-aligned-no-helper"
label="Name"
variant="standard"
/>
Integration with 3rd party input libraries
Se pueden utilizar librerías externas para formatear un campo de texto. Para ello, hay que proporcionar una implementación personalizada del elemento <input>
con el atributo inputComponent
.
El siguiente demo utiliza las librerías react-text-mask y react-number-format. The same concept could be applied to e.g. react-stripe-element.
The provided input component should expose a ref with a value that implements the following interface:
interface InputElement {
focus(): void;
value?: string;
}
const MyInputComponent = React.forwardRef((props, ref) => {
const { component: Component, ...other } = props;
// implement `InputElement` interface
React.useImperativeHandle(ref, () => ({
focus: () => {
// logic to focus the rendered component from 3rd party belongs here
},
// hiding the value e.g. react-stripe-elements
}));
// `Component` will be your `SomeThirdPartyComponent` from below
return <Component {...other} />;
});
// usage
<TextField
InputProps={{
inputComponent: MyInputComponent,
inputProps: {
component: SomeThirdPartyComponent,
},
}}
/>;
Accesibilidad
In order for the text field to be accessible, the input should be linked to the label and the helper text. The underlying DOM nodes should have this structure:
<FormControl>
<InputLabel htmlFor="mi-campo">Email</InputLabel>
<Input id="mi-campo" aria-describedby="mi-texto-de-ayuda" />
<FormHelperText id="mi-texto-de-ayuda">Nunca compartiremos tu email.</FormHelperText>
</FormControl>
- Si se usa el componente
TextField
, sólo hay que proporcionar unid
único. - Si se está componiendo el componente:
<FormControl>
<InputLabel htmlFor="mi-campo">Email</InputLabel>
<Input id="mi-campo" aria-describedby="mi-texto-de-ayuda" />
<FormHelperText id="mi-texto-de-ayuda">Nunca compartiremos tu email.</FormHelperText>
</FormControl>
Proyectos relacionados
Para usos más avanzados tal vez puedas aprovercharte de:
- mui-rff Bindings for using Material-UI with React Final Form.
- formik-material-ui: Bindings for using Material-UI with formik.
- redux-form-material-ui: Bindings for using Material-UI with Redux Form.
- mui-rff: Bindings for using Material-UI with React Final Form.