当前位置 : 主页 > 编程语言 > java >

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块

来源:互联网 收集:自由互联 发布时间:2023-03-22
接上篇《​​52、商品添加功能(二)-基本信息​​》 上一篇我们完成了多页签汇总信息添加商品的逻辑梳理,以及完成基本信息的添加面板,本篇我们来完成商品参数和商品属性面板

接上篇《​​52、商品添加功能(二)-基本信息​​》 上一篇我们完成了多页签汇总信息添加商品的逻辑梳理,以及完成基本信息的添加面板,本篇我们来完成商品参数和商品属性面板的开发。

一、获取商品参数面板数据

我们要实现的效果:

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_tab-click

这里我们要先从后台获取该商品的所有参数信息,然后给它渲染到页面上。调用的API如下:

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_checkbox-group_02

●响应数据

{ "data": [ { "attr_id": 1, "attr_name": "cpu", "cat_id": 22, "attr_sel": "only", "attr_write": "manual", "attr_vals": "ffff" } ], "meta": { "msg": "获取成功", "status": 200 }}

这里在请求url里加入一个ID,这个ID就是第一个页面选择的商品ID,然后sel是获取静态属性还是动态参数,我们这里的商品参数时动态参数,所以写死为“many”即可。

我们首先在点击“商品参数”Tab时,来发起请求获取动态参数,我们给“商品参数”Tab添加一个点击事件(el-tabs标签定义一个属性名为tab-click的事件),如下:

<!-- Tab栏区域 --> <el-form :model="addForm" :rules="addFormRules" ref="addFormRef" label-width="100px" label-position="top"> <el-tabs :tab-position="'left'" v-model="activeIndex" @tab-click="tabClicked()"> <el-tab-pane label="基本信息" name="1"> <el-form-item label="商品名称" prop="goods_name"> <el-input v-model="addForm.goods_name"></el-input> </el-form-item> <el-form-item label="商品价格" prop="goods_price"> <el-input v-model="addForm.goods_price" type="number"></el-input> </el-form-item> <el-form-item label="商品重量" prop="goods_weight"> <el-input v-model="addForm.goods_weight" type="number"></el-input> </el-form-item> <el-form-item label="商品数量" prop="goods_number"> <el-input v-model="addForm.goods_number" type="number"></el-input> </el-form-item> <el-form-item label="商品分类" prop="goods_cat"> <el-cascader v-model="addForm.goods_cat" :options="catelist" :props="cascaderProps" @change="handleChange"></el-cascader> </el-form-item> </el-tab-pane> <el-tab-pane label="商品参数" name="2">商品参数</el-tab-pane> <el-tab-pane label="商品属性" name="3">商品属性</el-tab-pane> <el-tab-pane label="商品图片" name="4">商品图片</el-tab-pane> <el-tab-pane label="商品内容" name="5">商品内容</el-tab-pane> </el-tabs> </el-form></el-card>

这里我们定义了一个名为“tabClicked”的Tab点击事件,el-tabs下的所有el-tab-pane被点击都会触发该函数,我们在函数定义区定义该函数:

//Tab被点击后触发的函数async tabClicked(){ //通过activeIndex可得知现在被点击的是哪个Tab console.log(this.activeIndex); if(this.activeIndex=='2'){//如果当前被点击的是“商品参数”页签 //获取动态参数 console.log("商品参数面板"); if(this.addForm.goods_cat[2]==null){ return this.$message.error("请先在第一页选择商品!"); } const {data:res} = await this.$http.get('categories/'+this.addForm.goods_cat[2]+'/attributes',{ params: {sel:'many'} }); if(res.meta.status!==200){ return this.$message.error("获取商品参数数据失败!"); } console.log(res.data); //将里面的attr_vals参数由字符串修改为数组,以便于后面选择使用。 res.data.forEach(item=>{ //将字符串转换为按照空格分隔的数组 item.attr_vals = item.attr_vals.length==0?[]:item.attr_vals.split(' '); }); this.manyTableData = res.data; }}

其中的“this.manyTableData”在数据区定义:

