vue + antd项目Table的前台内容排序

1、table部分代码

<!-- dom结构 -->
      <a-table
        row-key="id"
        :columns="columns"
        :loading="loading"
        :data-source="list"
        :pagination="pagination"
        @change="handlePageChange"
      >
        <template slot="operation" slot-scope="id, record">
          <a
            @click="() => handleClickEdit(record.id)"
          >
            编辑
          </a>
          <a
            @click="() => handleClickDelete(record.id)"
          >
            删除
          </a>
          <a @click="() => handleClickDetail(record.id)">
            详情
          </a>
        </template>
      </a-table>
<script>
const columns = [
  { title: "货品名称", dataIndex: "goods" },
  { title: "进货数量", dataIndex: "quantity" },
  { title: "单价", dataIndex: "price" },
  { title: "剩余数量", dataIndex: "rest" },
  { title: "创建者", dataIndex: "creater" },
  { title: "创建日期", dataIndex: "createTime" },
  {
  {
    title: "操作",
    dataIndex: "operation",
    className: "column-operate",
    scopedSlots: { customRender: "operation" }
  }
];
 
export default {
  name: "SmsList",
  data() {
    return {
      list: [],
      columns,
      loading: true,
      pagination: {
        current: 1, // 当前页数 v-model
        defaultCurrent: 1, // 默认的当前页数
        defaultPageSize: 10, // 每页显示几条数据
        pageSize: 10,
        showQuickJumper: true, // 是否显示直通车
        showSizeChanger: true, // 显示下拉选项(每页几条)
        pageSizeOptions: ["10", "20", "50"]
      },
      currentPage: 1,
      currentPageSize: 10
    };
  },
 methods: {
    // 点击换页
    handlePageChange(pagination) {
      this.currentPage = pagination.current;
      this.currentPageSize = pagination.pageSize;
      this.getList(); //获取数据
      const pager = { ...this.pagination };
      pager.current = pagination.current;
      pager.pageSize = pagination.pageSize;
      this.pagination = pager;
    },
 },
}
</script>

2、增加排序(仅需在columns变量定义中增加排序规则)

const columns = [
  { title: "货品名称", dataIndex: "goods" },
  { title: "进货数量", dataIndex: "quantity", sorter: (a, b) => a.quantity - b.quantity, } },
  { title: "单价", dataIndex: "price" },
  { title: "剩余数量", dataIndex: "rest" },
  { title: "创建者", dataIndex: "creater" },
  { title: "创建日期", dataIndex: "createTime" },
  {
  {
    title: "操作",
    dataIndex: "operation",
    className: "column-operate",
    scopedSlots: { customRender: "operation" }
  }
];

排序方法:升序(假设排序列的detaIndex为key)

1)按内容有无/数字大小排序:sorter: (a, b) => a.key - b.key;

2)按内容长度排序:sorter: (a, b) => a.key.length - b.key.length;

3)按字母/姓名排序:sorter: (a, b) => a.key.localeCompare(b.key)。

3、增加筛选和查询功能(关于筛选:官方文档的方法是指定几项作为筛选项,此处举例采用的是根据内容自动生成筛选项的方法)

            <a-table
                row-key="id"
                :columns="columns"
                :data-source="list"
                :pagination="pagination"
                @change="handleChange"
              >
                <div
                  slot="filterDropdown"
                  slot-scope="{ setSelectedKeys, selectedKeys, confirm, clearFilters, column }"
                  style="padding: 8px"
                >
                  <a-input
                    :placeholder="`按${column.title}筛选`"
                    :value="selectedKeys[0]"
                    style="width: 188px; margin-bottom: 8px; display: block;"
                    @change="e => setSelectedKeys(e.target.value ? [e.target.value] : [])"
                    @pressEnter="() => handleSearch(selectedKeys, confirm, column.dataIndex)"
                  />
                  <a-button
                    type="primary"
                    size="small"
                    style="width: 80px; margin-right: 20px"
                    @click="() => handleSearch(selectedKeys, confirm, column.dataIndex)"
                  >
                    筛选
                  </a-button>
                  <a-button
                    size="small"
                    style="width: 80px"
                    @click="() => handleReset(clearFilters)"
                  >
                    重置
                  </a-button>
                </div>
                <a-icon
                  slot="filterIcon"
                  slot-scope="filtered"
                  type="search"
                  :style="{ color: filtered ? '#108ee9' : undefined }"
                />
            </a-table>
