J'écris juste pour entrer du texte et en onChange
cas d'appels setState
, React réaffiche mon interface utilisateur. Le problème est que l'entrée de texte perd toujours un focus, donc je dois le concentrer à nouveau pour chaque lettre: 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
la source
la source
Réponses:
Sans voir le reste de votre code, c'est une supposition. Lorsque vous créez un EditorContainer, spécifiez une clé unique pour le composant:
<EditorContainer key="editor1"/>
Lorsqu'un nouveau rendu se produit, si la même clé est vue, cela indiquera à React de ne pas écraser et de régénérer la vue, au lieu de la réutiliser. Ensuite, l'élément ciblé doit conserver le focus.
la source
Je reviens ici encore et encore et trouve toujours la solution à mon ailleurs à la fin. Alors, je vais le documenter ici car je sais que je vais encore oublier ça!
La raison
input
de ma perte de concentration dans mon cas était due au fait que je refaisais le renduinput
changement d'état.Code du buggy:
Donc, le problème est que je commence toujours à tout coder à un seul endroit pour tester rapidement et ensuite le diviser en modules séparés. Mais, ici, cette stratégie se retourne parce que la mise à jour de l'état sur le changement d'entrée déclenche la fonction de rendu et le focus est perdu.
Le correctif est simple, faites la modularisation depuis le début, en d'autres termes, "
Input
Sortez le composant derender
fonction"Code fixe
Réf. à la solution: https://github.com/styled-components/styled-components/issues/540#issuecomment-283664947
la source
render()
et àclass ... extends Component
cause de la référence àthis
. par exempleonChange={this.handleInputChange}
render
fonction, pour les composants fonctionnels React, ne définit pas les composants dans le corps de la fonction.render
fonction qui étaient passés à la méthode 'this.handleChange' et renvoyaient les composants à utiliser. Par exempleconst TextAreaDataField = TextAreaDataFieldFactory(this.handleChange)
. J'ai simplement déplacé la création du composant vers le constructeur et y accéder dans larender
méthode en tant quethis.TextAreaDataField
. A fonctionné comme un charme.Si c'est un problème dans un routeur de réaction,
<Route/>
utilisez lerender
prop à la place decomponent
.La perte de concentration se produit parce que l'
component
accessoire utiliseReact.createElement
chaque fois au lieu de simplement restituer les modifications.Détails ici: https://reacttraining.com/react-router/web/api/Route/component
la source
<Route component={() => <MyComponent/>} />
quand j'aurais dû le faire<Route component={MyComponent} />
Ma réponse est similaire à ce que @ z5h a dit.
Dans mon cas, j'avais l'habitude
Math.random()
de générer un uniquekey
pour le composant.Je pensais que le
key
n'était utilisé que pour déclencher un rerender pour ce composant particulier plutôt que pour re-rendre tous les composants de ce tableau (je renvoie un tableau de composants dans mon code). Je ne savais pas qu'il était utilisé pour restaurer l'état après le rendu.Supprimer cela a fait le travail pour moi.
la source
L'application de l'
autoFocus
attribut à l'input
élément peut constituer une solution de contournement dans les situations où une seule entrée doit être ciblée. Dans ce cas, unkey
attribut serait inutile car il ne s'agit que d'un élément et en outre, vous n'auriez pas à vous soucier de diviser l'input
élément en son propre composant pour éviter de perdre le focus sur le rendu du composant principal.la source
J'ai le même comportement.
Le problème dans mon code était que j'ai créé un tableau imbriqué d'éléments jsx comme celui-ci:
Chaque élément de ce tableau imbriqué est ré-rendu chaque fois que j'ai mis à jour l'élément parent. Et donc les entrées y perdent à chaque fois des accessoires "ref"
J'ai corrigé le problème avec transformer le tableau interne en un composant de réaction (une fonction avec une fonction de rendu)
ÉDITER:
Le même problème apparaît lorsque je crée un
React.Fragment
la source
Je viens de rencontrer ce problème et je suis venu ici pour obtenir de l'aide. Vérifiez votre CSS! Le champ de saisie ne peut pas avoir
user-select: none;
ou il ne fonctionnera pas sur un iPad.la source
J'ai résolu le même problème en supprimant l'attribut clé dans l'entrée et ses éléments parents
la source
Pour moi, cela était dû au rendu de la zone de saisie de recherche dans le même composant (appelé UserList) que la liste des résultats de la recherche. Ainsi, chaque fois que les résultats de la recherche changeaient, l'ensemble du composant UserList était renvoyé, y compris la zone de saisie.
Ma solution était de créer un tout nouveau composant appelé UserListSearch qui est distinct de UserList . Je n'avais pas besoin de définir des clés sur les champs de saisie dans UserListSearch pour que cela fonctionne. La fonction de rendu de mon UsersContainer ressemble maintenant à ceci:
Espérons que cela aide quelqu'un aussi.
la source
Si le champ d'entrée est à l'intérieur d'un autre élément (c'est-à-dire, un élément conteneur comme
<div key={"bart"}...><input key={"lisa"}...> ... </input></div>
- les ellipses indiquant ici le code omis), il doit y avoir une clé unique et constante sur l'élément conteneur (ainsi que sur le champ d'entrée) . Sinon, React restitue un tout nouvel élément de conteneur lorsque l'état de l'enfant est mis à jour plutôt que de simplement restituer l'ancien conteneur. Logiquement, seul l'élément enfant doit être mis à jour, mais ...J'ai eu ce problème en essayant d'écrire un composant qui a pris un tas d'informations d'adresse. Le code de travail ressemble à ceci
Les lecteurs attentifs remarqueront qu'il
<fieldset>
s'agit d'un élément contenant, mais qu'il ne nécessite pas de clé. La même chose vaut pour<>
et<React.Fragment>
ou même<div>
pourquoi? Peut-être que seul le conteneur immédiat a besoin d'une clé. Je ne sais pas. Comme le disent les manuels de mathématiques, l'explication est laissée au lecteur sous forme d'exercice.la source
La raison principale est la suivante: lorsque React re-render, votre référence DOM précédente sera invalide. Cela signifie que react a changé l'arborescence DOM, et vous this.refs.input.focus ne fonctionnera pas, car l'entrée ici n'existe plus.
la source
Les réponses fournies ne m'ont pas aidé, voici ce que j'ai fait mais j'avais une situation unique.
Pour nettoyer le code, j'ai tendance à utiliser ce format jusqu'à ce que je sois prêt à extraire le composant dans un autre fichier.
Mais cela lui a fait perdre le focus, quand j'ai mis le code directement dans le div, cela fonctionnait.
Je ne sais pas pourquoi c'est le seul problème que j'ai eu avec l'écriture de cette façon et je le fais dans la plupart des fichiers que j'ai, mais si quelqu'un fait une chose similaire, c'est pourquoi il perd le focus.
la source
J'ai eu le même problème avec une table html dans laquelle j'ai des lignes de texte d'entrée dans une colonne. dans une boucle, je lis un objet json et je crée des lignes en particulier j'ai une colonne avec inputtext.
http://reactkungfu.com/2015/09/react-js-loses-input-focus-on-typing/
J'ai réussi à le résoudre de la manière suivante
la source
Il s'est avéré que j'étais lié
this
au composant qui provoquait sa restitution.J'ai pensé que je le publierais ici au cas où quelqu'un d'autre aurait ce problème.
Je devais changer
À
Solution simple puisque dans mon cas, je ne l' ai pas vraiment besoin
this
enrenderField
, mais je l' espère me affichant cela aidera quelqu'un d' autre.la source
Je suis passé à l'
value
hélicedefaultValue
. Ça marche pour moi.la source
Mon problème était que j'ai nommé ma clé dynamiquement avec une valeur de l'élément, dans mon cas "nom" donc la clé était key = {
${item.name}-${index}
}. Ainsi, lorsque je voulais changer l'entrée avec item.name comme valeur, la clé changerait également et donc réagir ne reconnaîtrait pas cet élémentla source
J'ai eu ce problème et le problème s'est avéré être que j'utilisais un composant fonctionnel et que je me connectais à l'état d'un composant parent. Si je suis passé à l'utilisation d'un composant de classe, le problème a disparu. Espérons qu'il existe un moyen de contourner ce problème lors de l'utilisation de composants fonctionnels, car c'est beaucoup plus pratique pour les moteurs de rendu d'élément simples et al.
la source
inclus le code suivant dans l'entrée de balise:
Avant:
Après:
la source