Pular para o conteúdo

Campo de texto

Campos de texto permitem que os usuários digitem e editem texto.

Campos de texto permitem que os usuários insiram texto em uma interface de usuário. Eles geralmente aparecem em formulários e diálogos.

TextField

O componente wrapper TextField é um controle de formulário completo, incluindo um rótulo, entrada e texto de ajuda.

Ele suporta 3 variações: O estilo padrão, com contorno e preenchido.

<TextField id="outlined-basic" label="Outlined" variant="outlined" />
<TextField id="filled-basic" label="Filled" variant="filled" />
<TextField id="standard-basic" label="Standard" variant="standard" />

Os atributos são suportados pelo TextField, como por exemplo required, disabled, type, etc. assim como o helperText que é utilizada para dar contexto sobre um campo de entrada, tais como, a entrada que será usada.

Propriedades de formulário

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.

Some important text

Some important text

Some important text

Validação

A propriedade error habilita o estado de erro, e utilizando a propriedade helperText será fornecido um feedback ao usuário sobre o erro.

Incorrect entry.

Incorrect entry.

Incorrect entry.

Multilinha

A propriedade multiline transforma o textfield em um <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea">TextArea</a>. Unless therowsprop is set, the height of the text field dynamically matches its content (using [TextareaAutosize](/components/textarea-autosize/)). You can use therowsMinandrowsMax` props to bound it.

Seleção

A propriedade select faz com que o campo de texto use internamente um componente Select.

Please select your currency

Please select your currency

Please select your currency

Please select your currency

Please select your currency

Please select your currency

Ícones

Há muitas formas de incluir um ícone com um campo de texto.

Adereços de campo

A forma principal é utilizando um componente InputAdornment. Estes podem ser usados para adicionar um prefixo, sufixo ou uma ação para um campo. Por exemplo, você pode usar um botão com ícone para ocultar ou revelar a senha.

Kg

Kg

Weight

$

Kg

Kg

Weight

$

Kg

Kg

Weight

$

Tamanhos

Gosta mais de campos de texto menores? Use a propriedade size.

A altura do campo na variante filled pode ser reduzida ainda mais ao renderizar o rótulo fora dele.

<TextField
  hiddenLabel
  id="filled-hidden-label-small"
  defaultValue="Small"
  variant="filled"
  size="small"
/>
<TextField
  hiddenLabel
  id="filled-hidden-label-normal"
  defaultValue="Normal"
  variant="filled"
/>

Leiaute

A propriedade margin pode ser utilizada para alterar o espaçamento vertical dos campos. Usar none (padrão) não aplicará margens para o FormControl, enquanto dense e normal irá. As definições dense e normal altera outros estilos para atender a especificação.

A propriedade fullWidth pode ser usada para fazer com que o campo ocupe a largura total de seu contêiner.

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

Não controlado vs controlado

O componente pode ser controlado ou não controlado.

<TextField
  id="outlined-name"
  label="Name"
  value={name}
  onChange={handleChange}
/>
<TextField
  id="outlined-uncontrolled"
  label="Uncontrolled"
  defaultValue="foo"
/>

Componentes

O componente TextField é composto por componentes menores (FormControl, Input, FilledInput, InputLabel, OutlinedInput, e FormHelperText) que você pode aproveitar diretamente para customizar significativamente os campos do seu formulário.

Você também pode ter notado que algumas propriedades de campo nativas do HTML input estão faltando no componente TextField. Isto é intencional. O componente cuida das propriedades mais usadas, depois cabe ao usuário, caso queira, usar o componente subjacente, como esta exibido na demonstração a seguir. Ainda, você pode usar inputProps (InputProps e InputLabelProps) se você quiser evitar algum boilerplate.

Some important helper text

Disabled

Error

Campos

<Input defaultValue="Hello world" inputProps={ariaLabel} />
<Input placeholder="Placeholder" inputProps={ariaLabel} />
<Input disabled defaultValue="Disabled" inputProps={ariaLabel} />
<Input defaultValue="Error" error inputProps={ariaLabel} />

Cor

A propriedade color altera a cor do destaque do campo de texto quando focado.

Campos customizados

Aqui estão alguns exemplos de customização do componente. Você pode aprender mais sobre isso na página de documentação de sobrescritas.

