2

vue大型电商项目尚品汇(后台篇)day03 - Heymar-10

 2 years ago
source link: https://www.cnblogs.com/heymar/p/16387208.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

今天把平台属性的管理基本完成了,后台管理做到现在基本也开始熟悉,确实就是对ElementUI的一个熟练程度。

一.平台属性管理

1.动态展示数据

先把接口弄好,应该在第三级标题选择后进行发请求

2680817-20220617222725000-227841686.png

静态页面搭建

2680817-20220617222725321-1376136216.png

2680817-20220617222725571-1482598131.png

属性值列表,用到一个新组件 tag,并且这里有多个属性值,所以要遍历,既然要在里面加标签那就要用slot,最后添加两个图标

2680817-20220617222725776-470021966.png

2680817-20220617222726028-2060431342.png

2.添加与修改属性(静态)

点击添加修改应该将下面的表格组件隐藏出来一个新的组件

2680817-20220617222726270-1045647879.png

如果没有选择到三级分类的时候,添加属性按钮应该不可点

新的页面布局

2680817-20220617222726734-1968881373.png

2680817-20220617222726977-724630049.png

点击取消应该回到列表展示界面

2680817-20220617222727209-658208112.png

3.收集平台属性

首先我们的接口需要的数据,这里要注意我们categoryId是收集categoty3的id,但是这里不能用this.category3Id因为data里面数据声明赋值是乱序的,所以会出现undefined

2680817-20220617222727452-667147882.png

先收集属性名

2680817-20220617222727669-1958361128.png

在收集属性值

table数据指向子级list,属性值应该为一个input框收集内容

2680817-20220617222727901-445358522.png

默认进来应该为空只有当点击添加才会出现,那么应该给子级list里面的长度为0,因为table绑定的这个数据,当我们点击新增再去push

注意id应该为undefined,因为我们只是占位,添加过后给到后端,他才会赋值你的id

2680817-20220617222728143-2034149330.png

当我们属性名没有内容时,新增属性值按钮应该为disabled

2680817-20220617222728384-1733269120.png

2680817-20220617222728614-1922840992.png

2680817-20220617222728872-1793378479.png

4.返回按钮数据回显问题

当点击取消,再点击添加属性,我们刚才编辑的内容还在

就是添加属性进来应该清空一下内容

2680817-20220617222729116-1907719884.png

并且顺便还可以把3Id在这里收集了

2680817-20220617222729351-712946352.png

5.修改属性操作(面试重点深浅拷贝复习)

点击修改按钮,把传进来的row参数直接赋值给

2680817-20220617222729581-619782870.png

但是这里会有问题,当我们修改了内容不点保存点击取消,会发现新的内容会保存下来,其原理跟前面指向问题那里一样,因为row是服务器返回来的数据,我们的table也基于这个数据在渲染,你现在点击修改将baseAttrInfo赋值给了row,相当于table渲染的数据和baseAttrInfo都指向了同一个数组,所以在内存里面要修改都会被修改

2680817-20220617222729802-1260263947.png

先回顾一下深浅拷贝,这两个必须达到手写出来的程度

浅拷贝,也可以利用es6语法object.assign方法来实现,前面参数老对象后面参数新对象,还可以使用之前用的方法{...obj}扩展运算符出来,又赋值一个新对象

一定要注意浅拷贝只拷贝一层,深层次的内容只拷贝引用,意思就是新对象可以得到这个内容,但是由于只是引用所以新对象修改,老对象深层次的内容也会被修改

2680817-20220617222730054-1202204084.png

然后是深拷贝,他就是可以拷贝多层,而且深层次的内容开辟新的空间,各管各的,要实现深拷贝用到一个核心内容就是递归

2680817-20220617222730314-1889876751.png

所以回到项目上面来,我们这里这个数据能像之前那样直接使用浅拷贝吗

2680817-20220617222730585-669307015.png

很明显涉及到深层次数据了,所以这里直接用深拷贝,用到lodash的深拷贝

