微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在反应中卸载组件时消除功能的副作用?

如何解决在反应中卸载组件时消除功能的副作用?

我正在开发一个 react-app 并使用以下函数来跟踪导航面板中的活动链接

以下函数使用 IntersectionObserver 来跟踪给定元素是否在视口中。

代码能够解决其动机。
但是当我将路由更改为不同的组件时,它会显示错误 - TypeError: Cannot read property 'parentElement' of null

那是因为使用函数 changeActiveLink(); 的组件不在页面中(它已卸载)。

我想在移除组件时移除此功能的影响。

我尝试将其与 DOMContentLoaded eventListener 集成,然后清理该事件侦听器,但此事件侦听器仅适用于 HTML 文档的第一次呈现,当我们在离开函数 {{1} 的所需路线上呈现组件时不起作用} 未初始化。

我应该如何让这个功能在这个特定的组件中工作,而避免它对其他组件的影响?

Screenshot of error screen

changeActiveLink();

解决方法

返回一个 useEffect cleanup function,它将 un-observe 目标元素:

useEffect(() => {
  const changeActiveLink = () => {

    const scrollHandler = (entries) => {
      entries.forEach((entry) => {
        const id = entry.target.getAttribute("id");

        if (entry.intersectionRatio > 0) {
          document
            .querySelector(`nav li a[href="#${id}"]`)
            .parentElement.classList.add("active");
        } else {
          document
            .querySelector(`nav li a[href="#${id}"]`)
            .parentElement.classList.remove("active");
        }
      });
    };

    const observer = new IntersectionObserver(scrollHandler);

    const sections = document.querySelectorAll("section[id]");

    // Track all sections that have an `id` applied
    sections.forEach((section) => {
      observer.observe(section);
    });
    
    return () => {
      // untrack all sections that have an `id` applied
      sections.forEach((section) => {
        observer.unobserve(section);
      });
    }; // return the cleanup function
  };

  return changeActiveLink(); // you should also return the function here

},[]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?