Javascript 调整窗口大小时响应更新
我已经用一些图像创建了一个网格,并希望更新某些宽度上的列数。 例如:Javascript 调整窗口大小时响应更新,javascript,reactjs,Javascript,Reactjs,我已经用一些图像创建了一个网格,并希望更新某些宽度上的列数。 例如: 宽度>960px:3列 宽度>660px:2列 宽度
- 宽度>960px:3列
- 宽度>660px:2列
- 宽度<660px:1列
this.state = {
numberOfColumns: 3,
breakpointSm: 660px,
breakpointMd: 960px,
};
我的职能:
getNumberOfColumns(){
let smallDevices = window.matchMedia( "(max-width: " + this.state.breakpointSm + ")" );
let mediumDevices = window.matchMedia( "(max-width:" + this.state.breakpointMd + ")" );
let columns;
if (smallDevices.matches) {
columns = 1;
} else if (mediumDevices.matches){
columns = 2;
} else {
columns = 3;
}
this.setState({
numberOfColumns: columns
});
}
组件将安装:
componentWillMount() {
this.getNumberOfColumns();
}
解决这个问题的一个简单方法是在调整大小时添加一个事件列表器,或者简单地使用一个简单的css。这段代码实际上是在每次窗口大小更改时强制重新渲染
getNumberOfColumns() {
let columns;
if(window.innerWidth === this.state.breakpointSm) {
columns = 1;
} else if(window.innerWidth === this.state.breakpointMd) {
columns = 2;
}else{
columns = 3;
}
this.setState({
numberOfColumns: columns
});
}
componentDidMount() {
this.getNumberOfColumns();
window.addEventListener("resize", this.getNumberOfColumns.bind(this));
}
componentWillUnmount() {
window.removeEventListener("resize", this.getNumberOfColumns.bind(this));
}
在最坏的情况下,如果没有任何效果,您可以使用this.forceUpdate()
,但尽量避免使用它
我还没有测试它,但我希望这将有助于解决这个问题的一个简单方法是在调整大小时添加一个事件列表器,或者简单地使用一个简单的css。这段代码实际上是在每次窗口大小更改时强制重新渲染
getNumberOfColumns() {
let columns;
if(window.innerWidth === this.state.breakpointSm) {
columns = 1;
} else if(window.innerWidth === this.state.breakpointMd) {
columns = 2;
}else{
columns = 3;
}
this.setState({
numberOfColumns: columns
});
}
componentDidMount() {
this.getNumberOfColumns();
window.addEventListener("resize", this.getNumberOfColumns.bind(this));
}
componentWillUnmount() {
window.removeEventListener("resize", this.getNumberOfColumns.bind(this));
}
在最坏的情况下,如果没有任何效果,您可以使用this.forceUpdate()
,但尽量避免使用它
我还没有测试它,但我希望这会有所帮助。我建议使用CSS,它的方法似乎更适合我。重新呈现组件以完成CSS中的媒体查询所能实现的功能,这是一种过分的做法 CSS:
我建议使用CSS,它的方法似乎更适合我。重新呈现组件以完成CSS中的媒体查询所能实现的功能,这是一种过分的做法 CSS:
为什么不完全用css来做呢?简单一点,或者我已经用flexbox创建了一个砖石网格布局。因此,我必须设置容器的高度。我创建了一个函数来计算容器的高度(项目的高度*行数)。这就是为什么我不能使用纯css的原因。为什么不完全使用css呢?简单一点,或者我已经用flexbox创建了一个砖石网格布局。因此,我必须设置容器的高度。我创建了一个函数来计算容器的高度(项目的高度*行数)。这就是为什么我不能使用普通css的原因。bind(这)会创建一个新函数如果他不使用。bind(这),它会创建一个bug,并且在组件上willunmount会删除原始事件列表,解决react中问题的一个已知模式是创建一个新的函数实例它不工作。。我仍然需要按F5刷新页面窗口。addEventListener(“resize”,this.getNumberOfColumns.bind(this));将eventListener添加到fn1和window.removeEventListener(“resize”,this.getNumberOfColumns.bind(this));将删除eventListener到fn2将其存储在某处
让fn1=this.getNumberOfColumns.bind(this)
然后添加dowindow.addEventListener(“resize”,fn1)代码>和窗口。移除EventListener(“调整大小”,fn1)
.bind(此)会创建一个新函数,如果他不使用。bind(此)会创建一个bug,并且在组件上WillUnmount会删除原始事件列表。react中解决问题的一个已知模式是创建一个新的函数实例。它不起作用。。我仍然需要按F5刷新页面窗口。addEventListener(“resize”,this.getNumberOfColumns.bind(this));将eventListener添加到fn1和window.removeEventListener(“resize”,this.getNumberOfColumns.bind(this));将删除eventListener到fn2将其存储在某处让fn1=this.getNumberOfColumns.bind(this)
然后添加dowindow.addEventListener(“resize”,fn1)代码>和窗口。移除EventListener(“调整大小”,fn1)代码>