这是一个很好的用例,称为高阶组件。
首先我们定义一个跟踪屏幕分辨率的父组件。
var ViewportManager = React.createClass({
getInitialState: function() {
return this.measureViewport();
},
componentWillMount: function() {
window.addEventListener('resize', this.onResize);
},
componentWillUnmount: function() {
window.removeEventListener('resize', this.onResize);
},
onResize: function() {
this.setState(this.measureViewport());
},
measureViewport: function() {
return {
width: window.innerWidth,
height: window.innerHeight
};
}
});
安装此组件后,它将跟踪屏幕的大小,每次浏览器窗口调整大小时都会更新。我们现在需要做的是将这些值传递给这个内部渲染的任何组件。
<ViewportManager>
<NavigationHere />
<DoSomethingHere />
<HandleSomethingElseHere />
</Viewport>
我们将传承viewportHeight
和viewportHidth
到每一个内部组件。
var ViewportManager = React.createClass({
// ...
render: function() {
var viewportWidth = this.state.width;
var viewportHeight = this.state.height;
var children = this.props.children;
var additionalProps = {
viewportWidth: viewportWidth,
viewportHeight: viewportHeight
};
var modifiedChildren = React.Children.map(children, function(child) {
return React.cloneElement(child, additionalProps);
});
return (
<div className='viewport-manager'>
{{ modifiedChildren }}
</div>
);
}
});
现在,所有直接在ViewportManager
内部的组件都将获得两个额外的道具。
var NavigationHere = React.createClass({
render: function() {
// I can see this.props.viewportWidth
// and this.props.viewportHeight
}
});
像这样的常见函数应该在父项和计算结果中作为道具传递下来计算。 –
我不确定我是否遵循你的逻辑。用户可以调整浏览器窗口的大小,以便传递静态值不起作用。其他选项是使用包含每个单独组件的包装器/父组件以及计算视图端口的函数,但在这种情况下,对于具有不同模型的每个页面,我们必须创建一个包装器组件,并在该父级/包装器组件,我们仍然会重复计算出视口的函数。 – Sam
为什么要传递一个静态值?在你的父母你会附加一个监听器到'onResize'事件和每个resize事件你会传递组件的新值或我完全错过了这一点? –