2680817-20220617222731030-485293763.png

6.查看模式与修改模式切换

当点击修改进来attrId应该为当前这个属性的id

2680817-20220617222731236-1915401007.png

所以我新增的这个属性也应该有id,这样当我们的如果是修改进入就是这个id,如果是直接新增一个新的属性,那么没有这个id值就为undefined

2680817-20220617222731453-403878158.png

什么叫做查看模式与修改模式

当我点击添加应该有一个input框当我失去焦点应该转为一个span来呈现,两者势不两立应该用v-if和v-else来展示

2680817-20220617222731667-313750337.png

注意这里并不能统一在data定义一个flag来作为切换的依据,因为如果都用它那么当我有多条数据的时候,我切换就变成了全部一起切换了

这里有个技巧就是,当我在push一条新数据,点击添加新对象的时候,给每一条数据单独添加一个flag

2680817-20220617222731916-1118885680.png

2680817-20220617222732150-255778755.png

失去焦点、以及回车都会切换到查看模式,注意这里是组件标签所以系统事件也是自定义事件要先加native再加enter才行

2680817-20220617222732412-670348106.png

然后是查看模式双击事件切换到修改模式

2680817-20220617222732623-250511878.png

注意事项:

  • 一个是如果我们输入的空白值不允许保存切换

2680817-20220617222732838-407103302.png

2680817-20220617222733065-36967699.png

  • 还有一个问题就是,如果是重复的值也不能切换,这里用some方法来做,some和every的区别回顾一下,还有这里有个问题,我们对当前子级list做一个遍历,而且逻辑是写在blur里面的,所以这个时候我们新的数据,也就是row已经生成,那么我们some就会遍历到他,那么你在里面判断的时候应该排除掉他,不然的话每一个item进来永远都有一个相等的

    2680817-20220617222733305-14326627.png

7.修改按钮的查看与编辑切换

当我们点击修改按钮进入属性操作,会发现无法进行查看与编辑的切换,也很正常,刚才添加flag完全是在添加属性这个按钮里面做的

所以我们就需要给修改按钮的回调做一些操作

2680817-20220617222733575-1616801435.png

如果像这样做确实能添加上flag但并不会触发视图更新,因为我们前面的flag是通过push添加进行的,能够被vue检测到,而且还是响应式数据,而我们这里直接加入进来,一个普通的数据并不会被vue检测到改变,所以也就不会去重新解析模板,这里的做饭就是用$set添加响应数据即可

2680817-20220617222733795-784174629.png

8.表单元素自动聚焦

核心思想是给每个input打ref,而且值为$index,当我们从span切换到编辑的这个事件中,可以传入这个时候index,也就是当前的input,利用nextTick就可以让切换过后的input马上聚焦

2680817-20220617222734028-1344803775.png

因为index是动态参数所以这里对象只能采用【】这种形式

2680817-20220617222734287-1817515382.png

然后就是我们每一次点击新增属性也应该聚焦,而且是聚焦最后一个

2680817-20220617222734499-1936886033.png

9.删除属性值

用到一个新组件气泡框 Popconfirm

2680817-20220617222734732-1919943105.png

注意一下,这里模板用的elementUI是2.13.2版本,官网是最新版本,所以对于气泡框的事件名有出入

2680817-20220617222734951-218934163.png

注意splice方法

2680817-20220617222735180-62167878.png

10.保存操作

平台属性最后一步就是编辑完成保存操作,在这一步准备发请求了,但是在发请求之前要先整理一下参数

首先我们的参数要确保不能有空的内容

2680817-20220617222735397-502704182.png

另外就是我们的请求的参数数据是不需要flag还要把他删除了,直接delete可以删除对象的属性

2680817-20220617222735645-599646178.png

然后就可以发请求

2680817-20220617222735862-1018782139.png

__EOF__

本文作者: Heymar 本文链接: https://www.cnblogs.com/heymar/p/16387208.html 关于博主: 评论和私信会在第一时间回复。或者直接私信我。 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK