I'm building a photo gallery in react js. Obviously it's going to have to be responsive and I've tackled this by setting values like so in the component's render method:
let thumbWidth = window.innerWidth >= 480 ? 75 : 100;
The problem is that I need the const value to change when the window is resized. My my first attempts was to build a function like so and bind it in the constructor:
getThumbWidth = (vpWidth) => {
if(vpWidth >= 480 ) {
this.setState({thumbSize: 120});
} else {
this.setState({thumbSize: 50});
}
}
This worked in terms of setting the variable's initial value but how do I trigger the function when the window resizes?
Have tried adding a resize function:
resize = () => this.getThumbWidth()
...and then changing getThumbWidth so that it sets the value in the component's sate - the idea being that when state is updated the component automatically rerenders:
getThumbWidth = (vpWidth) => {
if(vpWidth >= 480 ) {
this.setState({thumbSize: 120});
} else {
this.setState({thumbSize: 50});
}
}
And then calling it via lifecycle methods as suggested in several other solutions but the event listener does not appear to be firing:
componentDidMount() {
window.addEventListener('resize', this.resize)
}
componentWillUnmount() {
window.removeEventListener('resize', this.resize)
}
Still not working though... any ideas?
I'm building a photo gallery in react js. Obviously it's going to have to be responsive and I've tackled this by setting values like so in the component's render method:
let thumbWidth = window.innerWidth >= 480 ? 75 : 100;
The problem is that I need the const value to change when the window is resized. My my first attempts was to build a function like so and bind it in the constructor:
getThumbWidth = (vpWidth) => {
if(vpWidth >= 480 ) {
this.setState({thumbSize: 120});
} else {
this.setState({thumbSize: 50});
}
}
This worked in terms of setting the variable's initial value but how do I trigger the function when the window resizes?
Have tried adding a resize function:
resize = () => this.getThumbWidth()
...and then changing getThumbWidth so that it sets the value in the component's sate - the idea being that when state is updated the component automatically rerenders:
getThumbWidth = (vpWidth) => {
if(vpWidth >= 480 ) {
this.setState({thumbSize: 120});
} else {
this.setState({thumbSize: 50});
}
}
And then calling it via lifecycle methods as suggested in several other solutions but the event listener does not appear to be firing:
componentDidMount() {
window.addEventListener('resize', this.resize)
}
componentWillUnmount() {
window.removeEventListener('resize', this.resize)
}
Still not working though... any ideas?
Share Improve this question edited Aug 27, 2018 at 11:16 Stef asked Aug 27, 2018 at 11:08 StefStef 3691 gold badge5 silver badges24 bronze badges 4 |3 Answers
Reset to default 16@Jousi, try this below code works fine of window resize
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
windowSize: "",
thumbWidth: 75
};
}
handleResize = e => {
const windowSize = window.innerWidth;
const thumbWidth = (windowSize >= 480 && 100) || 75;
this.setState(prevState => {
return {
windowSize,
thumbWidth
};
});
};
componentDidMount() {
window.addEventListener("resize", this.handleResize);
}
componentWillUnmount() {
window.removeEventListener("resize", this.handleResize);
}
render() {
return (
<div>
<h2>window size: {this.state.windowSize}</h2>
<h3>thumbnail width: {this.state.thumbWidth}</h3>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
U can add ref attribute to container of your component:
return (
<div
className={mainClass}
ref={(elem) => { this.elem = elem; }}
>
your gallery here
</div>
Then in your componentDidMount
u have access to all events connected to your container. Then u can invoke your function depending on changes on these events. For example:
componentDidMount() {
const parent = this.elem.parentNode;
if (parent.scrollHeight > parent.clientHeight) {
parent.onscroll = (() => this.yourMethod(parent));
}
}
I think you might need to initialise the this.resize
function.
like so: window.removeEventListener('resize', this.resize())
const
ant in the first place? Hint is in the name,const
is constant - in other words, constant things do not change, they stay the same. Why not uselet
instead - acts as a same block-scoped variable likeconst
does, only the values can change. – Samuel Hulla Commented Aug 27, 2018 at 11:11getThumbWidth
there's a parameter but when you call it you don't pass this parameterresize = () => this.getThumbWidth()
– mcssym Commented Aug 27, 2018 at 11:19