<script>
 computed: {
columns() {
 let { typeFilter } = this
      typeFilter = typeFilter || {}
      const columns = [{
       title: '货品名称',
          dataIndex: 'goods',
          scopedSlots: { filterDropdown: 'filterDropdown', filterIcon: 'filterIcon', customRender: 'goods' },
          onFilter: (value, record) => record.goods.toString().toLowerCase().includes(value.toLowerCase()),
        }, {
          title: '所属品种',
          dataIndex: 'type',
          filters: typeFilter,
          onFilter: (value, record) => { return record.type && record.type.indexOf(value) === 0 } },
      { title: "进货数量", dataIndex: "quantity", sorter: (a, b) => a.quantity - b.quantity, } },
      { title: "单价", dataIndex: "price" },
      { title: "剩余数量", dataIndex: "rest" },
      { title: "创建者", dataIndex: "creater" },
      { title: "创建日期", dataIndex: "createTime" 
    }]
    return columns
}
}
created() {
    // 获取menu数据并渲染menu
    this.getData()
},
methods:{
// 获取列表数据
    async getData() {
      try {
        const result = await this.$api.okr.getlist({/* 参数 */})
        const temArr = []
        if(result) {
            result.forEach(i => {
              // 收集品种名称的集合
            if (i.type) {
                temArr.push(i.type)
            }
          })
          this.typeFilter = []
          const newArr = [...new Set(temArr)] // ES6的新语法 数组去重
          newArr.forEach(i => {
            this.typeFilter.push(
              { text: i, value: i }
            )
          })
 
          this.$set(this, 'list', result)
          const pagination = { ...this.paginationDP }
          this.pagination = pagination
        }
      } catch (error) {
        const msg = error.errorMessage || error.message || '网络错误'
        console.log(msg)
      
    },
    // 点击换页
    handleChange(pagination) {
      const pager = { ...this.pagination }
      pager.current = pagination.current
      pager.pageSize = pagination.pageSize
      this.pagination = pager
    },
}
 
</script>

效果图如下:
在这里插入图片描述
此外,antd的Table组件比较常用的还有固定列,这里需要注意的就是:scroll="{ x: 值}",这个x对应的值不能超过滚动列宽度的和,笔者在用到的时候反复调整过,最后发现,太多的列容易出现遮挡问题,建议不要超过连续两列固定列,且如果表格不定宽度,最好给固定列指定宽度。

另外笔者还遇到合并行的需求,感觉用此组件过于麻烦,干脆自行table嵌套+v-for完成了,用起来很方便,此处就不赘述了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue antd table 是一种非常方便的数据表格组件,可以用来展示和管理大量的数据信息。在使用中,我们有时候需要在某个单元格里面嵌套一个表格,用来展示更详细的数据信息。这种场景下,我们需要实现vue antd table一格加多行的效果。 实现这个效果的方法有多种,这里介绍一种比较简单的方式: 1. 首先,在vue antd table中找到需要嵌套的单元格,给它加上一个 slot 插槽。例如: ```html <a-table-column title="姓名"> <template slot-scope="text, record"> <span>{{ record.name }}</span> <div slot="expandedRowRender"> <p>更详细的信息。。。</p> <p>更详细的信息。。。</p> <p>更详细的信息。。。</p> </div> </template> </a-table-column> ``` 这里要注意,设置 slot 的名称为 expandedRowRender,这样才可以使多行数据展开在同一个单元格内。 2. 接着,在 a-table 中添加一个属性,用来指定当前表格是否支持展开行:expandedRowRender。例如: ```html <a-table :columns="columns" :data-source="data" :pagination="false" :expanded-row-render="true"></a-table> ``` 这里要注意,设置 expanded-row-render 的值为 true,表示允许展开行。当然,还可以给 expanded-row-render 设置具体的属性值,比如属性值为 object 表示可以通过对象来配置展开的行。 3. 最后,在 table 中添加一个事件监听函数,用来处理展开行功能的具体逻辑。例如: ```html <a-table :columns="columns" :data-source="data" :pagination="false" :expanded-row-render="true" @expandedRowsChange="onExpandedRowsChange"></a-table> ``` 在 onExpandedRowsChange 函数中,我们可以进行一些表格展开和关闭的操作,例如: ```javascript methods: { onExpandedRowsChange(rows) { if (rows.length == 0) { // 关闭所有行 return; } console.log('展开行:', rows[0]); } } ``` 需要注意的是,由于 expandedRowRender 的值为 true,表示允许展开行,所以属性 @expandedRowsChange 才会生效,才能实现展开行的效果。 通过以上三个步骤,我们就可以实现vue antd table一格加多行的效果了。当然,具体实现方式还要根据自己的实际情况来进行调整,如果你还有其他更好的实现方式,欢迎在评论中分享给大家。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值