React.js 关于监听组件窗口事件的最佳实践

2024-05-04

我根据几个 React.js 组件在视口中的位置对它们进行动画处理。如果组件位于视口中,则将不透明度动画设置为 1,如果不在视口中,则将其不透明度动画设置为 0。我正在使用getBoundingClient()'s top and bottom属性来确定组件是否在视口内。

组件 A 显示了我对其他 B、C 和 D 组件遵循的模式。他们每个人都在聆听window滚动事件。

这是通过每个组件必须向window?同一窗口上有多个滚动事件侦听器?

或者是否有更好的方法,将滚动事件侦听器添加到窗口一次Home所有者组件?那么,拥有者子组件仍然能够使用以下方法知道它们在 DOM 中的位置:getBoundingClient()?

Home = React.createClass({
 render: function() {
    <div>
       <ComponentA />
       <ComponentB />
       <ComponentC />
       <ComponentD />
    </div>
  };
});

ComponentA = React.createClass({
  componentDidMount: function() {
   window.addEventListener('scroll', this.handleScroll);
},
  componentWillUnmount: function() {
    window.removeEventListener('scroll', this.handleScroll);
   },

handleScroll: function() {
  var domElement = this.refs.domElement.getDOMNode();
  this.inViewPort(domElement);
},

inViewPort: function(element) {
  var elementBounds = element.getBoundingClientRect();
  (elementBounds.top <= 769 && elementBounds.bottom >= 430) ? TweenMax.to(element, 1.5, { opacity: 1 }) : TweenMax.to(element, 1.5, { opacity: 0 });
},
render: function() {
  return (/* html to render */);
 }

});

这是带有 useEffect 钩子的函数式风格:

  useEffect(() => {
    const onScroll = (event) => console.info("scrolling", event);
      
    window.addEventListener('scroll', onScroll);
    
    return () => {
      window.removeEventListener('scroll', onScroll);
    }
  }, []);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React.js 关于监听组件窗口事件的最佳实践 的相关文章

随机推荐

  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • 如何使用 zend paginate 而不加载数据库的所有结果

    所以我认为 zend paginate 工作的方式是 paginator Zend Paginator factory results paginator gt setItemCountPerPage itemCount paginator
  • C++ const 左值引用

    假设我有 A 类不可复制 类 B 具有 const A a 作为成员 并在其构造函数中采用 A 并将其设置在其初始化列表中 一个函数A GenerateA 这是否意味着执行以下操作应该有效 B 生成A 即 const ref 是否意味着ge
  • 为什么 SDL 在 Mac 上比 Linux 上慢得多?

    我正在研究使用 SDL2 渲染的单线程图形程序 https github com TurkeyMcMac intergrid 请参阅末尾的较小示例 它既可以在旧的 Linux 机器上运行 也可以在不太旧的 Mac 上运行 Linux 计算机
  • Cocos2d:CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵?

    CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵 或者它也考虑屏幕尺寸 换句话说 如果节点内的精灵位于屏幕之外 opengl 绘制调用的性能是否会反映这一点 不 不 CCSpriteBatchNode 始终绘制所有
  • 多处理中的共享内存

    我有三个大清单 第一个包含位数组 模块位数组 0 8 0 另外两个包含整数数组 l1 bitarray 1 bitarray 2 bitarray n l2 array 1 array 2 array n l3 array 1 array
  • mysql 时钟

    我有一个包含以下元素的时钟表 id pk action emp id fk time 如果我通过了 如何选择最新的动作emp id到查询 id emp id action current time 1 1 clockin 2012 01 2
  • IE9 是否支持 CSS3 ::before 和 ::after 伪元素?

    On 这个 MS 兼容性表 http msdn microsoft com en us library cc351024 28v vs 85 29 aspx它说 IE9不支持伪元素 before and after 但当我尝试时 似乎确实
  • 将数据作为 RDD 保存回 Cassandra

    我试图从 Kafka 读取消息 处理数据 然后将数据添加到 cassandra 中 就像它是 RDD 一样 我的麻烦是将数据保存回 cassandra 中 from future import print function from pys
  • 使用基类活动将多个活动(选项卡)绑定到服务

    发帖后发现这些 http code google com p android issues detail id 2665 http code google com p android issues detail id 2665http co
  • Javascript时间转换正则表达式

    我有一种使用 Net 中的正则表达式来转换时间的方法 例如 1h 20m 格式为双倍 就这个 public static double GetTaskHours this string tmpHours Double taskHours 0
  • 在 Pygame 中缩放图像/矩形

    是否可以在 pygame txt 内部 缩放 矩形 有点像当你在桌面上缩放窗口时 我想知道你如何在 pygame 中做到这一点 您的光标将控制矩形的大小 我使用 skrx 方法并尝试对 2 个矩形执行此操作 if evnt type MOU
  • Facebook应用程序白名单流程

    有谁知道将 FB 应用程序列入白名单以启用某些功能的过程吗 我看到很少有人问同样的问题 但没有答案 FB 有处理白名单申请的联系人吗 没有申请白名单的公共流程 与大多数公司一样 Facebook 可能拥有少量私有 API 这些 API 仅供
  • pandas - 将字符串转换为字符串列表[重复]

    这个问题在这里已经有答案了 我有这个 file csv 文件可以用 pandas 读取 Title Tags T1 Tag1 Tag2 T1 Tag1 Tag2 Tag3 T2 Tag3 Tag1 using df pd read csv
  • Ruby:注释“frozen_string_literal: true”有什么作用?

    这是rspecbinstub 在我的项目目录中 usr bin env ruby begin load File expand path spring FILE rescue LoadError end frozen string lite
  • 如何在 Chrome 开发者工具的控制台中启用下划线?

    我正在使用 Angular2 和下划线 import as from underscore 我也想在 Chrome 控制台窗口中使用下划线库 即使我确实在代码中间中断 并尝试使用 但我得到了 未定义 错误 我可以在 Chrome 控制台窗口
  • Jquery .ajax method =“post”但$_POST为空

    ajax method post url save php data id 453 action test beforeSend function complete function success function html mydiv
  • 具有 UI 自动化和 .net 的数据网格内容

    我在使用 UI 自动化读取外部应用程序中的数据网格内容时遇到一些问题 并且可以使用一些指针 这是我到目前为止所拥有的 int id System Diagnostics Process GetProcessesByName Book 0 I
  • 使用Log4j在日志中输出Spark应用程序id

    我有一个用于 Spark 应用程序的自定义 Log4j 文件 我想输出 Spark 应用程序 ID 以及消息和日期等其他属性 因此 JSON 字符串结构如下所示 name time date level thread message app
  • React.js 关于监听组件窗口事件的最佳实践

    我根据几个 React js 组件在视口中的位置对它们进行动画处理 如果组件位于视口中 则将不透明度动画设置为 1 如果不在视口中 则将其不透明度动画设置为 0 我正在使用getBoundingClient s top and bottom