javascript - 为什么浏览器看不到本地存储元素的值?
问题描述
我正在使用 React JS 创建一个简单的俄罗斯方块游戏。除了 App.js 之外,我的主要组件是 Tetris.js 功能组件。在 useEffect() 中,我使用本地存储存储舞台或当前播放器 tetromino 等组件。播放时,可以在控制台中检索数据,并且数据不为空。
useEffect(() => {
localStorage.setItem("dropTimeStored", JSON.stringify(dropTime));
localStorage.setItem("stageStored", JSON.stringify(stage));
localStorage.setItem("playerStored", JSON.stringify(stage));
localStorage.setItem("rowsClearedStored", JSON.stringify(rowsCleared));
localStorage.setItem("scoreStored", JSON.stringify(score));
localStorage.setItem("rowsStored", JSON.stringify(rows));
localStorage.setItem("levelStored", JSON.stringify(level));
localStorage.setItem("gameOverStored", JSON.stringify(gameOver));
}, [dropTime, stage, player, rowsCleared, score, rows, level, gameOver])
我想让用户选择在立即关闭浏览器后继续游戏。这就是为什么在开始游戏功能时我正在做的事情:
const startGame = () => {
console.log(loadLocalStorage);
if (loadLocalStorage){
setDropTime(JSON.parse(localStorage.getItem("dropTimeStored")));
setStage(JSON.parse(localStorage.getItem("stageStored")));
player = JSON.parse(localStorage.getItem("playerStored"));
rowsCleared = JSON.parse(localStorage.getItem("rowsClearedStored"));
setScore(JSON.parse(localStorage.getItem("scoreStored")));
setRows(JSON.parse(localStorage.getItem("rowsStored")));
setLevel(JSON.parse(localStorage.getItem("levelStored")));
setGameOver(JSON.parse(localStorage.getItem("gameOverStored")));
} else {
localStorage.clear();
setStage(createStage());
setDropTime(1000);
resetPlayer();
setGameOver(false);
setScore(0);
setRows(0);
setLevel(0);
}
}
但是,当“loadLocalStorage”标志设置为 True,这意味着用户已经点击了按钮并愿意继续游戏时,什么都没有发生。从本地存储中检索到的元素是空的,例如舞台没有元素 - JSON.parse(localStorage.getItem("stageStored")) 给了我空的舞台,没有四联骨牌。为什么会这样?是关闭浏览器还是关闭浏览器的卡片刷新localStorage?谢谢。
解决方案
将您的localStorage.setItem()
呼叫从 useEffect 块中移出。对于每次应用程序刷新,调用setItem
useEffect 会覆盖实际的存储值。
为此,请在更新状态时设置本地存储数据。例如,编写一个通用方法来更新 localStorage 数据,如下所示:
const updateLocalStorage = (key, value) => {
localStorage.setItem(key, value);
}
每当您像下面这样更新状态时,请立即设置 localStorage 值:
const dropTime = 1000 / (level + 1) + 200;
setDropTime(dropTime);
updateLocalStorage('dropTimeStored', dropTime);
例如,我在您的代码中对您的pastebindropTime
代码中的值进行了此更改。您也可以对其他值执行相同的操作。
推荐阅读
- c# - 每个目标框架的默认 C# 语言版本?
- c++ - 添加 static_pointer_cast
到 std::list > 导致纯虚方法调用错误 - haskell - 这个错误中的 IHaskellPrelude 来自哪里?
- angular - 在 LocalStorage 中存储令牌
- typescript - 有没有办法在量角器中重新运行失败的套件?
- python - boto3 使用实例 ID 创建图像
- plsql - ORA-01722: 无效号码 ORA-06512: 在第 17 行 01722. 00000 - “无效号码”
- mysql - 如何在mysql中解决这个查询?
- javascript - HTML,当内容达到一定高度时如何制作可重复的页眉和页脚?
- ibm-mq - IBM MQ 使用 amqsgetc 失败,原因为“2058”