前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React技巧之检查元素是否可见

React技巧之检查元素是否可见

作者头像
chuckQu
发布2022-08-19 16:06:09
9680
发布2022-08-19 16:06:09
举报
文章被收录于专栏:前端F2E

原文链接:https://bobbyhadz.com/blog/react-check-if-element-in-viewport[1]

作者:Borislav Hadzhiev[2]

正文从这开始~

总览

在React中,检查元素是否在视口范围内:

  1. 在元素上设置ref属性。
  2. 使用IntersectionObserver API来跟踪元素是否与视口相交。
代码语言:javascript
复制
import {useEffect, useRef, useState, useMemo} from 'react';

export default function App() {
  const ref1 = useRef(null);
  const ref2 = useRef(null);

  const isInViewport1 = useIsInViewport(ref1);
  console.log('isInViewport1: ', isInViewport1);

  const isInViewport2 = useIsInViewport(ref2);
  console.log('isInViewport2: ', isInViewport2);

  return (
    <div>
      <div ref={ref1}>Top div {isInViewport1 && '| in viewport ✅'}</div>

      <div style={{height: '155rem'}} />

      <div ref={ref2}>Bottom div {isInViewport2 && '| in viewport ✅'}</div>
    </div>
  );
}

function useIsInViewport(ref) {
  const [isIntersecting, setIsIntersecting] = useState(false);

  const observer = useMemo(
    () =>
      new IntersectionObserver(([entry]) =>
        setIsIntersecting(entry.isIntersecting),
      ),
    [],
  );

  useEffect(() => {
    observer.observe(ref.current);

    return () => {
      observer.disconnect();
    };
  }, [ref, observer]);

  return isIntersecting;
}

该示例向我们展示了,如何检查元素是否在视口范围内。IntersectionObserver API使我们能够检查一个给定的元素是否与文档相交。

useIsInViewport钩子接收一个指向我们想要追踪的元素的ref对象。

IntersectionObserver

IntersectionObserver构造函数接收一个函数,该函数被调用时带有一个entry数组。entry是一个数组,其包含了所有的obeserver的目标元素。这些元素的可见度已经高于或低于intersection observer的比率之一。

每个entry都描述了一个给定元素与根元素(文档)相交的程度。我们解构了这个entry,因为我们的IntersectionObserver只能跟踪一个元素(就是我们设置ref的那个元素)。

我们调用observe()方法,将我们要跟踪的元素传给它 - observer.observe(ref.current)

每当元素进入视口或者存在于视口中时,我们传递给IntersectionObserver()构造函数的函数就会被调用,然后更新state变量。

代码语言:javascript
复制
// 👇️ gets called every time element enters or leaves viewport
new IntersectionObserver(([entry]) =>
  setIsIntersecting(entry.isIntersecting),
)

如果我们设置ref对象的元素在视口中,useIsInViewport钩子将会返回true。如果元素不在视口中,该钩子将会返回false

需要注意的是,在初始渲染时,useIsInViewport 钩子将会返回false 。因为我们为useState传递的初始值为falseconst [isIntersecting, setIsIntersecting] = useState(false);

如果你想跟踪钩子的返回值的变化,请使用useEffect钩子,并将该值添加到钩子的依赖关系中。

代码语言:javascript
复制
const isInViewport1 = useIsInViewport(ref1);
console.log('isInViewport1: ', isInViewport1);

useEffect(() => {
  // 👇️ listen for changes
  console.log(isInViewport1);
}, [isInViewport1]);

参考资料

[1]

https://bobbyhadz.com/blog/react-check-if-element-in-viewport: https://bobbyhadz.com/blog/react-check-if-element-in-viewport

[2]

Borislav Hadzhiev: https://bobbyhadz.com/about

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端F2E 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总览
  • IntersectionObserver
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档