【发布时间】:2021-06-12 07:12:12
【问题描述】:
主 TSX 文件
const [minNumber, setMinNumber] = useLocalStorage('minRange', 1);
const [maxNumber, setMaxNumber] = useLocalStorage('maxRange', 10);
...
const getRandomNumber = () => {
//Return a random number between minNumber and maxNumber:
console.log("min: " + minNumber + " max: " + maxNumber)
let randomNr = Math.floor(Math.random() * (maxNumber - minNumber + 1) + minNumber);
setRandomNumber(randomNr);
}
本地存储挂钩:
import { useState } from 'react';
export function useLocalStorage(key, defaultValue) {
const getInitialValue = () => localStorage.getItem(key) ?? defaultValue;
const [value, setValue] = useState(getInitialValue);
const setAndStoreValue = (newValue) => {
if (newValue !== '') {
setValue(newValue);
localStorage.setItem(key, newValue)
}
}
return [value, setAndStoreValue];
};
演示问题。我创建了一个代码框链接: https://codesandbox.io/s/hdwqy?file=/src/App.tsx
如何重现问题:
- 默认 minValue 为 1,maxValue 为 10
- 将 minValue 设置为 8 和 maxValue 9(单击代码框中的“更改最小值和最大值”按钮)
- 运行 getRandomNumber() 函数。
Outputs: 8 or 9- 有效! (点击codeandbox中的“New random Number”按钮) - 刷新页面,你会得到存储在本地存储中的数据 min = 8, max = 9
- 运行 getRandomNumber() 函数。
outputs 0 or 1- 输出错误! (点击codeandbox中的“New random Number”按钮) - 问题在于,由于 min 和 max 之间的差为 2,因此它给出了 0 和 1。如果 min 为 8,max 为 10,那么它将输出 0、1 或 2。
我似乎无法弄清楚为什么会发生这种情况,因为如果我再次设置最小值和最大值并重新运行随机函数,它就可以正常工作。我还想提一下,在这两种情况下,console.log 都会输出min: 8 max: 9,因此本地存储似乎正在正确加载该值。这很奇怪。
【问题讨论】:
标签: reactjs typescript random react-hooks local-storage