【Vue+ElementUI】el-table动态高度设置及表格内容错乱对不齐

本文介绍了在Vue应用中使用ElementUI的el-table时遇到的问题,如页面切换时表格内容错乱以及如何动态计算表格高度以适应滚动和窗口变化。开发者分享了如何监听窗口调整并调用doLayout方法解决布局问题,以及计算表格最大高度的方法getTableMaxHeight。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Vue中使用ElementUI的el-table标签会遇到以下问题

一、遇到页面切换时,表格内容错乱(对不齐):doLayout()

二、动态计算表格高度:getTableMaxHeight()

页面结构:搜索框+表格,通常会在表格内部进行滚动比较好看,这时候就需要计算并设置表格高度

<template>
  <div class="app-container">
  
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
      <el-form-item label="名字" prop="name">
        <el-input
          v-model="queryParams.name"
          placeholder="请输入名字"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
    </el-form>
    
    <el-table 
	  ref="tables" 
	  v-loading="loading" 
	  :data="list" 
	  :height="maxHeight"
	>
		<el-table-column label="ID" align="center" prop="id" />
		<el-table-column label="名字" align="center" prop="name" />
		<el-table-column label="年龄" align="center" prop="age" />
	</el-table>
  </div>
</template>
<script>
export default {
	data() {
    return {
      loading: true,
      list: [], // 表格数据
      maxHeight: null,
      queryParams: {}
    },
    created() {
      this.getList();
    },
    mounted() {
      // 监听窗口变化事件
	  window.addEventListener("resize", this.resizeScreen);
	},
	// 页面销毁时移除监听事件
	beforeDestroy() {
	  window.removeEventListener('resize', this.resizeScreen)
	},
	// 页面缓存重新进入页面时,在路由组件被激活时触发
	activated() {
	  this.$nextTick(() => {
	    this.$refs.tables.doLayout(); // 对表格重新布局(解决切换页面后列错乱)
	  })
	},
	methods: {
		// 获取数据,设置表格高度
		getList() {
			this.loading = true;
			this.list = [
				{id: 1, name: '小红', age: 20},
				{id: 2, name: '小华', age: 20},
				{id: 3, name: '小东', age: 20},
				{id: 4, name: '小刘', age: 20},
			];
			this.resizeScreen(); // 获取数据后,计算高度并重新渲染表格
			this.loading = false;
		},
		// 窗口变化时,表格高度跟着动态变化
		resizeScreen() {
	      this.$nextTick(() => {
	        this.maxHeight = this.getTableMaxHeight(); // 计算高度
	        this.$refs.tables.doLayout(); // 重新渲染表格
	      })
	    },
	    // 动态计算并返回:表格最大高度 computeHeight
	    getTableMaxHeight() {
	      if (!this.list.length) return // 如果没有数据,直接退出
	      if (!this.$refs.tables) return;
	      // 表头高度
	      var headerHeight = document.getElementsByClassName('el-table__header')[0].offsetHeight;
	      // 表内高度
	      var bodyHeight = document.getElementsByClassName('el-table__body')[0].offsetHeight;
	      // 默认表格高度 = 表头 + 表内 (表格渲染后的默认高度)
	      var tableDataHeight = headerHeight + bodyHeight; 
	      // 页面高度
	      var pageHeight = document.getElementsByClassName('app-main')[0].offsetHeight; 
	      // 页内边距
	      const pagePadding = 40; 
	      // 动态高度:el-form 搜索框
	      var elFormHeight = document.getElementsByClassName('el-form')[0].offsetHeight; 
	      // 导出行高度(包含margin)
	      const elRowOperButton = 36; 
	      // 分页高度(包含margin)
	      const pagingHeight = 50; 
	      // 计算页面最大容纳高度
	      var computeHeight = pageHeight - pagePadding - elFormHeight - elRowOperButton - pagingHeight; 
	      // 是否有X轴滚动条
	      var hasScrollX = document.getElementsByClassName('el-table--scrollable-x').length; 
	      // 当 最大高度 大于 表格数据高度时,取表格高度(注:有滚动条时 + 滚动条高度)
	      if (computeHeight > tableDataHeight) {
	        computeHeight = (hasScrollX ? tableDataHeight + 17 : tableDataHeight) + 1; // 必须+1,否在有y轴滚动条出现
	      }
	      // console.log('表头', headerHeight,
	      //   'rowHeights', rowHeights,
	      //   'pageHeight', pageHeight, 
	      //   'lastHeight', computeHeight,
	      //   'tableDataHeight', tableDataHeight,
	      //   'computeHeight', computeHeight,
	      // )
	      return computeHeight;
	    }
  	}
 }
</script>
Vue.js 和 Leaflet 是两个流行的前端开发框架,Vue用于构建用户界面,而Leaflet是一个强大的JavaScript库,专用于创建交互式的地图应用。要在Vue项目中结合Leaflet实现图层控制,你可以按照以下步骤操作: 1. **安装依赖**:首先,在Vue项目中通过npm或yarn安装`vue-leaflet`插件,这将提供Leaflet组件的集成支持。例如: ```bash npm install vue-leaflet leaflet --save ``` 2. **引入并配置**:在你的Vue组件中导入`VueMap`组件,并在`<template>`中添加一个`<div>`来容纳地图: ```html <template> <div id="map" ref="map"></div> </template> ``` 3. **设置地图**: ```javascript <script> import { VueMap } from 'vue-leaflet'; export default { components: { VueMap }, data() { return { map: null, layers: [ // 初始化地图所需的图层列表 { name: '基础图层', layer: L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' }) } ] }; }, mounted() { this.map = new VueMap({ el: '#map', center: [51.505, -0.09], // 地理坐标 zoom: 13, layers: this.layers }); } }; </script> ``` 4. **图层控制**:在Vue中可以动态管理图层,比如添加、删除或者显示隐藏。你可以为每个图层设置一个开关,监听用户的操作来控制图层状态。 ```html <template> ... <button v-for="(layer, index) in layers" :key="index" @click="toggleLayer(layer.name)"> {{ layer.name }} </button> ... </template> <script> ... methods: { toggleLayer(name) { this.map.layers.eachLayer((layer) => { if (layer.options.name === name) { layer.setOpacity(!layer.getOpacity()); layer.setVisible(!layer.getVisible()); } }); } } ... </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值