IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 手绘一个多级嵌套表单(计费标准) -> 正文阅读

[JavaScript知识库]手绘一个多级嵌套表单(计费标准)

需求是这样子的:

  • 甩了一个文档过来,为了后期可以修改数据,需要将表格实现在页面上
    在这里插入图片描述
  • 后端的数据是这样式的:
	{
  "data": {
    "table": {
      "headers": [
        "收费项目",
        "计算单位",
        "收费标准",
        "运行时间"
      ],
      "rows": [
        [
          "起步价",
          "2公里以内",
          "5元",
          "0-24时(全天)"
        ],
        [
          "2-10公里",
          "每公里",
          "2.2元",
          "白天6:00-21:00"
        ],
        [
          "2-10公里",
          "每公里",
          "2.5元",
          "晚上21:00-次日6:00"
        ],
        [
          "10-20公里",
          "每公里",
          "3元",
          "0-24时(全天)"
        ],
        [
          "20公里以上",
          "每公里",
          "由乘客和司机协商确定",
          "0-24时(全天)"
        ],
        [
          "候时费用",
          "每分钟",
          "0.5元",
          "0-24时(全天)"
        ]
      ],
      "title": "出租车运价"
    },
  }
}
  • 一行一行渲染过去并没有什么难度,直接数据v-for圈过去就好了,效果大概是这样
    在这里插入图片描述
  • 但是这样和正常的表格逻辑并不一样,一样的东西,应该合并起来呀!
  • 不啰嗦了,接下来是我的解决方法

解决方法

js 数据

  • 思路:(如果样式不一样的建议看)
  1. 将收费项目看成一项,一共就有五项,因此我们要拿到出一个长度为五的数组去遍历 在这里插入图片描述
    处理:现在的数组是有六项,因为中间有俩个相同(2-10公里),那我们来合并一下,将除了收费项目(第一项),其他的都合并在一起;然后你可以观察到,刚好要合并的这俩行中的计算单位,也是一样的,是不是也可以合并?
    脑子里浅画一下,图长这样:
    在这里插入图片描述
    问题来了,现在的数据长这样,要怎么合并?
	arr = [
				[ "2-10公里",  "每公里",  "2.2元",  "白天6:00-21:00" ],
      		    [ "2-10公里",  "每公里", "2.5元", "晚上21:00-次日6:00"],
    ]

观察一下上面的图,它是不是有点像 ?(想想想清楚,接下来要开始大乱斗了)
在这里插入图片描述
2. 现在可以明确,要生成五个项的数组,每项涵盖一个收费项目,每个收费项目中对应(一/多个)计算单位,每个计算单位对应(一/多个)收费标准,每个收费标准对应(一/多个)运行时间
在这里插入图片描述
转为数据, 将当前的六项的每一项内容包含了 name:收费项目(第一项)content ;content 又包含了name:'计算单位'content
以此类推

            let arr = [];
            list.forEach((item) => {
                let obj = {
                    name:item[0],
                    content:[{
                    name:item[1],
                    content:[{
                        name:item[2],
                        content: [{
                        name:item[3]
                        }]
                    }]
                    }]
                }
                arr.push(obj)
            });

在这里插入图片描述
然后开始合并:

 			let arrContent = [];//合并
            for(let i = 0;i < arr.length; i++){
                if(arr[i].name == arr[i-1]?.name){//name相同,合并content
                if(arr[i].content[0].name == arr[i-1].content[0].name){//第二级的name也相同,合并content
                    if(arr[i].content[0].content[0].name == arr[i-1].content[0].content[0].name){//第三级的name也相同,合并content
                        arrContent[arrContent.length-1].content[0].content[0].content.push(arr[i].content[0].content[0].content[0]);
                    }else{
                        arrContent[arrContent.length-1].content[0].content.push(arr[i].content[0].content[0]);
                    }
                }else{
                    arrContent[arrContent.length-1].content.push(arr[i].content[0]);
                }
                }else{
                    arrContent.push(arr[i])
                }
            }
            console.log("合并", arrContent);

在这里插入图片描述
数据到此就安排完毕,接下来是html 部分

html 部分

  • 刚刚生成的数组名称为 tableList, 嵌套遍历
	  <div v-for="(item, index) of tableList" :key="index" class="tableList">
            <span class="name">{{item.name}}</span>
            <div class="contentItem1">
                <div v-for="(item1, index1) of item.content" :key="index1" :class="'item1_'+index1" class='row1'>
                <span>{{item1.name}}</span> 
                <div class="contentItem2">
                    <div v-for="(item2, index2) of item1.content" :key="index2" :class="'item2_'+index2" class="row2">
                        <span>{{item2.name}}</span> 
                        <div class="contentItem3">
                            <div v-for="(item3, index3) of item2.content" :key="index3" :class="'item3_'+index3" class='row3'>
                                <span>{{item3.name}}</span> 
                            </div>  
                        </div>
                        
                    </div>  
                </div>
                
                </div>  
            </div>
            
      </div>

css部分

  • css 部分是比较麻烦的,比起数据转化,这里花费的时间更多,先贴代码,下次有空再补解析
  .tableList{
    display: flex;
    width: 360px;
    margin: auto;
    text-align: center;
    align-items: center;
    border-bottom:1px solid;
    border-left: 1px solid;
    border-right: 1px solid;
    .item1_0,.item2_0,.item3_0{
        display: inline;
    }  
    .row1,.row2{
      display: flex;
      align-items: center;
      border-left: 1px solid;
      
    }
    .row3{
      border-left: 1px solid;
    }
    .row2{
      border-top: 1px solid;
    }
    .item2_0{
      border-top: 0px solid;
    }
    .contentItem2,
    .contentItem3{
      display: flex;
      flex-direction: column;
    }
    span{
      display: table-cell;
      width: 90px;
      text-align: center;
      margin: auto;
    }
  }

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:31:32  更:2022-05-09 12:35:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:26:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码