這是一個很好的用例,稱爲高階組件。
首先我們定義一個跟蹤屏幕分辨率的父組件。
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事件你會傳遞組件的新值或我完全錯過了這一點? –