最近公司启动了一个新的版本,我负责的一个的模块中有一个很复杂的新建的页面,表格里嵌套表格,三层数据,数据级联,组件较多.交互复杂,
下面是我做的一个简略图,为了保密我已将需求细节隐藏.(PS:没有table组件的墨刀,掩面苦笑,真难用)
从整个页面上分析,整体分为二部分,表单FA列表和表格TA
表单FA列表可以新增,删除,设为默认,其中一些表单项要求可以边输入边检索,选中选项后,自动将其他表单项填充
表格TA 首先是行内编辑,其次是行内的表单项之间存在级联关系,就是说,必须选中前一个行内表单,下一个表单项才有备选项,每个表单的备选项都是根据前面表单项变化而变化.
以上是表单TA的一条记录的行内编辑,这条记录的操作列有一个编辑按钮和删除按钮,点击编辑在此条记录的下方展示一个表单FB,
表单FB又包含一个表格TB和一个表单FC列表 表格TB可以增加记录,删除记录,记录中是行内编辑,编辑项也是级联的表单项
表达FC列表也是可以增删的. 表单FB有一个保存和取消按钮, 取消可以还原上次数据.
分析设计:背景和要求都介绍清楚了,下面我们来分析一个这个页面,
刚刚拿到这个页面设计图的时候真的是一脸懵逼,多个表格嵌套还不算难,但是点击表格中编辑操作在此条记录下显示编辑的表单,这个要怎么实现.因为每条记录都是用
闲话就聊到这里,我来说一下查的资料,我们使用的技术栈是vue,ele 于是我去看了一下ele的table组件,发现了这个
看了这种效果确实是可以实现的,于是F12开始分析表格结构
由此可见,在表格的tr中 第一个tr是正常的表格行,紧跟着的第二行是扩展表单,使用
接下来开始设计数据结构,别慌在这之前我想先谈一下前端数据驱动的页面设计
数据驱动:关于数据驱动有的人解释为:当数据发生变化的时候,用户界面发生相应的变化,开发者不需要手动的去修改dom
相比以往jquery那种拿到数据后再使用选择器,操作dom的方法渲染页面,数据驱动有很好的扩展性和效率,要想改变页面,直接操作数据,多一条,少一条都可以直接在页面上反应出来.这也是得益于目前前端框架的飞速发展.这种数据驱动的方法解放了前端开发人员的双手,很少再去使用append,inserBefore等方法去去操作dom,直接在数组push一条数据就能立即在页面上体现出来.大大提高了效率和可维护性,扩展性.同时对于复杂页面也要求开放人员有一定的数据接口知识.
数据结构:根据分析我设计的页面的大致数据结构为
const FAList = [] // FA表单列表对象const TATable = [{ // 正常tr对象formItem: {}, // 其他表单项expandContent: { // 扩展内容formItem: {}, // 其他表单项TBTable: [], // TB 表格数据FCForm: [] // FC 表单列表数据},expand: false, // 是否是扩展show: true // 是否显示},{ // 合并tr 扩展对象formItem: {}, // 其他表单项expandContent: { // 扩展内容formItem: {}, // 其他表单项TBTable: [{firstFormItem: '', // 选择的第一级数据secondFormItem: '', // 选择的第一级数据thirdFormItem: '', // 选择的第三级数据secondArr: [], // 备选的第二级数据thirdArr: [] // 备选第三级数据}], // TB 表格数据FCForm: [] // FC 表单列表数据},expand: true, // 是否是扩展show: true // 是否显示}] 第一条数据与第二条数据唯一的区别在expand属性,这个属性表示是否是扩展, 第二条始终是扩展对象,并且是否显示使用show这个属性来控制.由于每个级联的待选项都是独立的,所以直接将其设计到表单项里是比较稳妥的,虽然这会使数据对象庞大,更新缓慢,索引问题.
开发:到了实际开发的时候
使用
这段代码很重要,使用template标签做判断,在渲染时是不会渲染出来的,所以不会影响table的结构.由于数据层层嵌套所以在渲染的时候需要特别注意一下 关于索引的问题,在处理添加,删除的函数了必要要用到索引,要注意是用的那一层的索引,还是二层的索引都需要.索引的维护也是一件很头疼的事.
另外有的时候事件处理函数可以直接传递对象 如更改firstFormItem 第一级数据,需要动态更改修改第二级第三级相关的数据,这个是时候就可以在dom上这样注册事件
.... 直接将serviceItem传入到处理函数中,在处理函数中将第二级,第三级相关数据改变.这样页面也会刷新
在开发中还遇到了一个问题,让我重新思考vue框架的父子组件的传值方式是否能否扩展,这个问题是这样的
在表单FA列表中有一个这样的表单项,能够输入,能够选,选择一个后,需要将其他表单项自动填充,由于是表单列表,在选择后.必然需要在回调函数里确定是当前列表中的那个对象.但是子组件注册回调函数时却不能包含父组件的变量,而且也不能在函数名后加括号(),
第二种写法会报错.
最后实在没办法了,只能在点击子组件时获取索引保存起来,然后在选择后的回调函数中使用保存的索引找到要操作的对象进行更新数据.
不知道路过的大佬有什么好的办法,指点一下...... 这个问题可以总结为 在子组件的回调函数中如何添加父组件变量?
效果图:效果图等我做个简单demo在放吧,最近忙着赶产品经理修改的需求
总结:
数据结构真的很重要
在拒绝之前要有理由说服自己,这个确实不能实现 或许真就是你晋级的机会
设计的时候多考虑一下扩展性,因为你的产品经理很快就会改需求
想要超越自我,就去实现一个能根据机壳自动调整手机主题的功能,
谢谢阅读.如果觉得对你有帮助请记得点赞或收藏.欢迎留言讨论.你的支持是我出产优秀博客的动力.
Vue.js相关栏目本月热门文章
- 1【Linux驱动开发】设备树详解(二)设备树语法详解
- 2别跟客户扯细节
- 3Springboot+RabbitMQ+ACK机制(生产方确认(全局、局部)、消费方确认)、知识盲区
- 4【Java】对象处理流(ObjectOutputStream和ObjectInputStream)
- 5【分页】常见两种SpringBoot项目中分页技巧
- 6一文带你搞懂OAuth2.0
- 7我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:虚拟机与Java虚拟机介绍
- 8【Spring Cloud】新闻头条微服务项目:FreeMarker模板引擎实现文章静态页面生成
- 9JavaSE - 封装、static成员和内部类
- 10树莓派mjpg-streamer实现监控及拍照功能调试
- 11用c++写一个蓝屏代码
- 12从JDK8源码中看ArrayList和LinkedList的区别
- 13idea 1、报错java: 找不到符号 符号: 变量 log 2、转换成Maven项目
- 14在openwrt使用C语言增加ubus接口(包含C uci操作)
- 15Spring 解决循环依赖
- 16SpringMVC——基于MVC架构的Spring框架
- 17Andy‘s First Dictionary C++ STL set应用
- 18动态内存管理
- 19我的创作纪念日
- 20Docker自定义镜像-Dockerfile
热门相关搜索路由器设置 木托盘 宝塔面板 儿童python教程 心情低落 朋友圈 vim 双一流学科 专升本 我的学校 日记学校 西点培训学校 汽修学校 情书 化妆学校 塔沟武校 异形模板 西南大学排名 最精辟人生短句 6步教你追回被骗的钱 南昌大学排名 清朝十二帝 北京印刷学院排名 北方工业大学排名 北京航空航天大学排名 首都经济贸易大学排名 中国传媒大学排名 首都师范大学排名 中国地质大学(北京)排名 北京信息科技大学排名 中央民族大学排名 北京舞蹈学院排名 北京电影学院排名 中国戏曲学院排名 河北政法职业学院排名 河北经贸大学排名 天津中德应用技术大学排名 天津医学高等专科学校排名 天津美术学院排名 天津音乐学院排名 天津工业大学排名 北京工业大学耿丹学院排名 北京警察学院排名 天津科技大学排名 北京邮电大学(宏福校区)排名 北京网络职业学院排名 北京大学医学部排名 河北科技大学排名 河北地质大学排名 河北体育学院排名



