You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue2环境下JQuery DataTables不使用Ajax实现服务端处理的方法

解决方案

该需求完全可以实现,推荐使用DataTables的自定义ajax函数方案,既可以保留你现有的wretch自定义取数逻辑(含授权处理),也能完整使用serverSide模式下的分页、搜索、排序特性。

具体实现步骤

修改DataTables初始化配置,开启serverSide,将原有data配置替换为自定义ajax函数,函数内部调用你自己的取数逻辑即可,参考代码如下:

...
mounted: function () {
  this.dataTable = window.$(this.$el).DataTable({
    serverSide: true, // 开启服务端模式
    processing: true, // 可选:加载数据时展示loading提示
    columns: this.getColumns,
    // 自定义ajax函数接管请求逻辑
    ajax: async (dtParams, callback, errorCallback) => {
      try {
        // dtParams是DataTables自动生成的参数,包含分页、搜索、排序所有所需字段
        // 可以按需转换参数格式后传给你自己的取数方法
        const serverRes = await this.getGridData(dtParams)
        // 你后端已经适配了DataTables服务端响应结构,直接传入回调即可
        callback(serverRes)
      } catch (err) {
        errorCallback(err)
      }
    }
  });
},
...

注意事项

  • 你的自定义取数方法getGridData接收参数后直接传给后端做分页、过滤、排序处理即可,现有后端逻辑无需额外调整。
  • 如果后端接收参数的命名规则和DataTables默认生成的参数名不一致,可在调用取数方法前对参数做自定义转换即可。
  • 需要手动刷新表格数据时,直接调用this.dataTable.ajax.reload()即可自动触发自定义请求逻辑。

备选方案(不使用ajax配置)

如果确实不想用ajax配置项,也可以通过监听表格的分页、搜索、排序事件,手动触发取数后更新表格:

mounted: function () {
  this.dataTable = window.$(this.$el).DataTable({
    serverSide: true,
    columns: this.getColumns,
    data: []
  });
  // 监听操作事件触发自定义请求
  this.dataTable.on('page search order', async () => {
    const dtParams = this.dataTable.ajax.params()
    const res = await this.getGridData(dtParams)
    // 手动更新表格数据和统计参数
    this.dataTable.clear()
      .rows.add(res.data)
      .draw(false)
    this.dataTable.page.info().recordsTotal = res.recordsTotal
    this.dataTable.page.info().recordsFiltered = res.recordsFiltered
  })
  // 首次加载触发
  this.dataTable.trigger('search')
},

注意该方案需要自行维护分页统计参数,容易出现计数异常,优先级低于自定义ajax函数方案。


内容的提问来源于stack exchange,提问作者bruce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 00:36:03