gpt4 book ai didi

javascript - react 状态没有在 useEffect() 上给出正确的值

转载 作者:行者123 更新时间:2023-12-05 00:32:02 25 4
gpt4 key购买 nike

我正在尝试使用 react 构建分解算法。 我想添加 resultsLocalStorage基于分解的结果 .但是,LocalStorage设置以前的结果而不是当前的结果。
我认为这是因为 useEffect在每个新的 [number] 上运行(=用户输入)而不是基于 [results] .但是,我需要 useEffect在新的用户输入提交上运行,因为那是必须触发分解的时候。
我怎么做localStorage在分解完成后设置正确的结果(如果可能,在 finally block 上)?

const [results, setResults] = useState({
default: [],
detailed: [],
isPrime: '',
});

const { number } = props

useEffect(() => {
handleWorker(number);
//accessing results here will give previous results
}, [number]);

const handleWorker = number => {
try {
const worker = new Worker(new URL('facto.js', import.meta.url));
worker.postMessage({ number, algorithm });
worker.onmessage = ({ data: { facto } }) => {
setResults({ ...facto });
//the worker 'streams live' results and updates them on setResults
};
} catch(error) {
console.log(error.message)
} finally {
localStorage.setItem(number, results)
//here, results is not current state but previous one
}
};
请注意,其他一切正常
谢谢

最佳答案

你得到以前的值是因为 localStorage.setItemsetResults 之前执行更新状态。你可以做一些重构来使它工作:

const [results, setResults] = useState({
default: [],
detailed: [],
isPrime: '',
});

const { number } = props;
const workerRef = useRef(new Worker(new URL('facto.js', import.meta.url)));
const worker = workerRef.current;

useEffect(()=> {
//-> create the listener just once
worker.onmessage = ({ data: { facto } }) => {
setResults({ ...facto });
};
}, []);

useEffect(() => {
//-> send message if number changed
worker.postMessage({ number, algorithm });
}, [number]);

useEffect(() => {
//-> update localStorage if results changed
localStorage.setItem(number, results)
}, [results]);

关于javascript - react 状态没有在 useEffect() 上给出正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70461390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com