Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save hartzis/77bde7b6de3e6374afca to your computer and use it in GitHub Desktop.
Save hartzis/77bde7b6de3e6374afca to your computer and use it in GitHub Desktop.
Higher-order React component example
//from - https://github.com/kriasoft/react-starter-kit/blob/master/docs/react-style-guide.md
//Higher-order React component example:
// withViewport.js
import React, { Component } from 'react';
import { canUseDOM } from 'react/lib/ExecutionEnvironment';
function withViewport(ComposedComponent) {
return class WithViewport extends Component {
constructor() {
super();
this.state = {
viewport: canUseDOM ?
{width: window.innerWidth, height: window.innerHeight} :
{width: 1366, height: 768} // Default size for server-side rendering
};
this.handleResize = this.handleResize.bind(this);
}
componentDidMount() {
window.addEventListener('resize', this.handleResize);
window.addEventListener('orientationchange', this.handleResize);
}
componentWillUnmount() {
window.removeEventListener('resize', this.handleResize);
window.removeEventListener('orientationchange', this.handleResize);
}
render() {
return <ComposedComponent {...this.props} viewport={this.state.viewport}/>;
}
handleResize() {
let viewport = {width: window.innerWidth, height: window.innerHeight};
if (this.state.viewport.width !== viewport.width ||
this.state.viewport.height !== viewport.height) {
this.setState({viewport: viewport});
}
}
};
};
export default withViewport;
// MyComponent.js
import React from 'react';
import withViewport from './withViewport';
@withViewport
class MyComponent {
render() {
let { width, height } = this.props.viewport;
return <div>{'Viewport: ' + width + 'x' + height}</div>;
}
}
export default MyComponent;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment