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

乔C:

我正在根据其在视口中的位置为几个React.js组件设置动画。如果组件中视,动画不透明度为1,如果不是在视口中,有生其不透明度为0。我使用getBoundingClient()topbottom属性,以确定该组件是视域之内。

ComponentA显示了我遵循的其他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 */);
 }

});
收缩

您可以通过几种不同的方法来执行此操作。一种是通过组合:

var React = require("react");
var _ = require("underscore");

var ScrollWrapper = React.createClass({
    propTypes: {
        onWindowScroll: React.PropTypes.func
    },

    handleScroll: function(event) {
        // Do something generic, if you have to
        console.log("ScrollWrapper's handleScroll");

        // Call the passed-in prop
        if (this.props.onWindowScroll) this.props.onWindowScroll(event);
    },

    render: function () {
        return this.props.children;
    },

    componentDidMount: function() {
        if (this.props.onWindowScroll) window.addEventListener("scroll", this.handleScroll);
    },

    componentWillUnmount: function() {
        if (this.props.onWindowScroll) window.removeEventListener("scroll", this.handleScroll);
    }
});

var ComponentA = React.createClass({
    handleScroll: function(event) {
        console.log("ComponentA's handleScroll");
    },

    render: function() {
        return (
            <ScrollWrapper onWindowScroll={this.handleScroll}>
                <div>whatever</div>
            </ScrollWrapper>
        );
    }
});

现在,您可以将通用逻辑放置在ScrollWrapper组件中,然后突然变得可重用。您可以创建一个ComponentB用来渲染ScrollWrapper就像ComponentA做。

为了满足您的示例,也许您必须从​​中传递ScrollWrapper一些额外的道具ComponentA也许您将传递给它一个道具,其中包含的实例ref以调用您的逻辑。您甚至可以向其传递一些选项或参数以自定义补间或边界。我没有编写任何代码,因为我想您会理解它并能够使用我提供的基础自己定制/编写。

实现此类目标的另一种方法是通过Mixin。虽然,有很多关于Mixins是好是坏的讨论,并且它们甚至可能在将来被React弃用?您可以阅读有关此内容的内容,然后自己决定自己的想法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

React&Redux:connect()到多个组件和最佳实践

在React JS中触发onchange事件的最佳方法是什么

如何使React.js组件侦听Reflux中的商店

在React组件和服务之间进行通信的最佳实践是什么?

React关于上下文this的最佳实践

react组件中的onDeviceReady事件侦听器

为React组件和函数(包括文件名)命名最佳实践

关于创建React组件

在带有setState的React类组件中使用箭头函数的最佳实践

在React中使用嵌套组件的最佳实践

更改在React-最佳实践中多次声明的一个组件的状态?

React:事件传播的最佳实践(触发父事件,而非子事件)

处理来自API调用和呈现React组件的数据的最佳实践

如何在只有应用最初加载时才添加的React功能组件的窗口中添加keyup事件侦听器?

在功能组件React中定义状态的最佳实践

React Layout组件最佳实践

在React中将状态和回调从根组件传递到叶组件的最佳实践是什么?

react/mobX:最佳实践

我想要一些关于使用 react 的最佳实践的建议

设置 React 组件样式的最佳实践

如何向 React 组件添加事件侦听器?

React.js:useEffect 与窗口调整大小事件侦听器不起作用

以各种方式实现相同目标的关于 React 及其版本的最佳实践

使用钩子将 React 类组件转换为功能组件:事件侦听器的问题

如何将窗口调整大小事件侦听器值设置为 React State?

React useState 与对象的最佳实践?

React 最佳实践:在哪里*不*渲染组件?

React 最佳实践:在哪里*不*渲染组件?

从 react-bootstrap 导入多个组件的最佳实践?