VUE项目实战40添加商品分类功能

Posted 光仔December

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VUE项目实战40添加商品分类功能相关的知识,希望对你有一定的参考价值。

接上篇《39、商品分类树形表格渲染和分页
上一篇我们实现了“排序”和“操作”列的渲染,以及表格的分页效果。本篇我们来实现添加商品分类的功能。

我们最终要实现的效果:

首先点击添加分类按钮,会弹出相应的对话框,然后里面有“分类名称”以及“父级分类”的编辑框,其中“父级分类”为一个“级联选择框”(一个新组件)。

一、实现弹出页面的基本布局

我们在原来的“<el-card>”卡片视图标签的下方,添加Dialog对话框标签,用于展示弹出的添加对话框:

<!-- 添加商品分类的对话框 -->
<el-dialog
    title="添加分类"
    :visible.sync="addCateDialogVisible"
    width="50%">
    <span>这是一段信息</span>
    <span slot="footer" class="dialog-footer">
        <el-button @click="addCateDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addCateDialogVisible = false">确 定</el-button>
    </span>
</el-dialog>

其中“addCateDialogVisible”为控制是否显示对话框的对象,我们在数据区定义它:

data()
    return 
        //查询条件
        queryInfo:
            type: 3,
            pagenum: 1,
            pagesize: 5
        ,
        //商品分类的数据列表,默认为空
        catelist: [],
        total: 0, //数据总数
        //为table指定列的定义
        columns: [],//定义太长了这里省略...
        //控制是否显示添加分类的对话框
        addCateDialogVisible: false
    
,

然后给添加分类按钮定义一个click事件,其中函数名为“showAddCateDialog”:

<el-button type="primary" @click="showAddCateDialog()">添加分类</el-button>

在方法区中定义该方法:

//点击按钮,展示添加分类的对话框
showAddCateDialog()
    this.addCateDialogVisible = true;

效果:

然后我们完善对话框的内容:

<!-- 添加商品分类的对话框 -->
<el-dialog
    title="添加分类"
    :visible.sync="addCateDialogVisible"
    width="50%">
    <!-- 添加分类表单 -->
    <el-form :model="addCateForm" :rules="addCateFormRules" 
    ref="addCateFormRef" label-width="100px">
        <el-form-item label="分类名称" prop="cat_name">
            <el-input v-model="addCateForm.cat_name"></el-input>
        </el-form-item>
        <el-form-item label="父级分类">
        </el-form-item>
    </el-form>
    <span slot="footer" class="dialog-footer">
        <el-button @click="addCateDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addCateDialogVisible = false">确 定</el-button>
    </span>
</el-dialog>

注:这里父级分类我们先不维护“级联选择框”(因为比较复杂,单独拿出来讲)。
这里的el-form是带有校验规则的表单,其中model定义的addCateForm就是要提交的表单对象,rules定义的addCateFormRules就是提交前的校验规则,这些都在数据区进行定义:

//添加分类的表单数据对象
addCateForm: 
    //将要添加的分类的名称
    cat_name: '',
    //父级分类的ID
    cat_pid: '',
    //当前分类等级,默认要添加的是1级分类
    cat_level: 0
,
//添加分类表单的验证规则对象
addCateFormRules: 
    cat_name: [
         required: true, message: '请选分类名称', trigger: 'blur' 
    ]

效果:

二、实现父级分类的级联选择

我们要实现在对话框的父级分类中,来选择一级和二级分类:

这里我们要使用的API依然为商品分类数据列表:

响应数据架构:


    "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
    

请求时,我们要将type设置为2,即只获取一级和二级分类。然后pagenum和pagesize全部都不传递,因为我们要加载所有的。

我们在方法区定义一个名为“getParentCateList”的方法,来获取父级分类下拉框需要的数据:

//获取父级分类的数据列表
async getParentCateList()
    const data: res = await this.$http.get('categories',params: type:2);
    if(res.meta.status!==200)
        return this.$message.error('获取父级分类失败!')
    
    //将数据列表赋值给parentCateList
    this.parentCateList = res.data;

然后在数据定义区定义parentCateList对象:

//父级分类列表
parentCateList: []

最后在点击对话框触发显示的showAddCateDialog方法中,在显示之前调用获取父级分类的方法:

//点击按钮,展示添加分类的对话框
showAddCateDialog()
    //先获取父级分类的列表数据
    this.getParentCateList();
    this.addCateDialogVisible = true;
    
,

