当前位置: 首页 > 知识库问答 >
问题:

vue.js - 如何让naive-ui的n-data-table的maxHeight的值为屏幕总高度减去非<n-card><n-data-table /></n-card>的高度?

鲁华皓
2025-06-07

如何让naive-ui的n-data-table的maxHeight的值为屏幕总高度减去非<n-card><n-data-table /></n-card>的高度

在线演示

不知道如何尝试,期望数据每页30条的时候,<n-card><n-data-table /></n-card>的maxHeight的值为屏幕总高度减去非<n-card><n-data-table /></n-card>的高度

共有1个答案

颛孙炜
2025-06-07

要实现根据屏幕总高度和非 <n-card><n-data-table /></n-card> 部分的高度来动态设置 <n-card><n-data-table /></n-card>maxHeight,可以通过 JavaScript 或 Vue 的响应式数据来实现。如下所示:

1. 获取屏幕的总高度

使用 window.innerHeight 来获取屏幕的总高度。

2. 获取非 <n-card><n-data-table /></n-card> 部分的高度

通过 Vue 的 ref 引用获取页面中非 <n-card><n-data-table /></n-card> 部分的高度。您可以分别获取其他卡片元素(bc)的高度。

3. 计算 maxHeight

通过计算剩余高度来设置 maxHeight,确保 <n-data-table /> 在显示时填满剩余的可视区域。

4. 响应式更新

使用 Vue 的响应式系统,确保当页面尺寸或卡片高度变化时,maxHeight 会自动更新。

示例实现:

<template>
  <div style="padding: 16px">
    <!-- 上部卡片 -->
    <n-card style="margin-bottom: 12px" ref="b">
      <div style="height: 80px" class="title">Like Layout {{ bHeight }}</div>
    </n-card>

    <!-- 显示当前行高和最大高度 -->
    rowHeight: {{ rowHeight }} maxHeight: {{ maxHeight }}

    <!-- 数据表卡片 -->
    <n-card>
      <n-data-table
        ref="tableRef"
        :columns="columns"
        :data="data"
        :pagination="pagination"
        :maxHeight="maxHeight"
      />
    </n-card>

    <!-- 下部卡片 -->
    <n-card style="margin-top: 10px" ref="c">
      <div style="height: 30px" class="title">Like Layout Footer {{ cHeight }}</div>
    </n-card>
  </div>
</template>

<script setup>
import { ref, onMounted, onBeforeUnmount, watch } from 'vue';

// 定义数据
const columns = [];
const data = [];
const pagination = { pageSize: 30 };

// 行高和其他高度参数
const rowHeight = 40; // 每行的高度为40px
const bHeight = 80; // b卡片高度
const cHeight = 30; // c卡片高度

// 用来计算数据表格的最大高度
const maxHeight = ref(0);

// 获取引用
const b = ref(null);
const c = ref(null);

// 计算最大高度的函数
const calculateMaxHeight = () => {
  const screenHeight = window.innerHeight; // 获取屏幕总高度
  const bCardHeight = b.value ? b.value.$el.offsetHeight : 0; // 获取b卡片的高度
  const cCardHeight = c.value ? c.value.$el.offsetHeight : 0; // 获取c卡片的高度

  // 计算剩余高度并根据行高设置 maxHeight
  const remainingHeight = screenHeight - bCardHeight - cCardHeight - 60; // 减去padding等空白

  // 计算表格的最大高度
  const tableHeight = Math.floor(remainingHeight / rowHeight) * rowHeight;

  // 设置 maxHeight
  maxHeight.value = tableHeight;
};

// 在组件挂载时计算最大高度
onMounted(() => {
  calculateMaxHeight();
  window.addEventListener('resize', calculateMaxHeight); // 监听窗口大小变化
});

// 在组件卸载时移除事件监听
onBeforeUnmount(() => {
  window.removeEventListener('resize', calculateMaxHeight);
});

// 监视相关数据变化
watch([b, c], () => {
  calculateMaxHeight(); // 如果b或c变化,重新计算maxHeight
});
</script>

<style scoped>
.title {
  font-size: 16px;
  font-weight: bold;
}
</style>