A customização não para no CSS, você pode usar composição para criar componentes customizados e dar ao seu aplicativo uma sensação única. Abaixo há um exemplo usando o componente InputBase, inspirado pelo Google Maps.


🎨 Se você está procurando inspiração, você pode verificar os exemplos de customização de MUI Treasury.

Limitações

Shrink

O rótulo do campo no estado de "shrink"(recuo) nem sempre está correto. O rótulo do campo deve recuar assim que o campo estiver exibindo algo. Em algumas circunstâncias, não podemos determinar o estado de "shrink" (input numérico, input datetime, input Stripe). Você pode notar uma sobreposição.

shrink

Para contornar o problema, você pode forçar o "shrink" do rótulo.

<TextField InputLabelProps={{ shrink: true }} />

ou

<InputLabel shrink>Contagem</InputLabel>

Rótulo flutuante

O rótulo flutuante está absolutamente posicionado, não afetará o leiaute da página. Você precisa ter certeza de que o componente de campo é maior do que o rótulo para a exibição correta.

type="number"

Campos com type="number" tem problemas potenciais de usabilidade:

  • Permitindo certos caracteres não numéricos ('e', '+', '-', '.') e silenciosamente descartando outros e silenciosamente descartando outros
  • A funcionalidade de rolagem para incrementar/decrementar o número, pode causar alterações acidentais difíceis de notar

e muito mais - consulte este artigo da equipe GOV.UK Design System para obter uma explicação mais detalhada.

Para validação de número, uma alternativa viável é usar o padão de campo, type="text", com o atributo pattern, por exemplo:

<TextField inputProps={{ inputMode: 'numeric', pattern: '[0-9]*' }} />

No futuro, pretendemos fornecer um componente de campo número.

Texto auxiliar

A propriedade de texto auxiliar afeta a altura do campo de texto. Se dois campos de texto forem colocados lado a lado, um com um texto auxiliar e outro sem ele, terão alturas diferentes. Por exemplo:

Para usos mais avançados, você pode tirar vantagem com:

Isso pode ser corrigido passando um caractere de espaço para a propriedade helperText:

Please enter your name

<TextField
  helperText="Please enter your name"
  id="demo-helper-text-aligned"
  label="Name"
/>
<TextField
  helperText=" "
  id="demo-helper-text-aligned-no-helper"
  label="Name"
/>

Integração com bibliotecas de campo de terceiros

Você pode usar bibliotecas de terceiros para formatar um campo. Você precisa fornecer uma implementação personalizada do elemento <input> com a propriedade inputComponent.

A seguinte demonstração usa as bibliotecas react-text-mask e react-number-format. O mesmo conceito pode ser aplicado para, p. ex. react-stripe-element.

O componente de entrada fornecido deve expor um ref com um valor que implemente a seguinte interface:

interface InputElement {
  focus(): void;
  value?: string;
}
const MyInputComponent = React.forwardRef((props, ref) => {
  const { component: Component, ...other } = props;

  // implemente a interface`InputElement`
  React.useImperativeHandle(ref, () => ({
    focus: () => {
      // lógica para focar o componente de terceiro renderizado deve ser feita aqui
    },
    // ocultando o valor, por exemplo, react-stripe-elements
  }));

  // O `Component` abaixo será seu `AlgumComponenteDeTerceiro`
  return <Component {...other} />;
});

// uso
<TextField
  InputProps={{
    inputComponent: MyInputComponent,
    inputProps: {
      component: SomeThirdPartyComponent,
    },
  }}
/>;

Acessibilidade

Para que o campo de texto seja acessível, a entrada deve estar vinculada ao rótulo e ao texto auxiliar. Os nós DOM subjacentes devem ter essa estrutura:

<div class="form-control">
  <label for="my-input">Endereço de e-mail</label>
  <input id="my-input" aria-describedby="my-helper-text" />
  <span id="my-helper-text">Nós nunca compartilharemos seu e-mail.</span>
</div>
  • Se você estiver usando o componente TextField, basta fornecer um id único.
  • Se você está compondo o componente:
<div class="form-control" mark="crwd-mark">
  <label for="my-input">Endereço de e-mail</label>
  <input id="my-input" aria-describedby="my-helper-text" />
  <span id="my-helper-text">Nós nunca compartilharemos seu e-mail.</span>
</div>

Projetos Complementares

Para situações de uso mais avançadas, você pode tirar proveito com: