iview-table实现自适应高度渲染表格条数

22 篇文章 0 订阅
19 篇文章 0 订阅

实现效果:
在这里插入图片描述

<template>
  <div :style="{ height: scrollerHeight + 'px' }">
    <div>
      <Input v-model="searchForm.name" icon="md-search" style="width: 30%;" @keyup.enter.native="search()"></Input>
    </div>
    <br>
    <Table
      :columns="columns"
      :data="data"
    >

    </Table>
    <div style="margin-top: 5px;float: right;">
      <Page
        :total="dataCount"
        :current="tCurrentPage"
        :page-size="pageSize"
        :page-size-opts="pageSizeOpts"
        show-total
        show-sizer
        size="small"
        @on-change="changepage"
        @on-page-size-change="changeSize"
      ></Page>
    </div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      columns: [
        {
          title: "Name",
          key: "name"
        },
        {
          title: "Age",
          key: "age"
        },
        {
          title: "Address",
          key: "address"
        }
      ],
      data: [],
      searchForm: {
        name: ''
      },
      dataCount: 0, // 初始化信息总条数
      pageSize: 1,
      pageSizeOpts: [10, 15, 20],
      allTableData: [], // 用于分页数据存放
      filterData: [], // 用于存放搜索条件下的数据
      tCurrentPage: 1,
      scrollerHeight: window.innerHeight - 130 // 130指的是table表头的高度 + 除table外,其他模版占的高度(input、margin、padding、page等),需要自己大致算一下!!
    };
  },
  mounted () {
    // 添加监听事件listenResizeFn, 用来监听页面高度的变化
    window.addEventListener("resize", this.listenResizeFn)
  },
  beforeDestroy () {
    // 移除绑定的listenResizeFn事件监听
    window.removeEventListener('resize', this.listenResizeFn)
  },
  watch: {
    scrollerHeight (val, oldVal) {
      console.log('scrollerHeight Change: ' + val, oldVal)
        return val - 130 // 跟初始化同理
    }
  },
  created () {
    this.init() // 后台接口获取table数据
  },
  methods: {
    init () {
      // 这里是api接口拿数据的地方,拿到数据先缓存起来,方便页面input的搜索条件进行数据的查询
      this.allTableData = [
        {
          name: "John Brown",
          age: 18,
          address: "New York No. 1 Lake Park",
          date: "2016-10-03"
        },
        {
          name: "Jim Green",
          age: 24,
          address: "London No. 1 Lake Park",
          date: "2016-10-01"
        },
        {
          name: "Joe Black",
          age: 30,
          address: "Sydney No. 1 Lake Park",
          date: "2016-10-02"
        },
        {
          name: "Jon Snow",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow2",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow3",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow4",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow5",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow6",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow7",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow8",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow9",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow10",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow11",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow12",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow13",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow14",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow15",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow16",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow17",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow18",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow19",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow20",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow21",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow22",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow23",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        },
        {
          name: "Jon Snow24",
          age: 26,
          address: "Ottawa No. 2 Lake Park",
          date: "2016-10-04"
        }
      ]
      this.search()
    },
    search () {
      // 这里是对表格中出现的所有数据进行的模糊搜索,只要包含search的搜索条件,均返回其结果!!
      this.filterData = []
      this.allTableData.filter(item => {
        let flag = true
        Object.keys(item).map(key => {
          if (JSON.stringify(item[key]) && JSON.stringify(item[key]).toLowerCase().indexOf(this.searchForm.name.toLowerCase()) !== -1 && flag) {
            this.filterData.push(item)
            flag = false
          }
        })
      })
      this.showCurrentPage(this.filterData)
    },
    showCurrentPage (params) {
      this.tCurrentPage = 1
      this.pageSize = parseInt(this.scrollerHeight / 48) // 48代表的是当前table的tr高度, 【 当前页的条数 = 当前获取的高度 / tr的高度 】
      // 保存所有条数
      this.dataCount = params.length
      // 初始化显示,小于每页显示条数,全显,大于每页显示条数,取前每页条数显示
      if (this.dataCount < this.pageSize) {
        // 当total< pageSize,应该只有[pageSize]
        this.pageSize = this.dataCount
        this.pageSizeOpts = [this.dataCount]
        this.data = params
      } else {
        this.pageSizeOpts = [this.pageSize, this.pageSize + 5, this.pageSize + 10]
        this.data = params.slice(0, this.pageSize)
      }
    },
    changepage (index) {
      this.tCurrentPage = index
      var _start = (index - 1) * this.pageSize
      var _end = index * this.pageSize
      this.data = this.filterData.slice(_start, _end)
    },
    changeSize (size) {
      this.pageSize = size
      var _start = (this.tCurrentPage - 1) * size
      var _end = this.tCurrentPage * size
      this.data = this.filterData.slice(_start, _end)
    },
    listenResizeFn () {
      console.log('处理窗口缩放时要处理的逻辑操作!')
      this.scrollerHeight = window.innerHeight - 130
      this.showCurrentPage(this.allTableData)
    },
  }
}
</script>
处理窗口缩放

我们习惯性使用下面的方法:

 window.onresize = () => {
   return (() => {
        // 缩放执行的操作!!
    })
}

但是上述方法在onresize被多次调用时,会导致触发执行的相关操作未生效!这是因为onresize本身就是一个回调函数,当其改变的时候,前一个就会被覆盖。

解决办法:事件监听 addEventListener(event , function, useCapture)
其中, event: 监听的事件,不需要加前缀;function: 事件触发之后调用的函数;useCapture: true为捕获,false为冒泡

mounted () {
  // 添加监听事件listenResizeFn, 用来监听页面高度的变化
  window.addEventListener("resize", this.listenResizeFn)
},
beforeDestroy () {
  // 移除绑定的listenResizeFn事件监听
  window.removeEventListener('resize', this.listenResizeFn)
},
methods: {
  listenResizeFn () {
    console.log('处理窗口缩放时要处理的逻辑操作!')
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值