解释:

  1. calculateMaxHeight 方法

    • 获取 window.innerHeight 作为屏幕总高度。
    • 使用 this.$refs 来获取 bc 卡片的高度。通过 this.$refs.b.$el.offsetHeightthis.$refs.c.$el.offsetHeight 来获取实际的高度。
    • 计算剩余的高度并根据每行的高度 rowHeight 来确定 <n-data-table /> 的最大显示高度。
  2. mountedresize 事件监听

    • 当组件挂载时,调用 calculateMaxHeight 来初始化 maxHeight
    • 监听 resize 事件,在页面大小变化时重新计算 maxHeight
  3. maxHeight 的计算

    • 减去 bc 的高度以及一些额外的空白(如 padding 或边距)来获取 <n-data-table /> 的可用高度。
    • 使用每行的高度 rowHeight 来调整 maxHeight,确保每页显示的行数为 30。

通过这种方式,<n-card><n-data-table /></n-card>maxHeight 会动态调整,并根据屏幕大小和其他元素的高度变化自动适配。

 类似资料:
  • 问题内容: java.util.Random源代码的第294行说 为什么是这样? 问题答案: 该描述并不完全准确,因为0不是2的幂。更好的说法是 当n是2的幂或2的幂的负数或零时。 如果n是2的幂,则二进制中的n是单个1,后跟零。-n为2的补数是倒数+ 1,因此位排成一行 要了解其工作原理,请将二进制补码视为逆+ 1。 因为当您添加一个得到两个的补码时,您会一直进行到一个。 如果n不是2的幂,则结

  • 问题内容: 转到“切片”问题,请检查以下内容,并在我遗漏某些东西时发表评论。 输出: 以上是合理的。 输出: 这是否也应该使数组摆脱s = s [:2]的恐慌? 问题答案: Go中的Subslicing可让您在切片末尾进行切片,只要它仍在底层阵列的容量范围内即可。您不能 在 该切片的开始 之前 进行切片,但是只要不超过最后分配的索引,就可以在该切片之后进行切片。 例如,然后工作,但随后会出现恐慌,

  • 问题内容: 在Java中,表达式为: 似乎等于: 尽管是有效的一元运算符,其优先级高于中的算术运算符。因此,编译器似乎假设该运算符不能为一元运算符,并解析该表达式。 但是,表达式: 即使存在以下唯一有效的解决方案,也不会编译: 和被指定为具有相同的优先级,那么为什么编译器为支持算术而解决看似模棱两可的问题,但为什么不这样做呢? 问题答案: 首先使用最大修改规则将文件标记化(转换为标记序列)-始终获

  • 我需要以下递归关系的帮助。 T(1)=1 T(n)=T(n-1)*n 这就是我尝试过的。我想我可能把替换部分搞砸了,但请再看一次,让我知道我得到的时间复杂度是否正确。 现在我不确定我所做的是否完全正确,但如果有任何帮助,我将不胜感激。

  • orderer-n-kafka-n 启动一个可扩展的服务,包括 zookeeper、若干个 fabric-order 和若干个 kafka 节点。 如,启动 3 个 order 节点和 5 个 kafka 节点。 $ docker-compose up -d zookeeper$ docker-compose up -d kafka$ docker-compose scale kafka=5$ d

  • 问题内容: 我想从Java中的当前日期减去n天。 我怎么做? 问题答案: 您不必使用日历。您可以只使用时间戳记: 更新 不要忘记在1000年底之前长时间添加“ l”。 请考虑以下警告: 在java秒,夏令时等情况下,将毫秒添加到Java日期中将使原始日期增加零天或两天。如果您需要100%确定仅添加一天,则此解决方案不可用。

  • 我使用Spring Data JPA作为持久性层,我面临着N+1问题。我也在使用规范API,因为它我发现很难解决N+1问题。请帮帮忙。 在Specification类中使用了fetch()而不是join()之后,我得到了以下问题:

  • 我想取一个nxn矩阵的逆矩阵,用于我的GraphSlam。 我遇到的问题: <代码>。inverse()特征库(3.1.2)不允许零值,返回NaN LAPACK(3.4.2)库不允许使用零行列式,但允许使用零值(使用C中使用LAPACK计算矩阵逆的示例代码) 由于某种原因,Seldon库(5.1.2)无法编译 是否有人成功实现了允许负值、零值和零行列式的n x n矩阵反演代码?有什么好的库(C)推