这些都做完后,我们就在加载之前获取到了父级分类的所有数据,接下来我们就可以那这些数据渲染我们的级联选择组件了。

这里我们需要使用到Element-UI为我们提供的“Cascader级联选择器”中的“hover 触发子菜单”:

示例代码:

<div class="block">
  <span class="demonstration">hover 触发子菜单</span>
  <el-cascader
    v-model="value"
    :options="options"
    :props=" expandTrigger: 'hover' "
    @change="handleChange"></el-cascader>
</div>

其中的v-model是最终选择的好的值绑定的结果对象,这里一定要是一个数组;options绑定的是可选择的子菜单的结构数据源对象,props为配置项,配置显示的值是哪个,id是哪个,展开方式等,具体参数如下:

注:画红圈的是我们主要用到的属性。
@change绑定了当组件值变化时触发的方法。
首先在element.js中引入Cascader组件:

import Vue from 'vue'
import  Button, Form, FormItem, Input, Message, Container, 
    Header, Aside, Main, Menu, Submenu, MenuItem, MenuItemGroup,
    Breadcrumb,BreadcrumbItem,Card,Row,Col,Table,TableColumn,Switch,
    Tooltip,Pagination,Dialog,MessageBox,Tag,Tree,Select,Option,Cascader  from 'element-ui'

Vue.use(Button);Vue.use(Form);Vue.use(FormItem);Vue.use(Input);
Vue.use(Container);Vue.use(Header);Vue.use(Aside);Vue.use(Main);
Vue.use(Menu);Vue.use(Submenu);Vue.use(MenuItem);Vue.use(MenuItemGroup);
Vue.use(Breadcrumb);Vue.use(BreadcrumbItem);Vue.use(Card);Vue.use(Row);
Vue.use(Col);Vue.use(Table);Vue.use(TableColumn);Vue.use(Switch);Vue.use(Tooltip);
Vue.use(Pagination);Vue.use(Dialog);Vue.use(Tag);Vue.use(Tree);Vue.use(Select);
Vue.use(Option);Vue.use(Cascader);
Vue.prototype.$message = Message
Vue.prototype.$confirm = MessageBox.confirm

我们在原来的“父级分类”的“el-form-item”标签中放置级联选择器,然后定义相关的参数:

<!-- 添加商品分类的对话框 -->
<el-dialog
    title="添加分类"
    :visible.sync="addCateDialogVisible"
    width="50%">
    <!-- 添加分类表单 -->
    <el-form :model="addCateForm" :rules="addCateFormRules" 
    ref="addCateFormRef" label-width="100px">
        <el-form-item label="分类名称" prop="cat_name">
            <el-input v-model="addCateForm.cat_name"></el-input>
        </el-form-item>
        <el-form-item label="父级分类">
            <el-cascader
                v-model="selectedKeys"
                :options="parentCateList"
                :props="cascaderProps"
                @change="parentCateChanged()">
            </el-cascader>
        </el-form-item>
    </el-form>
    <span slot="footer" class="dialog-footer">
        <el-button @click="addCateDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addCateDialogVisible = false">确 定</el-button>
    </span>
</el-dialog>

这里的“selectedKeys”、“cascaderProps”需要在数据区定义好:

//指定级联选择器的配置对象
cascaderProps: 
    value: 'cat_id',
    label: 'cat_name',
    children: 'children',
    leaf: 'cat_level',
    expandTrigger: 'hover' //悬浮显示
,
//选中的父级分类的ID
selectedKeys :[]

然后在方法区定义选择分类变化时的函数parentCateChanged:

//选择项发生变化触发这个函数
parentCateChanged()
    console.log(selectedKeys);

这里先打印出选择的内容。
这里还需要调一下级联选择器的最大高度,不然在加载很多数据的时候会占满整个屏幕,所以需要在vue_shop/src/assets/css/global.css下定义全局样式:

.el-cascader-panel
  max-height: 200px;

测试效果:

至此,级联选择器加载的效果已经实现了,下一篇我们继续完善级联选择器的选择等操作。

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

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

以上是关于VUE项目实战40添加商品分类功能的主要内容,如果未能解决你的问题,请参考以下文章

Vue项目实战:电商后台管理系统(Vue+VueRouter+Axios+Element)

Vue项目实战:电商后台管理系统(Vue+VueRouter+Axios+Element)

VUE项目实战37商品分类功能介绍和基本结构搭建

VUE项目实战38实现商品分类的树形表格

VUE项目实战51商品添加功能

VUE项目实战56商品添加功能-提交添加的商品