Есть много способов сделать это, но, следуя вашему подходу, вы можете сделать что-то вроде следующего, где у вас просто есть переменная size
для вашего состояния, изменяющаяся на основе спецификаций, которые вы предоставили выше.
Таким образом, вам просто нужно передать this.state.size
вашему компоненту.
import React from "react";
const withWindowResize = Component => {
class WrappedComponent extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
size: this.findSize()
};
}
componentDidMount() {
window.addEventListener("resize", this.resizeUpdate.bind(this)); // initialize your listener
}
componentWillUnmount() { // remove event listener on component unmount
window.removeEventListener("resize", this.resizeUpdate.bind(this));
}
findSize() {
return window.innerWidth > 1919
? "large"
: window.innerWidth > 992
? "desktop"
: window.innerWidth > 768
? "tablet"
: "mobile"; // find currentSize
}
resizeUpdate() {
const currentSize = this.findSize();
this.setState({
size: currentSize
});
}
render() {
return <Component size={this.state.size} />;
}
}
return WrappedComponent;
};
export default withWindowResize;
Обратите внимание, я использую React.PureComponent
как , мы не хотим менять наше состояние и повторно отображаем Component
при каждом изменении размера окна.
Это будет то же самое, что и использование React.Component
и проверка прямо перед использованием this.setState
, если наш currentSize отличается от того, что у нас в состоянии, перед обновлением.
if (currentSize !== this.state.size) {
this.setState({
size: currentSize
});
}