Estou apenas escrevendo para entrada de texto e, onChange
caso eu chame setState
, o React processa novamente minha IU. O problema é que a entrada de texto sempre perde o foco, então preciso focalizá-la novamente para cada letra: D.
var EditorContainer = React.createClass({
componentDidMount: function () {
$(this.getDOMNode()).slimScroll({height: this.props.height, distance: '4px', size: '8px'});
},
componentDidUpdate: function () {
console.log("zde");
$(this.getDOMNode()).slimScroll({destroy: true}).slimScroll({height: 'auto', distance: '4px', size: '8px'});
},
changeSelectedComponentName: function (e) {
//this.props.editor.selectedComponent.name = $(e.target).val();
this.props.editor.forceUpdate();
},
render: function () {
var style = {
height: this.props.height + 'px'
};
return (
<div className="container" style={style}>
<div className="row">
<div className="col-xs-6">
{this.props.selected ? <h3>{this.props.selected.name}</h3> : ''}
{this.props.selected ? <input type="text" value={this.props.selected.name} onChange={this.changeSelectedComponentName} /> : ''}
</div>
<div className="col-xs-6">
<ComponentTree editor={this.props.editor} components={this.props.components}/>
</div>
</div>
</div>
);
}
});
javascript
reactjs
Krab
fonte
fonte
Respostas:
Sem ver o resto do seu código, isso é uma suposição. Ao criar um EditorContainer, especifique uma chave exclusiva para o componente:
<EditorContainer key="editor1"/>
Quando ocorrer uma nova renderização, se a mesma chave for vista, isso dirá ao React para não destruir e regenerar a visualização, em vez disso, reutilize. Então, o item em foco deve manter o foco.
fonte
Eu sempre volto aqui e sempre encontro a solução para o meu outro lugar no final. Então, vou documentar aqui porque sei que vou esquecer isso de novo!
A razão para
input
perder o foco no meu caso foi devido ao fato de que eu estava reproduzindo ainput
mudança de estado on.Código Buggy:
Então, o problema é que eu sempre começo a codificar tudo em um lugar para testar rapidamente e depois divido tudo em módulos separados. Mas, aqui esta estratégia sai pela culatra porque atualizar o estado na mudança de entrada dispara a função de renderização e o foco é perdido.
Consertar é simples, fazer a modularização desde o início, ou seja, "Mova o
Input
componente para fora derender
função"Código Fixo
Ref. para a solução: https://github.com/styled-components/styled-components/issues/540#issuecomment-283664947
fonte
render()
eclass ... extends Component
por causa da referência athis
. por exemploonChange={this.handleInputChange}
render
função, para os componentes funcionais do React, não define os componentes no corpo da função.render
função que estava sendo passada pelo método 'this.handleChange' e retornou os componentes a serem usados. Exconst TextAreaDataField = TextAreaDataFieldFactory(this.handleChange)
. Simplesmente movi a criação do componente para o construtor e os acessei norender
método comothis.TextAreaDataField
. Funcionou como um encanto.Se for um problema em um roteador react,
<Route/>
use orender
prop em vez decomponent
.A perda de foco acontece porque o
component
adereço usaReact.createElement
cada vez em vez de apenas refazer as alterações.Detalhes aqui: https://reacttraining.com/react-router/web/api/Route/component
fonte
<Route component={() => <MyComponent/>} />
quando deveria ter feito<Route component={MyComponent} />
Minha resposta é semelhante ao que @ z5h disse.
No meu caso, costumava
Math.random()
gerar um exclusivokey
para o componente.Achei que o
key
é usado apenas para acionar um rerender para aquele componente específico, em vez de renderizar novamente todos os componentes dessa matriz (eu retorno uma matriz de componentes em meu código). Não sabia que era usado para restaurar o estado após a renderização.Remover isso funcionou para mim.
fonte
Aplicar o
autoFocus
atributo aoinput
elemento pode funcionar como uma solução alternativa em situações em que há apenas uma entrada que precisa ser focada. Nesse caso, umkey
atributo seria desnecessário porque é apenas um elemento e, além disso, você não teria que se preocupar em dividir oinput
elemento em seu próprio componente para evitar perder o foco na re-renderização do componente principal.fonte
Eu tenho o mesmo comportamento.
O problema em meu código é que criei um Array aninhado de elementos jsx como este:
Cada elemento neste Array aninhado é renderizado novamente sempre que eu atualizo o elemento pai. E assim as entradas perdem o prop "ref" cada vez
Corrigi o problema com a transformação da matriz interna em um componente de reação (uma função com uma função de renderização)
EDITAR:
O mesmo problema aparece quando eu construo um aninhado
React.Fragment
fonte
Acabei de encontrar esse problema e vim aqui para obter ajuda. Verifique seu CSS! O campo de entrada não pode ter
user-select: none;
ou não funcionará em um iPad.fonte
Resolvi o mesmo problema excluindo o atributo-chave na entrada e seus elementos pai
fonte
Para mim, isso estava sendo causado pela caixa de entrada de pesquisa sendo renderizada no mesmo componente (chamado UserList) que a lista de resultados da pesquisa. Portanto, sempre que os resultados da pesquisa mudavam, todo o componente UserList era renderizado novamente, incluindo a caixa de entrada.
Minha solução foi criar um novo componente chamado UserListSearch, que é separado do UserList . Não precisei definir chaves nos campos de entrada em UserListSearch para que isso funcionasse. A função de renderização do meu UsersContainer agora se parece com isto:
Espero que isso ajude alguém também.
fonte
Se o campo de entrada estiver dentro de outro elemento (ou seja, um elemento de contêiner como
<div key={"bart"}...><input key={"lisa"}...> ... </input></div>
- as reticências aqui indicando código omitido), deve haver uma chave única e constante no elemento de contêiner (bem como no campo de entrada) . Caso contrário, o React renderiza um novo elemento de contêiner quando o estado do filho é atualizado, em vez de simplesmente renderizar novamente o contêiner antigo. Logicamente, apenas o elemento filho deve ser atualizado, mas ...Tive esse problema ao tentar escrever um componente que exigia muitas informações de endereço. O código de trabalho é parecido com este
Leitores atentos notarão que
<fieldset>
é um elemento que contém, mas não requer uma chave. O mesmo vale para<>
e<React.Fragment>
ou mesmo por<div>
quê? Talvez apenas o contêiner imediato precise de uma chave. Não sei. Como dizem os livros de matemática, a explicação é deixada para o leitor como um exercício.fonte
O principal motivo é: Quando o React for renderizado novamente, sua referência de DOM anterior será inválida. Significa que o react mudou a árvore DOM, e você this.refs.input.focus não funcionará, porque a entrada aqui não existe mais.
fonte
As respostas fornecidas não me ajudaram, aqui estava o que eu fiz, mas eu tinha uma situação única.
Para limpar o código, costumo usar esse formato até que esteja pronto para colocar o componente em outro arquivo.
Mas isso fez com que perdesse o foco, quando coloquei o código diretamente no div funcionou.
Não sei por que, esse é o único problema que tive ao escrever dessa forma e faço isso na maioria dos arquivos que tenho, mas se alguém fizer algo semelhante, é por isso que perde o foco.
fonte
Tive o mesmo problema com uma tabela html em que inseri linhas de texto em uma coluna. dentro de um loop, leio um objeto json e crio linhas em particular, tenho uma coluna com texto de entrada.
http://reactkungfu.com/2015/09/react-js-loses-input-focus-on-typing/
Eu consegui resolver da seguinte maneira
fonte
Acontece que eu estava vinculando
this
ao componente que estava causando a renderização.Achei melhor postá-lo aqui, caso alguém mais tivesse esse problema.
Eu tive que mudar
Para
Correção simples, já que no meu caso, eu realmente não precisa
this
norenderField
, mas espero que me postar isso vai ajudar alguém.fonte
Mudei o
value
suporte paradefaultValue
. Isso funciona para mim.fonte
Meu problema é que nomeei minha chave dinamicamente com um valor do item, no meu caso "nome", então a chave era chave = {
${item.name}-${index}
}. Então, quando eu quisesse alterar a entrada com item.name como valor, a chave também mudaria e, portanto, reagiria não reconheceria esse elementofonte
Eu tive esse problema e o problema acabou sendo que eu estava usando um componente funcional e vinculando com o estado de um componente pai. Se eu mudei para usar um componente de classe, o problema foi embora. Esperançosamente, há uma maneira de contornar isso ao usar componentes funcionais, pois é muito mais conveniente para representantes de itens simples e outros.
fonte
incluiu o próximo código na entrada da tag:
Antes:
Depois de:
fonte