【发布时间】:2020-07-18 04:18:33
【问题描述】:
我尝试使用自定义钩子在组件中实现滚动指示器。
这是组件: ...
const DetailListInfo: React.FC<Props> = props => {
const container = useRef(null)
const scrollable = useScroll(container.current)
const { details } = props
return (
<div
ref={container}
className="content-list-info content-list-info-detailed"
>
{details && renderTypeDetails(details)}
{scrollable && <ScrollIndicator />}
</div>
)
}
export default inject("store")(observer(DetailListInfo))
还有 useScroll 钩子:
import React, { useState, useEffect } from "react"
import { checkIfScrollable } from "../utils/scrollableElement"
export const useScroll = (container: HTMLElement) => {
const [isScrollNeeded, setScrollValue] = useState(true)
const [isScrollable, setScrollable] = useState(false)
const checkScrollPosition = (): void => {
const scrollDiv = container
const result =
scrollDiv.scrollTop < scrollDiv.scrollHeight - scrollDiv.clientHeight ||
scrollDiv.scrollTop === 0
setScrollValue(result)
}
useEffect(() => {
console.log("Hook called")
if (!container) return null
container.addEventListener("scroll", checkScrollPosition)
setScrollable(checkIfScrollable(container))
return () => container.removeEventListener("scroll", checkScrollPosition)
}, [isScrollable, isScrollNeeded])
return isScrollNeeded && isScrollable
}
因此,在此传递的组件中的每个滚动(容器不同,这就是为什么我要制作可自定义的钩子)我想检查当前滚动位置以有条件地显示或隐藏指示器。问题是,当组件被渲染时,该钩子只被调用一次。它没有监听滚动事件。 当这个钩子在组件内部时,它工作正常。这里有什么问题?
【问题讨论】:
标签: javascript reactjs scroll react-hooks