【VUE项目实战】39、商品分类树形表格渲染和分页

接上篇《38、实现商品分类的树形表格
上一篇我们完成了商品分类的树形结构效果,本篇我们来实现“排序”和“操作”列的渲染,以及表格的分页效果。

一、渲染“排序”和“操作”列

需要实现的渲染效果如下:

查看商品分类的返回数据结构:

{
    "data": [
        {
            "cat_id": 1,
            "cat_name": "大家电",
            "cat_pid": 0,
            "cat_level": 0,
            "cat_deleted": false,
            "children": [
                {
                    "cat_id": 3,
                    "cat_name": "电视",
                    "cat_pid": 1,
                    "cat_level": 1,
                    "cat_deleted": false,
                    "children": [
                        {
                            "cat_id": 6,
                            "cat_name": "曲面电视",
                            "cat_pid": 3,
                            "cat_level": 2,
                            "cat_deleted": false
                        },
                        {
                            "cat_id": 7,
                            "cat_name": "海信",
                            "cat_pid": 3,
                            "cat_level": 2,
                            "cat_deleted": false
                        }
                    ]
                }
            ]
        }
    ],
    "meta": {
        "msg": "获取成功",
        "status": 200
    }
}

可以看到其中有一个“cat_level”字段,指的就是商品分类所属的层级,0为一级分类,1为二级分类,2为三级分类。

我们可以在之前定义的树形表格的columns结构中再定义“排序”列的结构:

//为table指定列的定义
columns: [
    {
        label: '分类名称',
        prop: 'cat_name'
    },
    {
        label: '是否有效',
        prop: 'cat_deleted',
        //表示将当前列定义为模板列
        type: 'template',
        //表示当前这一列使用模板名称
        template: 'isok'
    },
    {
        label: '排序',
        //表示将当前列定义为模板列
        type: 'template',
        //表示当前这一列使用模板名称
        template: 'order'
    }
]

然后在上面的table标签中再次定义一个template模板,并指定其作用域插槽slot为下面定义的“order”,作用域对象为scope,然后根据当前列“cat_level”所属等级,按不同的条件显示不同样式的Tag标签(一级为蓝色,二级为绿色,三级为黄色):

<!-- 表格区域 --><!-- 树形组件 -->
<tree-table :data="catelist" :columns="columns" 
    :selection-type="false" :expand-type="false" :show-index="true" :border="true">
    <!-- 是否有效 -->
    <template slot="isok" slot-scope="scope">
        <i class="el-icon-success" v-if="scope.row.cat_deleted === false" style="color:green"></i>
        <i class="el-icon-error" v-else style="color:red"></i>
    </template>
    <!-- 排序 -->
    <template slot="order" slot-scope="scope">
        <el-tag size="mini" v-if="scope.row.cat_level=== 0">一级</el-tag>
        <el-tag type="success" size="mini" v-else-if="scope.row.cat_level=== 1">二级</el-tag>
        <el-tag type="warning" size="mini" v-else>三级</el-tag>
    </template>
</tree-table>

效果:

然后我们继续渲染“操作”列。操作列很简单,只有“编辑”和“删除”两个按钮:

我们在columns结构中再定义“操作”列的结构:

{
    label: '操作',
    //表示将当前列定义为模板列
    type: 'template',
    //表示当前这一列使用模板名称
    template: 'opt'
}

然后在table标签中定义template模板,作用域插槽slot为下面定义的“opt”,作用域对象为scope:

<!-- 操作列 -->
<template slot="opt" slot-scope="scope">
    <el-button type="primary" icon="el-icon-edit" size="mini" @click="edit_cate(scope.row)">编辑</el-button>
    <el-button type="danger" icon="el-icon-delete" size="mini" @click="delete_cate(scope.row)">删除</el-button>
</template>

编辑和删除的方法在下面方法区定义(先不实现):

//编辑分类
edit_cate(cate){},
//删除分类
delete_cate(cate){}

效果:

二、商品分类表格分页效果

首先我们需要在页面中渲染出这样一个页码条:

我们打开Element-UI官方文档的Pagination分页组件说明,找到“完整功能”的源代码:

 

<div class="block">
    <span class="demonstration">完整功能</span>
    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="currentPage4"
      :page-sizes="[100, 200, 300, 400]"
      :page-size="100"
      layout="total, sizes, prev, pager, next, jumper"
      :total="400">
    </el-pagination>
</div>

其中需要定义的事件:

我们将el-pagination代码复制到表格tree-table的下方,其中的静态数据,全部换为我们之前定义的分页对象queryInfo中的值(total为我们之前定义好的列表总数total),分页数量定为“3,5,10,15”即可:

