我刚刚了解了recoilJS,并且一直在玩弄它,并且对我所做的是否被认为是“正确的”有疑问。我的代码有效,但感觉很奇怪。
我有以下 React 函数组件:
export const TimerPanel: FC = () => {
const gameState = useRecoilValue<GameState>(HeaderAtoms.gameState);
const timerCount = useRecoilValue(HeaderAtoms.timerCount);
const setTimerCounter = useSetRecoilState(HeaderAtoms.timerCounter);
useEffect(() => {
if (gameState === GameState.IN_PROGRESS && timerCount < 1000) {
window.setTimeout(() => {
setTimerCounter(timerCount + 1);
}, 1000);
}
});
return <NumberPanel num={timerCount} />;
};
其中相关的原子和选择器定义为:
export const timerCount = atom<number>({
key: 'Header.timerCount',
default: 0
});
export const timerCounter = selector<number>({
key: 'Header.timerCounter',
get: ({ get }) => {
return get(timerCount);
},
set: ({ get, set }, newCount) => {
if (get(gameState) === GameState.NEW) {
set(timerCount, 0);
} else if (get(gameState) === GameState.IN_PROGRESS) {
set(timerCount, newCount);
}
}
});
基本上,当游戏开始时,TimerPanel
计时器显示的增量是1
游戏进行中的每一秒。如果用户重置游戏 ( GameState.NEW
),则timerCount
重置为零。如果原子/选择器没有正确完成,则会出现竞争条件,即游戏状态和计时器计数将重置,但计时器仍在运行,并且仍会再更新TimerPanel
一次。这就是为什么我在选择器的道具中有if
块的原因。set
基本上,我担心我的timerCounter
选择器是状态的美化过滤器/直通实体,timerCount
我想知道是否有更好的方法来处理这个用例。