1
votes

Le stockage de session a-t-il un délai lors de la récupération?

Dans mon code de réaction, à l'intérieur d'un composant, je récupère une valeur du stockage de session (à l'intérieur du hook useEffect). Lorsque la console est imprimée, elle affiche la valeur. Mais à l'intérieur du rendu (ou de la méthode de retour), il n'a pas la valeur qui vient d'être récupérée. Y a-t-il un délai lors de la récupération depuis le stockage de session?

Contournement du problème après avoir stocké le même état et récupéré à l'intérieur du rendu!

let myValue = '';
useEffect(()=>{
    myValue = sessionStorage.getItem("someKey");
},[]);
// In the return method
return {
    <div>{myValue}</div>
}

Pourquoi la valeur récupérée depuis le stockage de session n'est pas disponible immédiatement en rendu?


2 commentaires

La définition d'une variable privée à partir de 'useEffect' ne va pas provoquer un nouveau rendu. Vous pouvez envisager d'utiliser useState afin de disposer d'un mécanisme pour définir la valeur et enregistrer un nouveau rendu.


Oui! C'est ainsi que j'avais contourné le problème.


4 Réponses :


1
votes

Non, les appels localStorage et sessionStorage sont synchronisés Vous ne voyez pas la valeur dans le rendu car la vue n'est pas restituée. Vous devez définir un état, obtenir de nouveaux accessoires ou forcer le rendu pour le voir.

Comment forcer la mise à jour dans les hooks

const [, updateState] = React.useState();
const forceUpdate = useCallback(() => updateState({}), []);

p >


0 commentaires

0
votes

Il est disponible immédiatement

return {
    <div>{sessionStorage.getItem("someKey")}</div>
}


0 commentaires

0
votes

Non, tous les appels sessionStorage sont synchrones .


0 commentaires

4
votes

Le problème ici est que vous vous attendez à ce qu'un changement de valeur de variable déclenche un nouveau rendu. React ne fonctionne pas de cette façon et vous aurez besoin d'une autre approche si vous souhaitez modifier une valeur et la faire restituer:

Considérez:

const [myValue, setMyValue] = useState('');

useEffect(()=>{
   setMyValue(sessionStorage.getItem("someKey"));
},[]);

// In the return method
return {
    <div>{myValue}</div>
}


0 commentaires