javascript - material-ui useScrollTrigger 与子目标 ref 的用法是什么?

标签 javascript reactjs material-ui

我正在尝试使用 material-ui's useScrollTrigger使用 window 以外的目标,如下所示:

export default props => {
    let contentRef = React.createRef();

    const scrollTrigger = useScrollTrigger({ target: contentRef.current });

    return (
        <React.Fragment>
            <CustomHeader shrink={scrollTrigger} />

            <div ref={contentRef}>
                {props.children}
            </div>
        </React.Fragment>
    );
};

这会导致抛出错误,因为在调用 useScrollTriggercontentRef.current 为 null。将子元素作为目标时,此实用程序的正确用法是什么?

最佳答案

你是对的,因为组件第一次渲染 contentRef.current 是 null,所以会抛出一个错误。

我们需要两件事,一个是对目标元素的引用,另一个是重新渲染的方式,以便我们的 scrollTrigger 被重新计算。换句话说,我们需要一个状态。

下面的代码可以工作

export default props => {

    // please keep it undefined here to not make useScrollTrigger throw an error on first render 
    const [scrollTarget, setScrollTarget] = useState(undefined) 
    const scrollTrigger = useScrollTrigger({ target: scrollTarget });

    return (
        <React.Fragment>
            <CustomHeader shrink={scrollTrigger} />

            <div ref={node => {
                if (node) {
                    setScrollTarget(node);
                }
            }}>
                {props.children}
            </div>
        </React.Fragment>
    );
};

关于javascript - material-ui useScrollTrigger 与子目标 ref 的用法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56551045/

相关文章:

javascript - 给定一个序列和键,创建一个函数来找出序列中的字符是否按照键的顺序出现

javascript - 在 React 中编写可重用模式的最佳方法是什么?

JavaScript/jQuery 在两个 iframe 之间拖放元素

javascript - 选择输入,其中单击事件滚动通过一组定义的值而不是打开下拉列表

javascript - 基本 JavaScript : How can I link my HTML and Javascript on a Highcharts example?

html - 如何使用 Material ui在reactjs/css中创建一个包含tableHead单元格的表格

typescript - 类名不会覆盖 AppBar 的根样式

javascript - Webpack 编译需要 30 秒

javascript - 如何在状态转换前暂停组件的延迟?

javascript - 使用 withRouter() 重定向时显示所有组件