antd-vue - - - - - table实现滚动加载数据

table实现滚动加载数据

代码如下:

<template>
  <a-table
    ref="tableRef"
    :loading="loading"
    bordered
    :scroll="{
      y: `calc(100vh / 2)`,
      scrollToFirstRowOnChange: true,
    }"
    :dataSource="dataSource"
    :columns="columns"
    :pagination="false"
  >
  </a-table>
</template>
<script>
import { reactive, ref, toRefs, nextTick, onMounted, onUnmounted } from "vue";
import { getTableList } from "@/api/getTableList.js";
import throttle from "lodash/throttle";
export default {
  name: "rolling-to-load-data",
  setup() {
    // 定义key,用以获取table标签元素
    const tableRef = ref(null);

    // table数据
    const tableConfig = reactive({
      loading: false,
      total: 0,
      pageNum: 1,
      columns: [],
      dataSource: [],
    });

    const getList = () => {
      tableConfig.loading = true;

      const params = {
        page: tableConfig.pageNum,
      };
      
      getTableList(params)
        .then((res) => {
          const { columns: _columns, dataSource, total } = res.data;

          Object.assign(tableConfig, {
            columns: _columns,
            dataSource:
              tableConfig.pageNum == 1
                ? dataSource
                : [...tableConfig.dataSource, ...dataSource],
            total,
          });
        })
        .finally(() => {
          tableConfig.loading = false;
        });
    };

    let lastScrollTop = 0; // 记录上一次滚动的位置

    // 定义滚动监听事件处理
    const handleTableScroll = throttle((event) => {
      const { scrollTop, scrollHeight, clientHeight } = event.target;
      if (
        scrollTop > lastScrollTop &&
        scrollHeight - scrollTop - clientHeight < 5
      ) {
        // 如果还有数据没加载,则继续加载
        const { dataSource, total } = tableConfig;
        if (dataSource.length < total) {
          tableConfig.pageNum += 1;
          getList();
        } else {
          console.log("已加载全部数据");
        }
      }
      lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; // 更新滚动位置
    }, 500);
	
	
	// 添加监听事件
    onMounted(() => {
      getList();
      nextTick(() => {
        const tableBody = tableRef.value.$el.querySelector(".ant-table-body");
        if (tableBody) {
          tableBody.addEventListener("scroll", handleTableScroll);
        }
      });
    });
    // 组件卸载时移除
    onUnmounted(() => {
      const tableBody = tableRef.value?.$el?.querySelector(".ant-table-body");
      if (tableBody) {
        tableBody.removeEventListener("scroll", handleTableScroll);
      }
    });
    return {
      tableRef,
      ...toRefs(tableConfig),
      getList,
    };
  },
};
</script>
### 集成 ant-design-vue 和 Flowable 的实现方法 #### 技术背景概述 Vue3 是一种现代化前端框架,提供了强大的组件化开发能力。Ant Design Vue 是基于 Ant Design 设计体系的 Vue 组件库,支持 Vue3 版本[^2]。Flowable 则是一个轻量级的工作流引擎,能够与前端应用无缝集成以完成复杂的业务流程管理。 为了在 Vue3 项目中集成 ant-design-vue 并结合 Flowable 工作流功能,可以按照以下方式构建: --- #### 安装依赖项 首先,在 Vue3 项目中安装必要的依赖包: ```bash npm install ant-design-vue@next vue-router pinia axios vue-i18n flowable-bpmn-modeler --save ``` 上述命令包含了以下几个核心模块: - `ant-design-vue` 提供 UI 组件。 - `vue-router` 负责路由管理。 - `pinia` 替代 Vuex 进行状态管理。 - `axios` 处理 HTTP 请求。 - `flowable-bpmn-modeler` 支持 BPMN 图形编辑器的功能。 --- #### 初始化项目结构 创建一个基础目录结构来组织代码文件: ``` src/ ├── components/ # 自定义组件 │ └── BpmnEditor.vue # 流程图编辑器组件 ├── views/ # 页面视图 │ └── WorkflowView.vue # 主要工作流界面 ├── store/ # Pinia 状态管理 └── router/index.js # 路由配置 ``` --- #### 使用 ant-design-vue 设置全局样式 在项目的入口文件(通常是 `main.ts` 或 `main.js`)中引入并注册 ant-design-vue: ```typescript import { createApp } from 'vue'; import App from './App.vue'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/reset.css'; // 引入默认样式 const app = createApp(App); app.use(Antd).mount('#app'); ``` 通过这种方式加载 ant-design-vue 后,可以在整个项目范围内使用其提供的组件。 --- #### 创建 Flowable 工作流页面 以下是 `WorkflowView.vue` 文件的一个简单示例,展示如何利用 ant-design-vue 构建表单并与 Flowable API 对接: ```vue <template> <a-card title="Flowable Workflows"> <!-- 表格显示已有的流程 --> <a-table :columns="columns" :data-source="workflows"></a-table> <!-- 添加新流程按钮 --> <a-button type="primary" @click="openBpmnEditor">新建流程</a-button> <!-- 嵌套 BPMN 编辑器对话框 --> <a-modal v-model:visible="isModalVisible" title="BPMN Editor" footer=""> <div id="canvas" style="height: 600px;"></div> </a-modal> </a-card> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ setup() { const isModalVisible = ref(false); const workflows = [ { key: '1', name: '请假审批', status: 'active' }, { key: '2', name: '报销申请', status: 'inactive' } ]; const columns = [ { title: '名称', dataIndex: 'name', key: 'name' }, { title: '状态', dataIndex: 'status', key: 'status' } ]; function openBpmnEditor(): void { isModalVisible.value = true; import('flowable-bpmn-modeler').then((module) => { new module.default.Modeler({ container: '#canvas' }); }); } return { workflows, columns, isModalVisible, openBpmnEditor }; } }); </script> ``` 此模板展示了如何结合 ant-design-vue 的表格和模态框组件,并嵌入 Flowable 的 BPMN 编辑器。 --- #### 数据交互逻辑 对于数据请求部分,可以通过 Axios 封装服务接口调用 Flowable RESTful API 来获取或提交流程实例信息。例如: ```typescript // src/services/workflowService.ts import axios from 'axios'; const instance = axios.create({ baseURL: 'http://localhost:8080/flowable-rest/service', }); export async function fetchWorkflows(): Promise<any[]> { try { const response = await instance.get('/runtime/process-instances'); return response.data; } catch (error) { console.error(error); throw error; } } ``` 随后可在组件内部调用该函数更新本地状态变量。 --- #### 最佳实践建议 1. **分离关注点**:将 UI 层面的操作封装到独立组件中,而复杂的数据处理则交由专门的服务层负责。 2. **国际化支持**:借助 `vue-i18n` 插件为用户提供多语言切换选项。 3. **性能优化**:当渲染大量列表时考虑虚拟滚动技术减少 DOM 渲染压力。 4. **安全性验证**:确保所有外部输入都经过严格校验后再传递给后端服务器。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值