Qual é a maneira de reagir ao definir o foco em um campo de texto específico depois que o componente é renderizado?
A documentação parece sugerir o uso de referências, por exemplo:
Defina ref="nameInput"
no meu campo de entrada na função renderizar e chame:
this.refs.nameInput.getInputDOMNode().focus();
Mas onde devo chamar isso? Eu tentei alguns lugares, mas não consigo fazê-lo funcionar.
javascript
reactjs
Dave
fonte
fonte
<input>
elemento. Algo como<input ref={ (component) => ReactDOM.findDOMNode(component).focus() } />
A resposta de @ Dhiraj está correta e, por conveniência, você pode usar o suporte autoFocus para que uma entrada foque automaticamente quando montada:
Observe que no jsx é
autoFocus
(maiúscula F) diferente do html antigo simples, que não diferencia maiúsculas de minúsculas.fonte
autofocus
atributo, ele realmente usafocus()
no DOM montar emreact-dom
por isso é bastante confiável.No React 0.15 , o método mais conciso é:
fonte
Foco na montagem
Se você deseja apenas focar um elemento quando ele é montado (renderizado inicialmente), basta usar o atributo autoFocus.
Foco dinâmico
Para controlar o foco dinamicamente, use uma função geral para ocultar os detalhes da implementação de seus componentes.
React 16.8 + Componente funcional - useFocus hook
Demonstração completa
React 16.3 + Componentes da classe - utilizeFocus
Demonstração completa
fonte
(htmlElRef.current as any).focus()
e (2) emreturn {htmlElRef, setFocus}
vez da matriz.useFocus
para mais de um elemento.useFocus
escrito em texto datilografado. gist.github.com/carpben/de968e377cbac0ffbdefe1ab56237573as const
você tem), muito educativas!set
na segunda posição comoconst [inputRef, setInputFocus] = useFocus()
. Isso corresponde a useState more. Primeiro o objeto, depois o levantador desse objetoSe você quiser apenas fazer o foco automático no React, é simples.
Embora se você quiser apenas saber onde colocar esse código, a resposta está em componentDidMount ().
v014.3
Leia os documentos da API aqui: https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode
fonte
F
! (Nota para si e para os outros, não para responder).O React 16.3 adicionou uma nova maneira conveniente de lidar com isso, criando uma ref no construtor do componente e use-o como abaixo:
Para mais detalhes, você pode conferir este artigo no blog React.
Atualizar:
A partir do React 16.8 , o
useRef
hook pode ser usado nos componentes de função para obter o mesmo resultado:fonte
Acabei de encontrar este problema e estou usando o
react 15.0.115.0.2 e estou usando a sintaxe ES6 e não obtive o que precisava das outras respostas desde que a v.15 caiu semanas atrás e algumas dasthis.refs
propriedades foram preteridos e removidos .Em geral, o que eu precisava era:
Estou a usar:
Focar o primeiro elemento de entrada
Eu usei
autoFocus={true}
o primeiro<input />
na página para que, quando o componente for montado, ele tenha foco.Focar o primeiro elemento de entrada com um erro
Isso levou mais tempo e foi mais complicado. Estou mantendo fora do código que não é relevante para a solução por questões de brevidade.
Loja / Estado Redux
Eu preciso de um estado global para saber se devo definir o foco e desabilitá-lo quando foi definido, para não continuar redefinindo o foco quando os componentes forem renderizados novamente (usarei
componentDidUpdate()
para verificar a definição do foco. )Isso pode ser projetado da maneira que você achar melhor para sua aplicação.
Componente Container
O componente precisará ter a
resetfocus
propriedade definida e um callBack para limpar a propriedade, se acabar definindo o foco em si mesmo.Observe também que organizei meus Action Creators em arquivos separados, principalmente devido ao meu projeto ser bastante grande e que eu queria dividi-los em partes mais gerenciáveis.
Componente de apresentação
Visão geral
A ideia geral é que cada campo de formulário que possa ter um erro e ser focado precise se verificar e se precisar definir o foco em si mesmo.
Há uma lógica comercial que precisa acontecer para determinar se o campo especificado é o campo certo para definir o foco. Isso não é mostrado porque dependerá do aplicativo individual.
Quando um formulário é enviado, esse evento precisa definir o sinalizador de foco global
resetFocus
como true. Então, à medida que cada componente se atualiza, ele verifica se obtém o foco e, se obtém, despacha o evento para redefinir o foco para que outros elementos não precisem continuar verificando.edit Como observação, eu tinha minha lógica de negócios em um arquivo "utilitários" e acabei de exportar o método e o chamei em cada
shouldfocus()
método.Felicidades!
fonte
Os documentos do React agora têm uma seção para isso. https://facebook.github.io/react/docs/more-about-refs.html#the-ref-callback-attribute
fonte
autofocus
montar, estava apenas procurando o elemento para manter o foco ao inserir um valor. Isso funcionou perfeitamente para esse cenário. (usando reagir 15)Esta não é mais a melhor resposta. A partir da v0.13,
this.refs
pode não estar disponível até APÓS acomponentDidMount()
execução, em alguns casos estranhos.Basta adicionar a
autoFocus
tag ao seu campo de entrada, como o FakeRainBrigand mostrou acima.fonte
<input autofocus>
campos não se comportarão bem<input>
renderização posteriorRef. Comentário de @ Dave na resposta de @ Dhiraj; uma alternativa é usar a funcionalidade de retorno de chamada do atributo ref no elemento que está sendo renderizado (depois que um componente é renderizado pela primeira vez):
Mais informações
fonte
Uncaught TypeError: Cannot read property 'focus' of null
component && React.findDomNode...
. Leia mais sobre isso aqui: facebook.github.io/react/docs/…Esta é a maneira correta, como focar automaticamente. Quando você usa retorno de chamada em vez de sequência como valor ref, ele é chamado automaticamente. Você conseguiu sua referência disponível, sem a necessidade de tocar no DOM usando
getDOMNode
fonte
Observe que nenhuma dessas respostas funcionou para mim com um componente TextField da interface do usuário . Por Como definir o foco para um materialUI TextField? Eu tive que pular algumas etapas para fazer isso funcionar:
fonte
focus()
deve ser adiada até o final da animação.Você pode colocar essa chamada de método dentro da função de renderização. Ou dentro do método do ciclo de vida,
componentDidUpdate
fonte
Você não precisa
getInputDOMNode
? nesse caso...Basta obter o
ref
efocus()
quando o componente é montado - componentDidMount ...fonte
O AutoFocus funcionou melhor para mim. Eu precisava alterar algum texto para uma entrada com esse texto em clique duplo, então foi assim que eu acabei:
NOTA: Para corrigir o problema em que o React coloca o cursor no início do texto, use este método:
Encontre aqui: https://coderwall.com/p/0iz_zq/how-to-put-focus-at-the-end-of-an-input-with-react-js
fonte
Eu tenho o mesmo problema, mas também tenho algumas animações, então meu colega sugere usar window.requestAnimationFrame
este é o atributo ref do meu elemento:
fonte
Deveria estar
fonte
A resposta mais simples é adicionar ref = "some name" no elemento de entrada de texto e chamar a função abaixo.
fonte
Para mover o foco para um elemento recém-criado, você pode armazenar o ID do elemento no estado e usá-lo para definir
autoFocus
. por exemploDessa forma, nenhuma das caixas de texto fica focada no carregamento da página (como eu quero), mas quando você pressiona o botão "Adicionar" para criar um novo registro, esse novo registro fica focado.
Como
autoFocus
não "roda" novamente, a menos que o componente seja remontado, não preciso me preocupar em desabilitarthis.state.focus
(ou seja, ele não continuará roubando o foco de volta à medida que atualizo outros estados).fonte
Leia quase toda a resposta, mas não viu uma
getRenderedComponent().props.input
Defina suas referências de entrada de texto
this.refs.username.getRenderedComponent().props.input.onChange('');
fonte
Depois de tentar muitas opções acima sem sucesso, descobri que era como era
disabling
e depoisenabling
a entrada que causou a perda do foco.Eu tinha um suporte
sendingAnswer
que desabilitaria a entrada enquanto eu estava pesquisando o backend.Depois que removi o suporte desativado, tudo começou a funcionar novamente.
fonte
Versão atualizada você pode conferir aqui
fonte
Como existem várias razões para esse erro, pensei em publicar também o problema que estava enfrentando. Para mim, o problema era que eu renderizei minhas entradas como conteúdo de outro componente.
Foi assim que chamei o componente acima:
fonte
De acordo com a sintaxe atualizada, você pode usar
this.myRref.current.focus()
fonte