很多时候我们需要组件能够根据窗口变化改变宽高,有时候可以使用css,有时候需要随数据调整则使用js计算。

比如说,当我们在页面中放置一个iframe时,我们希望它的宽高随着其父元素or窗口的变化而变化;

再比如说,当我们引用一个ant Table组件,并且动态传入columns及dataSource时,由于需要控制sroll值我们需要获得动态的width和height;

......

下面我们举几个栗子

 例1:使用antd layout布局,如下图,content宽高会随着窗口变化,我们希望iframe-component组件也随之变化,以至于iframe高度超出时iframe显示滚动条,该怎么写呢?

我们知道layout是flex布局,所以即使我们用下面的css也不能实现需求,因为content没有宽高,他的子元素使用height:100%起不到作用。

.iframe-component{
width:100%;
height:100%;
} .iframe{
width:100%;
height:calc(100% - 30px);
}

怎么办呢?我们可以使用vh单位给iframe-component设置宽高。这样iframe-component的高度就永远等于窗口的高度减去header的高度了

.iframe-component{
width:100%;
height:calc(100vh - 64px);
} .iframe{
width:100%;
height:calc(100% - 30px);
}

解释:

单位vh :1vh等于视口高度的1%

例2:antd Table组件的scroll属性用来设置横向或纵向滚动,也可用于指定滚动区域的宽高,可以设置为像素值,百分比,true和‘max-content’。

现在需要实现一个Table,希望它布满整个父div,父div随窗口变化大小;当父div高度小于Table总高度时Table显示纵滚动条;父div宽度小于Table总宽度时Table显示横滚动条,另外他的列是动态生成,即列数及宽度不定

import {Table} from 'antd';
class MyTable extends React.Component {
constructor(props) {
super(props);
this.state = {
width: 0,
height: 1000,
}
this.myRef=React.createRef();
}
  
componentWillMount() {
this.widthReset(this.props.columns)
} componentDidMount() {
this.handleResize();
window.addEventListener('resize', this.handleResize);
} componentWillUnmount() {
window.removeEventListener('resize', this.handleResize);
}
  
 //取父div的height
handleResize() {
const divHeight = this.myRef.current.clientHeight;
divHeight!=null && this.setState({height:divHeight})
}
  
componentWillReceiveProps(props){
this.widthReset(props.columns)
} widthReset=(columns)=>{
let width=0;
columns.forEach((record)=>{
width+=record.width;
});
   this.setState({width})
} render() {
return (
<div className="table-div" >
<Table
       columns={this.props.columns}
       dataSource={this.props.dataSource}
       style={{height:this.state.height}}
       scroll={ { x: this.state.width, y: (this.state.height-this.columnHeight) } }
     />
</div>
);
}
} ReactDOM.render(
<MyTable columns={columns} dataSource={dataSource}/>,
document.getElementById('root')
);

相关解释:

React的ref :可以将ref绑定到 render() 输出的任何组件上,来获取相应的支撑实例。

Element.clientHeight :这个属性是只读属性,对于没有定义CSS或者内联布局盒子的元素为0,否则,它是元素内部的高度(单位像素),包含内边距,但不包括水平滚动条、边框和外边距。

React生命周期

最新文章

  1. iOS dealloc 不被调用的问题
  2. 蜻蜓FM笔试题目,求两个点的最近父节点
  3. sqlplus 初始化文件(每一次打开sqlplus不用重新设置 linesize 和 pagesize)
  4. easyui1.32 各种问题汇总
  5. Hibernate配置文件学习心得
  6. HTML 基础知识——8月8日
  7. asp.net ToString()格式汇总
  8. eclipse 中使用tomcat
  9. Android学习笔记(十四)方便实用的首选项-PreferenceActivity
  10. Web NFC API
  11. java多线程编程——锁优化
  12. springmvc4开发rest
  13. [论文阅读]VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION(VGGNet)
  14. 1 小时 SQL 极速入门(三)——分析函数
  15. OperationCenter Docker容器启动脚本
  16. Java基于opencv—矫正图像
  17. eclipse项目版本控制忽略上传文件
  18. Centos6.3 下使用 Tomcat-6.0.43 非root用户 jsvc模式部署 生产环境 端口80 vsftp
  19. 挂载镜像SD卡的FAT32文件系统分区到Linux中
  20. leetcode 7 reverse integer 反转整数

热门文章

  1. nodejs ejs 引擎脱离express使用
  2. Spring IOC 的源码分析
  3. 如何删除.DS_Store文件?
  4. Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路
  5. Codeforces Round 56-B. Letters Rearranging(思维)
  6. uoj46玄学
  7. NETCOREAPI 跨域处理
  8. HDU 1114 Piggy-Bank 完全背包 dp
  9. Ubuntu 18.04 Python3.6.6导入wx模块报Gtk-Message : 17:06:05.797 :Failed to load module &quot;canberra-gtk-module&quot;
  10. MapReduce基本流程与设计思想初步