【React】当页面滚动时,判断某组件是否出现在屏幕中

当页面滚动时,判断某组件是否在屏幕中显示

实现功能:通过嵌套该组件,当被嵌套组件显示在页面时,通过PubSub消息订阅传递给父组件

  • 封装组件
import { useEffect, useRef } from 'react'
import PubSub from 'pubsub-js' // 消息订阅

/**
 * 检查当前组件是否在屏幕
 * id -> 当前组件显示在屏幕时,通过消息订阅发送出去
 * @param {*} props {id:'组件唯一键'}
 * @returns 组件
 */
const Module = props => {
  const dom = useRef()
  const { id } = props
  const height = document.body.clientHeight // 获取屏幕高度
  const bindHandleScroll = () => {
    const top = dom.current.getBoundingClientRect().top
    if (top >= 0 && top <= height) {
      PubSub.publish('window-show-module-code', id)
    }
  }
  useEffect(() => {
    // 页面滚动监听
    window.addEventListener('scroll', bindHandleScroll)
    return () => {
      // 注销页面滚动监听
      window.removeEventListener('scroll', bindHandleScroll)
    }
  }, []) // eslint-disable-line react-hooks/exhaustive-deps
  return <div ref={dom}>{props.children}</div>
}

export default Module
  • 父组件
import { useEffect } from 'react'
import PubSub from 'pubsub-js' // 消息订阅
import WindowScroll from '../../../components/WindowScroll'

const Centre = () => {

  /**
   * 生命周期-组件挂载
   * 订阅-当前显示组件,并高亮该组件
   */
  useEffect(() => {
    PubSub.subscribe('window-show-module-code', (_, id) => {
      console.log('传入的ID', id)
    })
  }, []) // eslint-disable-line react-hooks/exhaustive-deps
  
  return (
     <>
       {list.map(e => {
         return (
           <WindowScroll key={e.key} id={e.path}>
             <ModuleCode {...e} />
           </WindowScroll>
         )
       })}
     </>
  )
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值