初步设置
设置路由规则
传递商品id到Edit.vue
router/index.js中:
{ path: '/goods/edit/:id', component: Edit }
1
Edit.vue中:
data () {
return {
// 传递过来的 商品id
id: this.$route.params.id
}
}
List.vue中:
// 点击编辑按钮,跳转到编辑页面
editById (id) {
this.$router.push('/goods/edit/' + id)
}
2. 获取数据
1. 查询商品信息
async getGoodsInfo () {
const { data: res } = await this.$http.get('goods/' + this.id)
if (res.meta.status !== 200) {
return this.$message.error('获取商品信息失败!')
}
this.editForm = res.data
this.$message.success('获取商品信息成功!')
}
2. 获取商品分类数据
// 获取所有商品分类数据
async getCateList () {
const { data: res } = await this.$http.get('categories')
if (res.meta.status !== 200) {
return this.$message.error('获取商品分类数据失败!')
}
this.cateList = res.data
}
3. 获取商品参数列表和静态属性
// 当切换tab页签时触发的函数
async tabClicked () {
// console.log(this.activeIndex)
if (this.activeIndex === '1') {
// 访问的是 动态参数面板
const { data: res } = await this.$http.get(`categories/${this.cateId}/attributes`,
{
params: {
sel: 'many'
}
})
if (res.meta.status !== 200) {
return this.$message.error('获取动态参数列表失败!')
}
console.log(res.data)
res.data.forEach(item => {
item.attr_vals =
item.attr_vals.length === 0 ? [] : item.attr_vals.split(' ')
})
this.manyTableData = res.data
} else if (this.activeIndex === '2') {
// 访问的是静态属性面板
const { data: res } = await this.$http.get(`categories/${this.cateId}/attributes`,
{
params: {
sel: 'only'
}
})
if (res.meta.status !== 200) {
return this.$message.error('获取静态属性列表失败!')
}
console.log(res.data)
this.onlyTableData = res.data
}
}
3. 关于数据和图片的回显
1. 级联选择器数据回显
在getGoodsInfo ()这个函数中加入以下代码:
// 设置级联选择器绑定值
const tempList = res.data.goods_cat.split(',') // 这一步只是转化成了['1','3','6']
//每个数组成员都是字符,而不是数字
// 这里必须重新赋值为空数组,再赋值,否则v-model不能实现默认值回显
this.editForm.goods_cat = []
tempList.forEach(item => {
// item - 0是把数据类型转换为数字,以与cateList 数据类型一致,否则不能正确回显默认值
this.editForm.goods_cat.push(item - 0)
})
功能实现:
2. 点击编辑后图片回显
查询文档得知有一个属性file-list:
则进行绑定:
:on-preview="handlePreview"
:on-remove="handleRemove"
list-type="picture"
:headers="headerObj"
:file-list="uploadedList"
:on-success="handleSuccess">
最后,在getGoodsInfo ()这个函数中,循环editForm.pics中的每一项,把带有name和url属性的对象push到data节点下的picList:
// 将已上传的图片放入列表
this.editForm.pics.forEach(item => {
const obj =
{
name: item.pics_id + '.jpg',
url: item.pics_sma_url
}
this.uploadedList.push(obj)
})
查阅了官方文档发现,有name属性,才能够点击到图片名字,从而有预览效果
4. 编辑完成后点击提交按钮
文档里面是不需要传递分类id的,但是通过请求得到的信息“该商品未设置分类”,推测需要传递商品的分类id,并且类型是一个包括每一级分类,且用逗号“,”分割的字符串
// 点击修改商品按钮
edit () {
this.$refs.editFormRef.validate(async valid => {
if (!valid) {
return this.$message.error('请填写必要的表单项!')
}
const form = _.cloneDeep(this.editForm)
form.goods_cat = form.goods_cat.join(',')
// console.log(form)
const { data: res } = await this.$http.put('goods/' + form.goods_id, form)
if (res.meta.status !== 200) {
return this.$message.error('修改商品失败!')
}
this.$message.success('修改商品成功!')
this.$router.push('/goods')
})
}
编辑功能其实还差商品参数和静态属性还没完全弄好,经过了很久的尝试之后,我猜测后台有一些不周全的地方
如果一个商品是新添加的,那么我根据id查询得到的商品信息的参数/属性是以 空格 为分隔符的字符串
而如果是数据库中本来就存在的商品,我点击编辑按钮,通过id查询得到的信息的参数/属性 是以 逗号","为分隔符的字符串
加上我对elementui使用不熟练,目前,还无法完全实现这个功能,等日后有时间再进行完善。目前的进度,是能够做到成功修改商品基本信息,商品图片,商品描述三个部分。
Edit.vue完整代码如下:
label-position="top">
@tab-click="tabClicked"
v-model="activeIndex">
v-model="editForm.goods_cat"
:options="cateList"
expand-trigger="hover"
:props="cateProps"
@change="handleChange">
:key="i">
:key="item.attr_id">
:on-preview="handlePreview"
:on-remove="handleRemove"
list-type="picture"
:headers="headerObj"
:file-list="uploadedList"
:on-success="handleSuccess">
上一篇:费率低至0.01%!银行理财又现降费潮,10万理财一年管理费只需10元 银行理财纷纷宣布降费 银行理财降50%
下一篇:拟11.4亿元收购中科视界!富煌钢构跨界高速摄像行业,能否成为第二增长曲线? 富煌钢构收购中科视界成功率 富煌钢构收购中科视界多少钱