当前位置: 首页 > 面试题库 >

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

潘弘博
2023-03-14
问题内容

我正在根据其在视口中的位置为几个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弃用?您可以阅读有关此内容的内容,然后自己决定自己的想法。



 类似资料:
  • 问题:我正在尝试为我的应用程序创建一个组件,其他组件将使用该组件渲染表。它可能有三个可能的单元格值: 文本 HTML 组成部分 我能够呈现上面所有的值,但是我在绑定侦听器时遇到了困难。我试图实现的是这样的:传递一个要绑定到组件的方法和事件,表应该将其绑定到相应的单元格。例如: 表JSON 表组件 上面只是我正在尝试的一个片段,表循环通过传递的对象并相应地呈现。 我已经试过了 因此,解决方案1 因此

  • 本文向大家介绍vuejs中监听窗口关闭和窗口刷新事件的方法,包括了vuejs中监听窗口关闭和窗口刷新事件的方法的使用技巧和注意事项,需要的朋友参考一下 1、使用window.onunload之类的API 2、在生命周期钩子中注册监听事件 在 mounted 钩子中注册事件 在 destroyed 钩子卸载事件 以上这篇vuejs中监听窗口关闭和窗口刷新事件的方法就是小编分享给大家的全部内容了,希望

  • 本文向大家介绍在事件侦听上调用event.preventDefault()的最佳方式是什么?相关面试题,主要包含被问及在事件侦听上调用event.preventDefault()的最佳方式是什么?时的应答技巧和注意事项,需要的朋友参考一下 在事件侦听上调用event.preventDefault()的最佳方式是什么?

  • 问题内容: 当在下拉组件外部单击时,我想关闭下拉菜单。 我怎么做? 问题答案: 在我添加的元素中,像这样: 然后在父母中,我这样做: 该是一个布尔值,当显示在我的情况下,日历和隐藏它。

  • 问题内容: 我添加了一个窗口状态侦听器,如下所示: 但是,当我使用X关闭按钮时,不会调用该事件。我认为这与netbean jdesktop框架有关。但是我找不到问题所在。谢谢你的帮助。 问题答案: 是界面的一部分。使用代替。

  • 女士们先生们晚上好, 我有一个Java Swing的问题,我无法解决,也许你可以帮助我。在这里: 我有一个使用BorderLayout的JFrame和许多JPanel 每次我需要设置一个新屏幕(即,从主菜单,当单击搜索按钮时,转到搜索菜单),我只需删除位于中心的组件(JPanel),并将新屏幕(新JPanel)放在中心 这样,我不会在每次我想显示新屏幕时调用所有的页眉和页脚对象 这个系统一切正常,