查询数据表格封装

这篇博客介绍了如何在Vue.js应用中封装数据表格组件,包括查询参数、数据加载、分页和刷新功能。同时,文章详细讲解了树形数据的转换方法,用于展示树形结构的一级菜单数据,并提供了相应的Utils函数实现。此外,还展示了如何处理菜单数据的排序操作。
摘要由CSDN通过智能技术生成

查询数据表格封装

查询数据表格封装

table.js的mixins公用方法。 mixins.

import { treeDataTranslate } from "@/utils";
import { getFirstLevelTreeData } from "@/utils/tree";
import { getOrderMenus } from "@/utils/menu";
import Vue from "vue";

const DEFAULT_SEARCH_PARAMS = {
  pageNum: 1,
  pageSize: 10
};

const tableMixins = {
  data() {
    return {
      listUrl: "",
      lazyLoad: false,
      pageSizes: [10, 20, 30],
      searchParams: DEFAULT_SEARCH_PARAMS,
      loading: false,
      list: [],
      total: 0,
      treeParams: [],
      swapMenus: [],
      highlightRow: false,
      record: undefined,
      tableHeight: "calc(100vh - 320px)"
    };
  },
  methods: {
    formatBool(row, column, cellValue, index) {
      return cellValue === true ? "是" : "否";
    },
    handleRefresh() {
      Object.keys(this.searchParams).map(key => {
        this.searchParams[key] = undefined;
      });
      this.highlightCurrentRow = false;
      this.getDataList();
    },
    // 获取数据列表
    getDataList(parms) {
      if(parms){
        this.searchParams.pageNum = 1 //翻页后再查询-默认页数为1
      }
      this.loading = true;
      this.$http({
        url: this.$http.adornUrl(this.listUrl),
        method: "get",
        params: this.$http.adornParams(this.searchParams)
      }).then(data => {
        if (data) {  
          const dataList=[];
          // 如果有数据就赋值给list  
          if(Object.prototype.toString.call(data) ==  '[object Object]'){
            dataList = data.list ||data.page.list;
          }else if(Object.prototype.toString.call(data) ==  '[object Array]'){
            dataList = data
          }
          if (this.treeParams.length > 0) {
          // 如果是要树形加载的数据,在页面需要设置treeParams属性;
          // 如果页面有这个属性,进行树形转换,封装如下
            const transData = treeDataTranslate(dataList, ...this.treeParams);
            this.list = this.lazyLoad
              ? getFirstLevelTreeData(transData)
              : transData;
          } else {
            this.list = dataList;
          }
          this.total =data.page?data.page.total:data.total
        } else {
          this.list = [];
          this.total = 0;
        }
        this.loading = false;
        if(this.$refs.Table){//清除单选选择
          this.$refs.Table.setCurrentRow();
        }
      });
    },

    handleSizeChange(pageSize) {
      this.searchParams.pageSize = pageSize;
      this.searchParams.pageNum = 1;
      this.getDataList();
    },

    handleCurrentChange(page) {
      this.searchParams.pageNum = page;
      this.getDataList();
    },

    getOrderDataList(record, type) {
      const { swapMenus, orderMenus } = getOrderMenus(this.list, record, type);
      this.list = JSON.parse(JSON.stringify(orderMenus));
      this.swapMenus = swapMenus;
    }
  }
};

export { tableMixins };

其中树状图的封装 utils.

/**
 * 树形数据转换
 * @param {*} data
 * @param {*} id
 * @param {*} pid
 */
export function treeDataTranslate(data, id = "id", pid = "parentId") {
 
  var res = [];
  var temp = {};
  for (var i = 0; i < data.length; i++) {
    temp[data[i][id]] = data[i];
    delete temp[data[i][id]].children;
  }
  for (var k = 0; k < data.length; k++) {
    if (temp[data[k][pid]] && data[k][id] !== data[k][pid]) {
      if (!temp[data[k][pid]]["children"]) {
        temp[data[k][pid]]["children"] = [];
        temp[data[k][pid]]["hasChildren"] = false;
      }
      if (!temp[data[k][pid]]["_level"]) {
        temp[data[k][pid]]["_level"] = 1;
      }
      data[k]["_level"] = temp[data[k][pid]]._level + 1;
      temp[data[k][pid]]["children"].push(data[k]);
      temp[data[k][pid]]["hasChildren"] = true
    } else {
      res.push(data[k]);
    }
  }
  return res;
}

生成树形结构一级菜单数据 utils/tree.

