function SchrödingersDiff()
{
const [count, setCount] = useState(0);
// simulate a changing state
useEffect(() =>
{
const int = window.setInterval(() => setCount(s => s + 1), 1000);
return () => window.clearInterval(int);
}, []);
const last = useRef(0);
const diff = useMemo(() =>
{
const lastValue = last.current;
last.current = count;
const diff = count - lastValue;
// console.log(diff);
return diff;
}, [count]);
// console.log(diff);
return diff;
}
为什么该组件在<React.StrictMode>
以下运行时总是呈现"0"?它在没有严格模式的情况下工作良好(即渲染"1").
我知道strict模式会呈现两次,这可以解释它,但我希望useMemo
会捕捉到这一点——事实确实如此:memo函数中的log每秒打印正确的"1".就连外面的那个也有.
有没有更好的方法来计算这个差异?
这是我实际的useState
/useEffect
/setInterval
,已经调整为保留最后一个:
export function useChannel(channelName, initialData, currentOnly)
{
const socket = useSc(s => s.socket); // gets a SocketCluster socket
const [data, setData] = useState(currentOnly ? initialData : {current: initialData});
useEffect(() =>
{
if (!socket) return;
const channel = socket.subscribe(channelName);
(async () =>
{
for await (const data of channel) setData(currentOnly ? data : s => ({current: data, last: s.current}));
})();
return () => channel.unsubscribe();
}, [socket, channelName]);
return data;
}