<!-- 分页区域 -->
<el-pagination
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
    :current-page="queryInfo.pagenum"
    :page-sizes="[3, 5, 10, 15]"
    :page-size="queryInfo.pagesize"
    layout="total, sizes, prev, pager, next, jumper"
    :total="total">
</el-pagination>

然后在方法区定义handleSizeChange和handleCurrentChange函数:

//监听pageSize改变
handleSizeChange(newSize){
    //将当前页面最大显示数赋值给分页对象的pagesize
    this.queryInfo.pagesize = newSize;
    this.getCatelist();//刷新表
},
//监听当前页面pagenum改变
handleCurrentChange(newPage){
    //将当前所在页赋值给分页对象的pagenum
    this.queryInfo.pagenum = newPage;
    this.getCatelist();//刷新表
}

打开浏览器看一下分页效果:

可以看到分页效果已经实现。
最后我们观察表格和上下的组件没有一点空隙,比较难看:

我们可以为tree-table新建一个class样式:

<!-- 表格区域 --><!-- 树形组件 -->
<tree-table class="treeTable" :data="catelist" :columns="columns" 
    :selection-type="false" :expand-type="false" :show-index="true" :border="true">
    <!-- 中间代码省略... -->
</tree-table>

然后在Script区域定义表格的上下外边距为15像素:

<style scoped>
.treeTable{
    margin-top: 15px;
    margin-bottom: 15px;
}
</style>

优化后的效果,上下有了边距:

至此,商品“排序”和“操作”列的渲染,以及分页效果已经实现了。
下一篇我们实现添加商品分类的功能。

参考:黑马程序员(www.itheima.com)Vue项目实战教学视频

转载请注明出处:https://blog.csdn.net/u013517797/article/details/123459983

在arco框架中,可以通过使用vue数据渲染树形表格的子级。 具体步骤如下: 1. 定义树形数据结构,包括id、name、children等字段。 2. 在vue中,使用递归组件方式渲染树形表格。在组件中,使用v-for指令遍历所有节点,为每个节点生成行数据,并判断是否有子节点。若有,则调用递归组件并传入子节点数据作为参数,以此实现树形结构的渲染。 3. 可以根据需要,使用slot插槽自定义表格列的渲染方式。 具体代码实现可以参考以下示例: ``` <template> <div> <div class="table-header">树形表格</div> <div class="table-container"> <a-table :columns="columns" :data-source="dataSource" row-key="id"> <template #default="{ row, index }"> <tr> <td>{{row.id}}</td> <td>{{row.name}}</td> </tr> <tr :class="&#39;treeTable-subRow-&#39; + row.id" v-if="row.children && row.children.length > 0"> <td colspan="2"> <RecursiveTable :dataSource="row.children"></RecursiveTable> </td> </tr> </template> </a-table> </div> </div> </template> <script> import { Table, Column } from &#39;arco-design-vue&#39;; // 递归组件 let RecursiveTable = { name: &#39;RecursiveTable&#39;, props: [&#39;dataSource&#39;], components: { &#39;RecursiveTable&#39;: this }, render() { return ( <a-table :columns="columns" :data-source="dataSource" row-key="id" style="margin-left: 12px;"> <template #default="{row}"> <tr> <td>{{row.id}}</td> <td>{{row.name}}</td> </tr> <tr :class="&#39;treeTable-subRow-&#39; + row.id" v-if="row.children && row.children.length > 0"> <td colspan="2"> <RecursiveTable :dataSource="row.children"></RecursiveTable> </td> </tr> </template> </a-table> ) }, data() { return { columns: [ { title: &#39;ID&#39;, dataIndex: &#39;id&#39;, width: &#39;20%&#39; }, { title: &#39;名称&#39;, dataIndex: &#39;name&#39;, width: &#39;80%&#39;, } ], } }, } export default { components: { RecursiveTable, [Table.name]: Table, [Column.name]: Column, }, data() { return { columns: [ { title: &#39;ID&#39;, dataIndex: &#39;id&#39;, width: &#39;20%&#39; }, { title: &#39;名称&#39;, dataIndex: &#39;name&#39;, width: &#39;80%&#39;, } ], dataSource: [ { id: &#39;1&#39;, name: &#39;节点1&#39;, children: [ { id: &#39;1-1&#39;, name: &#39;子节点1-1&#39;, children: [ { id: &#39;1-1-1&#39;, name: &#39;子节点1-1-1&#39;, }, { id: &#39;1-1-2&#39;, name: &#39;子节点1-1-2&#39;, } ] }, { id: &#39;1-2&#39;, name: &#39;子节点1-2&#39;, } ] }, { id: &#39;2&#39;, name: &#39;节点2&#39;, } ], } }, } </script> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值