data(){ return { //篇幅问题,上面定义的数据省略..... //商品参数列表数据 manyTableData: [] }},

上面我们通过API接口获取到了第一页商品ID对应的many类型的动态参数,打印出来就可以看到(第一页选择的是曲面电视,可以看到打印出曲面电视对应的参数信息):

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_vue.js_03

二、绘制商品参数面板样式

我们要将上一步获取的数据渲染到参数面板,实现下面的效果:

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_vue.js_04

我们找到商品参数的el-tab-pane面板,在里面添加item项:

<el-tab-pane label="商品参数" name="2"> <!-- 渲染表单的Item项 --> <el-form-item :label="item.attr_name" v-for="item in manyTableData" :key="item.attr_id"> <el-checkbox-group v-model="item.attr_vals"> <el-checkbox :label="cb" v-for="(cb,i) in item.attr_vals" :key="i"></el-checkbox> </el-checkbox-group> </el-form-item></el-tab-pane>

注:这里用到了checkbox,需要提前在element.js中引入CheckboxGroup和Checkbox组件对象。

这里我们需要先遍历item项,把获取到的参数名称全部罗列出来,然后将参数名称对应的所有参数项,通过el-checkbox多选框组空间,将多个选中的属性绑定到一个el-checkbox-group多选框组中进行保存。

效果:

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_vue.js_05

三、获取商品属性面板数据

我们要实现的效果:

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_checkbox-group_06

这里我们要先从后台获取该商品的所有参数信息,然后给它渲染到页面上。调用的API和第一节的是一样的,只需要将sel写死为“many”即可:

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_vue.js_07

上面我们定义了一个名为“tabClicked”的Tab点击事件,el-tabs下的所有el-tab-pane被点击都会触发该函数,而通过activeIndex可得知现在被点击的是哪个Tab,我们在tabClicked函数中处理activeIndex=3的逻辑,即通过API取静态属性数据,代码如下:

//Tab被点击后触发的函数async tabClicked(){ //通过activeIndex可得知现在被点击的是哪个Tab console.log(this.activeIndex); if(this.addForm.goods_cat[2]==null){ return this.$message.error("请先在第一页选择商品!"); } if(this.activeIndex=='2'){//如果当前被点击的是“商品参数”页签 //获取动态参数 console.log("商品参数面板"); const {data:res} = await this.$http.get('categories/'+this.addForm.goods_cat[2]+'/attributes',{ params: {sel:'many'} }); if(res.meta.status!==200){ return this.$message.error("获取商品参数数据失败!"); } console.log(res.data); //将里面的attr_vals参数由字符串修改为数组,以便于后面选择使用。 res.data.forEach(item=>{ //将字符串转换为按照空格分隔的数组 item.attr_vals = item.attr_vals.length==0?[]:item.attr_vals.split(' '); }); this.manyTableData = res.data; }else if(this.activeIndex=='3'){//如果当前被点击的是“商品属性”页签 //获取静态属性 console.log("商品属性面板"); const {data:res} = await this.$http.get('categories/'+this.addForm.goods_cat[2]+'/attributes',{ params: {sel:'only'} }); if(res.meta.status!==200){ return this.$message.error("获取商品属性数据失败!"); } console.log(res.data); this.onlyTableData = res.data; }}

注:这里做了个优化,将判断商品ID是否为空放在最前面,防止代码冗余。 其中的“this.manyTableData”在数据区定义:

data(){ return { //篇幅问题,上面定义的数据省略..... //商品参数列表数据 manyTableData: [], //商品属性列表数据 onlyTableData: [] }},

回到页面点击商品属性Tab页签,可以看到数据已经取到:

四、绘制商品属性面板样式

我们要将上一步获取的数据渲染到属性面板,实现下面的效果:

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_vue.js_08

我们找到商品属性的el-tab-pane面板,在里面添加item项:

<el-tab-pane label="商品属性" name="3"> <el-form-item :label="item.attr_name" v-for="item in onlyTableData" :key="item.attr_id"> <el-input v-model="item.attr_vals"></el-input> </el-form-item></el-tab-pane>

这里我们和上面一样,遍历onlyTableData数组,形成一个个的el-form-item和el-input。效果:

【VUE项目实战】53、商品添加功能(三)-商品参数及属性模块_tab-click_09

至此我们的商品参数和商品属性面板就完成了。 下一篇我们来完成商品图片模块的开发。

网友评论