Eu defini dois campos TextInput da seguinte maneira:
<TextInput
style = {styles.titleInput}
returnKeyType = {"next"}
autoFocus = {true}
placeholder = "Title" />
<TextInput
style = {styles.descriptionInput}
multiline = {true}
maxLength = {200}
placeholder = "Description" />
Mas depois de pressionar o botão "próximo" no teclado, meu aplicativo nativo de reação não está pulando para o segundo campo TextInput. Como posso conseguir isso?
Obrigado!
ios
react-native
andreaswienes
fonte
fonte
v16.8.0
usam o React ou acima, recomendo a resposta fornecida por @Eli Johnson na parte inferior. O React descontinuou muitos usos dosref
fornecidos nas soluções abaixo.Respostas:
Definir o segundo
TextInput
foco, quando o anteriorTextInput
'sonSubmitEditing
é disparado.Tente isto
Adicionando uma referência ao segundo TextInput
ref={(input) => { this.secondTextInput = input; }}
Vincule a função de foco ao primeiro evento onSubmitEditing do TextInput .
onSubmitEditing={() => { this.secondTextInput.focus(); }}
Lembre-se de definir blurOnSubmit como false, para evitar oscilações do teclado.
blurOnSubmit={false}
fonte
onSubmitEditing
retorno de chamada é chamado após oblur
evento. Portanto, o teclado pode ficar louco se focado no próximo elemento imediatamente. Portanto, pode ser útil definirblurOnSubmit={false}
todos os elementos no formulário, mas deixar notrue
último elemento, para permitir que o botão Concluído desfoque a última entrada.blurOnSubmit={false}
para evitar trepidação no teclado fez com que isso parasse de funcionar, alguém que sabe o que está acontecendo?focus
trabalho, não use um wrapper para oTextInput
componente. Se você tem umCustomTextInput
componente say que envolveTextInput
, é necessário implementarTextInput
métodos de desfoque e foco para esse componente, para que funcione conforme o esperado.Você pode fazer isso sem usar refs . Essa abordagem é preferida, pois as referências podem levar a códigos frágeis . Os documentos do React recomendam encontrar outras soluções sempre que possível:
Em vez disso, usaremos uma variável de estado para focar o segundo campo de entrada.
Adicione uma variável de estado que passaremos como suporte ao
DescriptionInput
:Defina um método manipulador que definirá essa variável de estado como true:
Ao enviar / pressionar enter / next no
TitleInput
, ligaremoshandleTitleInputSubmit
. Isso será definidofocusDescriptionInput
como verdadeiro.DescriptionInput
Ofocus
suporte de é definido como nossafocusDescriptionInput
variável de estado. Portanto, quando asfocusDescriptionInput
alterações (na etapa 3)DescriptionInput
forem renderizadas novamente comfocus={true}
.É uma boa maneira de evitar o uso de referências, pois as referências podem levar a um código mais frágil :)
EDIT: h / t para @LaneRettig para apontar que você precisará envolver o React Native TextInput com alguns adereços e métodos adicionados para que ele responda
focus
:fonte
No React Native 0.36, a chamada
focus()
(como sugerido em várias outras respostas) em um nó de entrada de texto não é mais suportada. Em vez disso, você pode usar oTextInputState
módulo do React Native. Criei o seguinte módulo auxiliar para facilitar isso:Você pode, então, chamar a
focusTextInput
função em qualquer "ref" de aTextInput
. Por exemplo:fonte
<Field ... onSubmitEditing={() => focusTextInput(this._password)} />
e ref deve ser assim<Field ... withRef refName={e => this._password = e}/>
calling focus() on a text input node isn't supported any more
=> afirmação ousada, fonte? A chamadafocus()
funciona bem com a v0.49.5 +TextInputState
não está documentadafocus()
eblur()
é mencionada: facebook.github.io/react-native/releases/next/docs/…Eu criei uma pequena biblioteca que faz isso, nenhuma alteração de código é necessária, exceto a substituição da exibição de agrupamento e a importação do TextInput:
https://github.com/zackify/react-native-autofocus
Explicado em detalhes aqui: https://zach.codes/autofocus-inputs-in-react-native/
fonte
Pensei em compartilhar minha solução usando um componente de função ... ' isso ' não é necessário!
Aqui está um exemplo do meu componente:
Não sei, espero que isso ajude alguém =)
fonte
Usando react-native 0.45.1, também encontrei problemas ao tentar definir o foco em uma senha TextInput depois de pressionar a tecla Enter em um nome de usuário TextInput.
Depois de experimentar a maioria das soluções mais conceituadas aqui no SO, encontrei uma solução no github que atendia às minhas necessidades: https://github.com/shoutem/ui/issues/44#issuecomment-290724642
Resumindo:
E então eu uso assim:
fonte
ref
parainputRef
... Você pode soltar o seu componente personalizado inteira e seu segundo bloco de código irá funcionar como está, enquanto você voltar a usarref
Para mim no RN 0.50.3 é possível desta maneira:
Você deve ver this.PasswordInputRef. _root .focus ()
fonte
Se você estiver usando
tcomb-form-native
como eu sou, também poderá fazer isso. Aqui está o truque: em vez de definir os adereçosTextInput
diretamente, você faz isso viaoptions
. Você pode consultar os campos do formulário como:Portanto, o produto final é mais ou menos assim:
(Agradecemos à remcoanker por postar a idéia aqui: https://github.com/gcanti/tcomb-form-native/issues/96 )
fonte
Foi assim que consegui. E o exemplo abaixo usou a API React.createRef () introduzida no React 16.3.
Eu acho que isso vai te ajudar.
fonte
Meu cenário é <CustomBoladonesTextInput /> agrupando um RN <TextInput /> .
Resolvi esse problema da seguinte maneira:
Meu formulário se parece com:
Na definição do componente CustomBoladonesTextInput, passo o refField para o ref interno prop desta maneira:
E pronto. Tudo volta a funcionar novamente. Espero que isto ajude
fonte
Experimente esta solução nos problemas do React Native no GitHub.
https://github.com/facebook/react-native/pull/2149#issuecomment-129262565
Você precisa usar o prop ref para o componente TextInput.
Então você precisa criar uma função que seja chamada no objeto onSubmitEditing que mova o foco na segunda ref de TextInput.
fonte
Usando refs de retorno de chamada em vez da refs de sequência herdada :
fonte
E adicione o método
onSubmitEditing={() => this.focusTextInput(this.refs.password)}
conforme abaixo:fonte
Para que a solução aceita funcione se você
TextInput
estiver dentro de outro componente, será necessário "pop" a referênciaref
para o contêiner pai.fonte
no seu componente:
Nota: Eu usei
._root
porque é uma referência a TextInput na entrada NativeBase'Library 'e em suas entradas de texto como esta
fonte
e adicione método
fonte
Existe uma maneira de capturar guias em a
TextInput
. É hacky, mas melhor que nada .Defina um
onChangeText
manipulador que compare o novo valor de entrada com o antigo, verificando a\t
. Se um for encontrado, avance o campo como mostrado por @boredgamesSupondo que a variável
username
contenha o valor do nome de usuário esetUsername
despache uma ação para alterá-la na loja (estado do componente, loja redux, etc), faça algo assim:fonte
Aqui, uma solução reagente para um componente de entrada que possui uma propriedade: focus.
O campo será focado desde que esse suporte seja definido como verdadeiro e não terá foco enquanto for falso.
Infelizmente, este componente precisa ter um: ref definido, não consegui encontrar outra maneira de chamar .focus (). Estou feliz com sugestões.
https://gist.github.com/Knotschi/6f97efe89681ac149113ddec4c396cc5
fonte
swap!
umatom
tipo. De acordo com os documentos, isso é usado para vincular ao React: "Qualquer componente que usa um átomo é automaticamente renderizado automaticamente quando seu valor é alterado". reagent-project.github.ioSe você estiver usando o NativeBase como componentes da interface do usuário, poderá usar esta amostra
fonte