// 生成树形结构一级菜单数据
export const getFirstLevelTreeData = data => {
  let _cloneData = [...data];
  return _cloneData.map(item => {
    return {
      ...item,
      children: [],
      // TODO: 后端返回的hasChild字段不正确 总是false
      hasChildren: true
    };
  });
};

menu.js的封装: utils/menu.js.

import _ from "lodash";

/**
 * 数组交换
 * @param {*} arr   数组
 * @param {*} index 当前选中的索引
 * @param {*} type  down | up
 */
function swap(arr, swapMenus, sourceIndex, targetIndex) {
  let temp;
  let tempOrderNum = 0;

  console.log(arr, sourceIndex, targetIndex);

  tempOrderNum = arr[sourceIndex].orderNum;
  arr[sourceIndex].orderNum = arr[targetIndex].orderNum;
  arr[targetIndex].orderNum = tempOrderNum;

  temp = arr[sourceIndex];
  arr[sourceIndex] = arr[targetIndex];
  arr[targetIndex] = temp;

  swapMenus.push({
    menuId: arr[sourceIndex].menuId,
    orderNum: arr[sourceIndex].orderNum
  });
  swapMenus.push({
    menuId: arr[targetIndex].menuId,
    orderNum: arr[targetIndex].orderNum
  });
}

/**
 * 获取排序后的list
 * @param {*} arr    数组
 * @param {*} record 当前记录
 * @param {*} type   up | down
 */
function getOrderDataList(arr, swapMenus, record, type) {
  const listArr = _.cloneDeep(arr);
  return listArr.reduce((pre, item, index) => {
    if (item.menuId === record.menuId) {
      const len = pre.length;
      if (type === "up") {
        const targetIndex = index - 1;
        const lastIndex = targetIndex >= 0 ? targetIndex : len + targetIndex;
        swap(pre, swapMenus, index, lastIndex);
      } else {
        const targetIndex = index + 1;
        const nextIndex = targetIndex < len ? targetIndex : targetIndex - len;
        swap(pre, swapMenus, index, nextIndex);
      }
    }
    return pre;
  }, arr);
}

export function getOrderMenus(menus, record, type) {
  const { parentId } = record;
  let orderMenus = [];
  let swapMenus = [];

  function findMenus(menus) {
    if (parentId === 0) {
      return getOrderDataList(menus, swapMenus, record, type);
    }

    return menus.map(menu => {
      let cloneMenu = _.cloneDeep(menu);
      if (menu.children && menu.children.length > 0) {
        if (parentId === menu.menuId) {
          cloneMenu.children = getOrderDataList(
            menu.children,
            swapMenus,
            record,
            type
          );
        }
        return {
          ...menu,
          children: findMenus(menu.children)
        };
      }
      return cloneMenu;
    });
  }
  orderMenus = findMenus(menus);
  return { swapMenus, orderMenus };
}
好的,我会尽力回答你关于LAYUI数据表格查询的问题。 LAYUI数据表格查询是基于JavaScript的一个开源前端UI框架,可以帮助开发者快速实现数据表格的展示和查询功能。你可以通过LAYUI提供的API接口,实现数据的排序、筛选、分页等功能。 具体来说,你可以通过以下步骤实现数据表格查询: 1. 在HTML页面中引入LAYUI相关的JS和CSS文件。 2. 在HTML页面中定义一个数据表格的容器,如<div id="table-container"></div>。 3. 在JavaScript中定义数据表格的配置信息,包括表头、数据源、分页等。 4. 调用LAYUI提供的API接口,实现数据表格的渲染和查询功能。 例如,你可以通过以下代码实现一个简单的数据表格查询: ``` layui.use('table', function(){ var table = layui.table; //定义数据表格的配置信息 var options = { elem: '#table-container', url: '/api/data', cols: [[ {field: 'id', title: 'ID'}, {field: 'name', title: '姓名'}, {field: 'age', title: '年龄'}, {field: 'email', title: '邮箱'} ]], page: true }; //渲染数据表格 table.render(options); //实现数据查询功能 $('#search-btn').on('click', function(){ var keyword = $('#keyword').val(); table.reload('table-container', { where: {name: keyword}, page: {curr: 1} }); }); }); ``` 在上述代码中,我们首先使用了LAYUI的table模块,定义了数据表格的配置信息。然后调用table.render()方法,渲染了数据表格。 接着,我们实现了一个查询按钮和一个关键词输入框,当用户点击查询按钮时,我们通过table.reload()方法重新加载数据,并传入了一个where参数,用于指定查询条件。这样就可以实现数据表格查询功能了。 希望这个回答能够对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值