mon composant ressemble à ce problème
const onkeychange = async (e) => {
setState({ ...state, textValue: e.target.value })
if (delay !== false) {
clearTimeout(delay)
}
let string = e.target.value
if (string.trim() == '') {
setState({ ...state, issearching: false })
}
}
<input
type="text"
autoComplete="off"
name="search"
placeholder="Search for a Product, Brand or Category"
value={state.textValue}
className="search"
onChange={onkeychange}
/>
, quand après je tape quelque chose dans l'entrée. Ensuite, essayez de tout supprimer, je ne peux pas je peux supprimer tous les caractères sauf un dernier. Par exemple: je tape bonjour dans l'entrée. en essayant de le supprimer avec un retour arrière, je peux supprimer ello mais pas le h
3 Réponses :
Vous vérifiez si string === '' et la casse true vous définissez l ' état en utilisant l'ancien state qui inclut la valeur de string juste avant de supprimer le dernier caractère, c'est pourquoi vous ne pouvez pas supprimer le dernier. Vous devez supprimer la condition
const onkeychange = async (e) => {
setState({ ...state, textValue: e.target.value })
if (delay !== false)
clearTimeout(delay)
}
J'ai besoin de cette condition
Votre condition garantit que textValue ne sera jamais vide. C'est un comportement recherché? Cas non, quel est le comportement attendu?
Utilisez la forme fonctionnelle de setState pour obtenir le dernier état lors de sa mise à jour. Je vous recommande également d'envisager d'utiliser le crochet de réduction ici.
const onkeychange = async e => {
const value = e.target ? e.target.value : "";
setState(currentState => ({ ...currentState, textValue: value }));
if (delay !== false) {
clearTimeout(delay)
}
if (value.trim() === "") {
setState(currentState => ({ ...currentState, issearching: false }));
}
};
Le setState est asynchrone, vous pouvez utiliser un rappel dans le setState pour obtenir le preState correct pour résoudre ce problème.
const string = e.target.value
if (delay !== false) {
clearTimeout(delay);
}
const isSearching = string.trim() !== "";
setState({ ...state, textValue: string, isSearching});
ou un moyen plus simple est pour n'exécuter setState qu'une seule fois.
const string = e.target.value;
setState((prevState) => {
return { ...prevState, textValue: string }
})
if (delay !== false) {
clearTimeout(delay)
}
if (string.trim() === '') {
setState((prevState) => {
return ({ ...prevState, isSearching: false })
})
}