javascript - 在 React.js 中更新组件 onScroll 的样式

标签 javascript reactjs

我在 React 中构建了一个组件,它应该在窗口滚动时更新自己的样式以创建视差效果。

组件 render 方法如下所示:

  function() {
    let style = { transform: 'translateY(0px)' };

    window.addEventListener('scroll', (event) => {
      let scrollTop = event.srcElement.body.scrollTop,
          itemTranslate = Math.min(0, scrollTop/3 - 60);

      style.transform = 'translateY(' + itemTranslate + 'px)');
    });

    return (
      <div style={style}></div>
    );
  }

这不起作用,因为 React 不知道组件已更改,因此不会重新渲染组件。

我试过将 itemTranslate 的值存储在组件的状态中,并在滚动回调中调用 setState。然而,这使得滚动无法使用,因为这非常慢。

关于如何做到这一点有什么建议吗?

最佳答案

您应该在 componentDidMount 中绑定(bind)监听器,这样它只会创建一次。您应该能够将样式存储在状态中,监听器可能是性能问题的原因。

像这样:

componentDidMount: function() {
    window.addEventListener('scroll', this.handleScroll);
},

componentWillUnmount: function() {
    window.removeEventListener('scroll', this.handleScroll);
},

handleScroll: function(event) {
    let scrollTop = event.srcElement.body.scrollTop,
        itemTranslate = Math.min(0, scrollTop/3 - 60);

    this.setState({
      transform: itemTranslate
    });
},

关于javascript - 在 React.js 中更新组件 onScroll 的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29725828/

相关文章:

javascript - ES6 类继承/扩展流类型

javascript - 我的 React 应用程序出现错误 "action undefined"

javascript - 跟随鼠标的两条线之间的固定 Angular

javascript - 如何在弹出窗口中插入关闭按钮

javascript - 有条件地调用 GulpJS 任务(手动)

javascript - 如何实现一个函数,当传入一个密集的字符串时返回,否则返回 false?

Javascript - 如何访问导出对象的字段

javascript - 使用 Jest 和 Sinon 的 React 测试函数调用不起作用

css - Material UI- 面临将网格对齐以向右浮动的问题

javascript - React Material-UI InputBase 组件可以有 onSubmit 操作吗?