我已经为我的滚动函数使用了useRef钩子,我已经设置了HTMLDivElement
类型,但是我得到了属性'clientHeight,scrollHeight,scrollTop‘在'HTMLDivElement \ null’类型上不存在,
如果我在useRef上盘旋,上面写着(alias) useRef<HTMLDivElement>(initialValue: HTMLDivElement | null): RefObject<HTMLDivElement> (+2 overloads) import useRef
const scrollRef = useRef<HTMLDivElement>(null);
const getActivityFeedOnScroll = () => {
const {scrollTop, scrollHeight, clientHeight} = scrollRef?.current;
scrollTop + clientHeight === scrollHeight && fetchNextPage();
};
如果我喜欢这种方式,类型不会给出错误,但是我想用空保护替换If条件,以使代码更简洁。
+ const getActivityFeedOnScroll = () => {
+ if (!scrollRef.current) return;
+ const {scrollTop, scrollHeight, clientHeight} = scrollRef.current;
+ if (scrollTop + clientHeight === scrollHeight) fetchNextPage();
+ };
发布于 2022-06-23 17:06:15
据我所知,你根本不能这么做。
想想看,在您的第一个代码块中,您会说{ someStuff } = scrollRef?.current;
--如果scrollRef是未定义的或无效的--它不尝试访问当前,这将抛出类似于“未定义类型上不存在属性流”的内容。相反,scrollRef?.current恰好是null,因此{ someStuff }没有任何意义。
如果类型记录语言确实允许您这样做,那么您必须检查someStuff是否没有像这样无效。
const scrollRef = useRef<HTMLDivElement>(null);
const getActivityFeedOnScroll = () => {
const {scrollTop, scrollHeight, clientHeight} = scrollRef?.current;
if (scrollTop && clientHeight && scrollHeight)
scrollTop + clientHeight === scrollHeight && fetchNextPage();
};
这比你的第二个案例更混乱(这是正确的方法)。
总之,如果您的第一个案例没有给出scrollRef?.current上的错误,那么它将在下一行提供给您,在行中使用scrollRef?.current的属性。
您的代码不是更混乱,它没有更多的“样板”,它只是更明确,这是一件好事。当scrollRef.current为空时,您将显式地告诉您的代码该做什么。
https://stackoverflow.com/questions/72731286
复制相似问题