【发布时间】:2020-12-17 12:30:22
【问题描述】:
我正在尝试使用 Enum 从 rxjs observable 获取安全事件输出。这是完整的代码示例:
// Enum
export enum Key {
ArrowUp = "ArrowUp",
ArrowDown = "ArrowDown",
ArrowLeft = "ArrowLeft",
ArrowRight = "ArrowRight",
W = "w",
A = "a",
S = "s",
D = "d",
One = "1",
Two = "2",
}
// Observable
export const useKeyboardEvent = () => {
const $keyboardEvent: Observable<Key> = fromEvent<KeyboardEvent>(
document,
"keydown"
).pipe(
filter((event: KeyboardEvent) => {
return !!Object.values(Key).find((v) => v === event.key);
}),
map(
(event: KeyboardEvent) =>
Object.keys(Key)[
(Object.values(Key) as string[]).indexOf(event.key)
] as Key
),
distinctUntilChanged()
);
return $keyboardEvent;
};
// Subscription
React.useEffect(() => {
const keyboardEventSub = $keyboardEvent.subscribe(setColor);
return () => {
keyboardEventSub.unsubscribe();
};
}, [$keyboardEvent, setColor]);
// handler
const color = React.useRef<string>("black");
const setColor = React.useCallback((key: Key) => {
if (key === Key.One) {
color.current = "black";
} else if (key === Key.Two) {
color.current = "red";
}
}, []);
当我退出不同的比较时,结果如下:
key === Key.One false
key in Key true
我的问题:
我如何比较才能使key === Key.One 成功?为什么比较失败,而in 成功了?
【问题讨论】:
-
记录
key的值使用console.log(JSON.stringify(key))对Key.One执行相同操作。您应该会看到区别。 -
嘿,谢谢 :) 所以看起来我正在将“键值”与“值值”进行比较,将映射更改为
Object.values(Key).find((v) => v === event.key) as Key修复了它!继续并将其作为解决方案发布,我会批准它,否则我将通过 EOD 对其进行更新。再次感谢!
标签: javascript reactjs typescript enums rxjs