javascript – React.js关于从组件中侦听窗口事件的最佳实践
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – React.js关于从组件中侦听窗口事件的最佳实践,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2689字,纯文字阅读大概需要4分钟。
内容图文
![javascript – React.js关于从组件中侦听窗口事件的最佳实践](/upload/InfoBanner/zyjiaocheng/706/682d3bcb1e094aefa1c594b872fe716a.jpg)
我根据它们在视口中的位置设置了几个React.js组件的动画.如果组件位于视口中,则将不透明度设置为1,如果它不在视口中,则将其不透明度设置为0.我使用getBoundingClient()的top和bottom属性来确定组件是否在视口中.
ComponentA显示了其他B,C和D组件所遵循的模式.他们每个人都在监听窗口滚动事件.
这是每个组件必须向窗口添加事件监听器的“React”方法吗?同一窗口上有多个滚动事件侦听器?
或者有一个更好的方法是在Home所有者组件中将滚动事件监听器添加到窗口一次?然后ownee子组件仍然能够使用getBoundingClient()知道它们在DOM中的位置吗?
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组件中,然后突然变得可重用.你可以像ComponentA一样创建一个呈现ScrollWrapper的ComponentB.
为了满足你的例子,也许你必须从ComponentA传递ScrollWrapper一些额外的道具.也许你会传给它一个包含ref实例的道具来调用你的逻辑.您甚至可以传递一些选项或参数来自定义补间或边界.我没有编写任何代码,因为我认为你会理解它,并且能够使用我提供的基础为你自己定制/编写它.
实现这种事情的另一种方法是通过Mixin.尽管如此,有很多关于Mixins是好还是坏的讨论,他们甚至可能在未来被React弃用?你可以阅读一下这个,然后自己决定你的想法.
内容总结
以上是互联网集市为您收集整理的javascript – React.js关于从组件中侦听窗口事件的最佳实践全部内容,希望文章能够帮你解决javascript – React.js关于从组件中侦听窗口事件的最佳实践所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。