如何在 ReactJS 中获取视口高度?在普通的 JavaScript 中,我使用
window.innerHeight()
但是使用 ReactJS,我不确定如何获取此信息。我的理解是
ReactDOM.findDomNode()
仅适用于创建的组件。然而,这不是document
orbody
元素的情况,它可以给我窗口的高度。
如何在 ReactJS 中获取视口高度?在普通的 JavaScript 中,我使用
window.innerHeight()
但是使用 ReactJS,我不确定如何获取此信息。我的理解是
ReactDOM.findDomNode()
仅适用于创建的组件。然而,这不是document
orbody
元素的情况,它可以给我窗口的高度。
使用钩子 (React 16.8.0+
)
创建一个useWindowDimensions
钩子。
import { useState, useEffect } from 'react';
function getWindowDimensions() {
const { innerWidth: width, innerHeight: height } = window;
return {
width,
height
};
}
export default function useWindowDimensions() {
const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());
useEffect(() => {
function handleResize() {
setWindowDimensions(getWindowDimensions());
}
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return windowDimensions;
}
之后你就可以像这样在你的组件中使用它
const Component = () => {
const { height, width } = useWindowDimensions();
return (
<div>
width: {width} ~ height: {height}
</div>
);
}
原答案
在 React 中也是如此,您可以使用它window.innerHeight
来获取当前视口的高度。
正如你在这里看到的
这个答案类似于 Jabran Saeed 的,除了它也处理窗口大小调整。我从这里得到的。
constructor(props) {
super(props);
this.state = { width: 0, height: 0 };
this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
}
componentDidMount() {
this.updateWindowDimensions();
window.addEventListener('resize', this.updateWindowDimensions);
}
componentWillUnmount() {
window.removeEventListener('resize', this.updateWindowDimensions);
}
updateWindowDimensions() {
this.setState({ width: window.innerWidth, height: window.innerHeight });
}
class AppComponent extends React.Component {
constructor(props) {
super(props);
this.state = {height: props.height};
}
componentWillMount(){
this.setState({height: window.innerHeight + 'px'});
}
render() {
// render your component...
}
}
设置props
AppComponent.propTypes = {
height:React.PropTypes.string
};
AppComponent.defaultProps = {
height:'500px'
};
视口高度现在可用作渲染模板中的 {this.state.height}
我刚刚编辑了QoP的当前答案以支持SSR并将其与Next.js (React 16.8.0+) 一起使用:
/hooks/useWindowDimensions.js:
import { useState, useEffect } from 'react';
export default function useWindowDimensions() {
const hasWindow = typeof window !== 'undefined';
function getWindowDimensions() {
const width = hasWindow ? window.innerWidth : null;
const height = hasWindow ? window.innerHeight : null;
return {
width,
height,
};
}
const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());
useEffect(() => {
if (hasWindow) {
function handleResize() {
setWindowDimensions(getWindowDimensions());
}
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}
}, [hasWindow]);
return windowDimensions;
}
/你的组件.js:
import useWindowDimensions from './hooks/useWindowDimensions';
const Component = () => {
const { height, width } = useWindowDimensions();
/* you can also use default values or alias to use only one prop: */
// const { height: windowHeight = 480 } useWindowDimensions();
return (
<div>
width: {width} ~ height: {height}
</div>
);
}
我使用 React Hooks 和调整大小功能找到了 QoP 和 spekledcarp 的答案的简单组合,代码行数略少:
const [width, setWidth] = useState(window.innerWidth);
const [height, setHeight] = useState(window.innerHeight);
const updateDimensions = () => {
setWidth(window.innerWidth);
setHeight(window.innerHeight);
}
useEffect(() => {
window.addEventListener("resize", updateDimensions);
return () => window.removeEventListener("resize", updateDimensions);
}, []);
哦,是的,确保resize
事件是双引号,而不是单引号。那个让我有点;)