在 window 调整大小时更改 React js 中的值
Change value in react js on window resize
我正在用 React js 构建一个照片库。显然它必须是响应式的,我已经通过在组件的渲染方法中设置值来解决这个问题:
let thumbWidth = window.innerWidth >= 480 ? 75 : 100;
问题是我需要在 window 调整大小时更改 const 值。我的第一次尝试是像这样构建一个函数并将其绑定到构造函数中:
getThumbWidth = (vpWidth) => {
if(vpWidth >= 480 ) {
this.setState({thumbSize: 120});
} else {
this.setState({thumbSize: 50});
}
}
这在设置变量的初始值方面有效,但如何在 window 调整大小时触发函数?
已尝试添加调整大小功能:
resize = () => this.getThumbWidth()
...然后更改 getThumbWidth 以便它在组件的状态中设置值 - 这个想法是当状态更新时组件自动重新渲染:
getThumbWidth = (vpWidth) => {
if(vpWidth >= 480 ) {
this.setState({thumbSize: 120});
} else {
this.setState({thumbSize: 50});
}
}
然后按照其他几个解决方案中的建议通过生命周期方法调用它,但事件侦听器似乎没有触发:
componentDidMount() {
window.addEventListener('resize', this.resize)
}
componentWillUnmount() {
window.removeEventListener('resize', this.resize)
}
虽然还是不行...有什么想法吗?
我认为您可能需要初始化 this.resize
函数。
像这样:window.removeEventListener('resize', this.resize())
您可以将 ref 属性添加到组件的容器中:
return (
<div
className={mainClass}
ref={(elem) => { this.elem = elem; }}
>
your gallery here
</div>
然后在您的 componentDidMount
中您可以访问连接到您的容器的所有事件。然后你可以根据这些事件的变化调用你的函数。例如:
componentDidMount() {
const parent = this.elem.parentNode;
if (parent.scrollHeight > parent.clientHeight) {
parent.onscroll = (() => this.yourMethod(parent));
}
}
@Jousi,试试下面的代码 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"));
我正在用 React js 构建一个照片库。显然它必须是响应式的,我已经通过在组件的渲染方法中设置值来解决这个问题:
let thumbWidth = window.innerWidth >= 480 ? 75 : 100;
问题是我需要在 window 调整大小时更改 const 值。我的第一次尝试是像这样构建一个函数并将其绑定到构造函数中:
getThumbWidth = (vpWidth) => {
if(vpWidth >= 480 ) {
this.setState({thumbSize: 120});
} else {
this.setState({thumbSize: 50});
}
}
这在设置变量的初始值方面有效,但如何在 window 调整大小时触发函数?
已尝试添加调整大小功能:
resize = () => this.getThumbWidth()
...然后更改 getThumbWidth 以便它在组件的状态中设置值 - 这个想法是当状态更新时组件自动重新渲染:
getThumbWidth = (vpWidth) => {
if(vpWidth >= 480 ) {
this.setState({thumbSize: 120});
} else {
this.setState({thumbSize: 50});
}
}
然后按照其他几个解决方案中的建议通过生命周期方法调用它,但事件侦听器似乎没有触发:
componentDidMount() {
window.addEventListener('resize', this.resize)
}
componentWillUnmount() {
window.removeEventListener('resize', this.resize)
}
虽然还是不行...有什么想法吗?
我认为您可能需要初始化 this.resize
函数。
像这样:window.removeEventListener('resize', this.resize())
您可以将 ref 属性添加到组件的容器中:
return (
<div
className={mainClass}
ref={(elem) => { this.elem = elem; }}
>
your gallery here
</div>
然后在您的 componentDidMount
中您可以访问连接到您的容器的所有事件。然后你可以根据这些事件的变化调用你的函数。例如:
componentDidMount() {
const parent = this.elem.parentNode;
if (parent.scrollHeight > parent.clientHeight) {
parent.onscroll = (() => this.yourMethod(parent));
}
}
@Jousi,试试下面的代码 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"));