开发者问题收集

未捕获的类型错误:无法读取 null 的属性(读取“offsetTop”)

2022-10-04
950

我尝试创建滚动效果。当您点击导航栏上的选项时,我们会转到特定部分。

为什么我会收到此错误?

这是出现错误的代码:

import React, { useRef } from 'react'
export default function Home() {
    const about = useRef(null);
    const work = useRef(null);
    const contact = useRef(null);

    const scrollSection = (elementRef) => {
        window.scrollTo({
          top: elementRef.current.offsetTop,
          behavior: "smooth",
        });
      };
    return (
        <>
            <div ref={about} className='first'>
                <nav className="navbar">

                    <div className="logo">
                        <video loop autoPlay muted playsInline className='logo_video' >
                            <source src={video} type="video/mp4" />
                        </video>
                    </div>
                    <div className="about_section">
                        <ul className="list">
                            <li className="info about">
                                <div className="infoindex" onClick={() => scrollSection(about)}>
                                    About
                                </div>
                            </li>
                            <li className="info">
                                <div className="infoindex" onClick={scrollSection(work)}>
                                    Work

                                </div>
                            </li>
                            <li className="info">
                                <div className="infoindex" onClick={scrollSection(contact)}>
                                    Contact

                                </div>
                            </li>
                        </ul>
                    </div>

                </nav>

我可以对此代码进行哪些编辑?

2个回答

查看以下代码行:

<div className="infoindex" onClick={() => scrollSection(about)}>
<div className="infoindex" onClick={scrollSection(work)}>
<div className="infoindex" onClick={scrollSection(contact)}>

现在您可以看到区别。 scrollSection(work) scrollSection(contact) 在每个渲染中都会触发 scrollSection 函数,即使您不单击它们也是如此。不要忘记向它们添加箭头函数。

<div className="infoindex" onClick={() => scrollSection(about)}>
<div className="infoindex" onClick={() => scrollSection(work)}>
<div className="infoindex" onClick={() => scrollSection(contact)}>

顺便说一句,您只处理 div 父级的 about 引用:

<div ref={about} className='first'>

您还需要处理其余的引用,不要忘记 onClick 事件。如果您的 about div 包裹了其余的 div ,那么如果您想单击父 div 内的子 div ,它可能会出现不必要的行为。

Jesus Angel Rodriguez Martinez
2022-10-04
  1. 您没有像传递 about 引用那样将 workcontact 引用传递给元素。它们从未被设置,这就是您获得 null current 的原因。

  2. 您不应直接在 onClick 中调用 scrollSection ,而是传递一个在单击 div 时执行的回调函数:

    <div className="infoindex" onClick={() => scrollSection(work)>Work</div>
    

    <div className="infoindex" onClick={() => scrollSection(contact)}>联系方式</div>
    
Ismail El Shinnawy
2022-10-04