11-14. 对象数据类型 多层级列表渲染及--怎么去简化代码

上一章进度

复制代码
取二级数据 渲染默认值 这是上一章的进度,也就意味着初始化结束
也可以说 组件挂载之后的要展示的内容 的逻辑处理完毕了

1.点击一级 切换二级默认 展示的图表

  • 首先查看文档得知 tabs有一个事件 它的参数在这里是没有用到 翻译过来一个是 选项卡窗格上下文(单项内容所处的的环境) 第二个是事件对象,触发事件的 相关数据 在哪里触发的-什么形式触发的,触发体身上还有什么属性等等

这里从糖果切换到干果之后会 tabs 会自动的将 el-tab-pane 也就是每一项零食类型的 名字(糖果、干果..)存到 value上去

  • 我要做的是判断 现在展示的是哪一项数据 以便取出表格数据进行渲染

    • 将 value 与 titleList1 (品种名字组成的列表)里面与他相似的
  • 它和做初始化的逻辑是一样的,基本可以照搬。

  • 只不过触发条件 一个是 组件挂载完毕,一个是手动触发。

    代码如下

kotlin 复制代码
js
复制代码

    handleClick() {
      this.titleList1.forEach((item,index)=>{
        if(item == this.value){
          let t2 = this.titleContent1[index]; 
            this.titleList2 = Object.keys(t2);// 那它就是二级 titleList
            this.titleContent2 = Object.values(t2);// 二级内容数据 用来显示/查找三级
            console.log(this.titleList2,'8888888888888888888888888888888');
            // 设默认值是第一项
            // 这里取到的是2013 2014等日期,我们把它设置为图表的 柱标
            this.chartOption.xAxis.data = Object.keys(this.titleContent2[0]);
            console.log(Object.keys(this.titleContent2[0]),'============================================');
            // 这里取到的是对应 2013数据 2014数据 等
            this.chartOption.series.data = Object.values(this.titleContent2[0]);

            this.value2 = this.titleList2[0]
        }
      })

    },
  • 这是我用上边的代码实现之后的,数据确实有变化 但是图表是坍缩的,这个也很好解决 放大缩小一下窗口就好了,至于为什么我明天说。

二级点击事件

  • 经过上面的数据显示不同,证明我们的切换确实是成功的
  • 一级照搬 二级呢,不过是多个判断 操作也一样
  • 1.找到要渲染的数据-这个找到不仅仅指的是我们知道要给哪一项,也要体现在代码上
  • 这里我又阐述一遍 这一步的原因
    • // 首先 要先循环一级,就像我要买矿泉水知道要去饮品区一样
    • // 因为二级的数据被包裹在 某一项一级里面
    • // 在 titleList1里 与当前 value 一致索引的 titleContent2 数据,就是我们要去匹配的二级
    • // 走了这一步我们就相当于进入了 饮品区
  • 找到了饮品区 ,与value2 这个便签,看看我们要找的是什么 打印this.value2
  • 点击 标题就可以获得,能获得就能拿去对比
  • 既然没问题,先把代码奉上。
js 复制代码
    handle2Click() {
      // 首先 要先循环一级,就像我要买矿泉水知道要去饮品区一样
      // 因为二级的数据被包裹在 某一项一级里面
      // 在 titleList1里 与当前 value 一致索引的 titleContent2 数据,就是我们要去匹配的二级
      // 走了这一步我们就相当于进入了 饮品区
      this.titleList1.forEach((item,index)=>{
        if(item == this.value){
        // console.log(item,this.value,'??{{??{{??{{---------------------------------}}}}}}');
        // 糖果 糖果 ??{{??{{??{{---------------------------------}}}}}}
        // 看来这里就是饮料区了 让我看看我要买什么 this.value2
        // console.log('我要找什么? value2是什么',this.value2);
        // 在初始化的时候存了个2级的内容,当一级改变的时候 也有存
          this.titleList2.forEach((item,index)=>{// 也一样 看title是否与 value2一致
            // 现在开始观察呢个是我们(this.value2) 一样的
            if(item == this.value2){
              console.log('一样吗???',item,this.value2,'+++++_____+++++');
              // 一样就拿数据渲染
              // 这里取到的是2013 2014等日期,我们把它设置为图表的 柱标
              this.chartOption.xAxis.data = Object.keys(this.titleContent2[index]);// 这里换成索引对应的数据
              // console.log(Object.keys(this.titleContent2[0]),'============================================');
              // 这里取到的是对应 2013数据 2014数据 等
              this.chartOption.series.data = Object.values(this.titleContent2[index]);
            }

          })
        }
      })
  
    },

简化代码

  • 1.同一个功能一样,多个地方都用到
    • 比如上述代码中初始化 和点击一级的操作都一样
js 复制代码
    async getList(){// 初始化
      // 我们通过发请求,拿到了数据,并赋值给了 objData
      let data = await axios.get("/web/getList")
      this.objData = data.data
      console.log(this.objData);
      // 解析出来渲染一级 标题的数据
      this.titleList1 =  Object.keys(this.objData);// 得到 ['糖果', '干果', '饮品']
      this.titleContent1 = Object.values(this.objData)// 得到1级 value
        // 首先设置 一级title的默认值
        this.value = this.titleList1[0];


        this.titleList1.forEach((item,index)=>{
          // 如果 列表的值与 value(默认值)相同取出下一级
          if(item == this.value){
            let t2 = this.titleContent1[index]; 
            this.titleList2 = Object.keys(t2);
            this.titleContent2 = Object.values(t2);
            this.chartOption.xAxis.data = Object.keys(this.titleContent2[0]);
            this.chartOption.series.data = Object.values(this.titleContent2[0]);
            this.value2 = this.titleList2[0]
          }
        })
        
    },
    handleClick() { // 点击事件
      this.titleList1.forEach((item,index)=>{
        if(item == this.value){
          let t2 = this.titleContent1[index]; 
            this.titleList2 = Object.keys(t2);
            this.titleContent2 = Object.values(t2);
            this.chartOption.xAxis.data = Object.keys(this.titleContent2[0]);
            this.chartOption.series.data = Object.values(this.titleContent2[0]);
            this.value2 = this.titleList2[0]
        }
      })

    },
  • 2.重复项数据不一样,操作一样
    • 比如上述代码中都需要对 图表数据重新赋值
    • this.chartOption.xAxis.data = Object.keys(this.titleContent2[0]); this.chartOption.series.data = Object.values(this.titleContent2[0]);
  • 像第一点: 点击事件 可以先把 重复代码提取出来,放进一个函数里,直接调用
js 复制代码
 methods: {
    async getList(){// 初始化
      // 我们通过发请求,拿到了数据,并赋值给了 objData
      let data = await axios.get("/web/getList")
      this.objData = data.data
      console.log(this.objData);
      // 解析出来渲染一级 标题的数据
      this.titleList1 =  Object.keys(this.objData);// 得到 ['糖果', '干果', '饮品']
      this.titleContent1 = Object.values(this.objData)// 得到1级 value
        // 首先设置 一级title的默认值
        this.value = this.titleList1[0];
        this.setList1()
    },
    handleClick() { // 点击事件
    
      this.setList1()
    },
    handle2Click() {
      this.titleList1.forEach((item,index)=>{
        if(item == this.value){
          this.titleList2.forEach((item,index)=>{
            if(item == this.value2){
              this.chartOption.xAxis.data = Object.keys(this.titleContent2[index]);
              this.chartOption.series.data = Object.values(this.titleContent2[index]);
            }
          })
        }
      })
    },
    setList1(){
      this.titleList1.forEach((item,index)=>{
        if(item == this.value){
          let t2 = this.titleContent1[index]; 
            this.titleList2 = Object.keys(t2);
            this.titleContent2 = Object.values(t2);
            this.chartOption.xAxis.data = Object.keys(this.titleContent2[0]);
            this.chartOption.series.data = Object.values(this.titleContent2[0]);
            this.value2 = this.titleList2[0]
        }
      })
    }
  },
  • 代码没问题 可以正常使用

  • 接下来是第二点: 重复项数据不一样,操作一样

  • 也一样 先把那两行代码提出来

  • 提取前我们看看他们的不同处,显然是 赋值后面的值的索引,不同。

  • 不知道怎么处理可以带入情境 将不同处作为传值的坑位 再重头捋一遍

  • 初始化时取默认值,这时候数据都是取得第一项也就是数据的0项里的数据的0项,那在这里我们传的值是0

  • 没问题 如法炮制 把二级事件的换了-也是没有问题

js 复制代码
  handle2Click() {
     this.titleList1.forEach((item,index)=>{
       if(item == this.value){
         this.titleList2.forEach((item,index)=>{
           if(item == this.value2){
             this.editOption(index)
           }
         })
       }
     })
   },

只不过初始化的时候一个死值还穿来穿去,不如设个默认值

ok完美 睡觉!!!!

简化后的代码

js 复制代码
<template>
  <div class="box">
    <h2>el-tabs 渲染</h2>
    <el-tabs v-model="value" @tab-click="handleClick">
      <el-tab-pane style="height: 400px" v-for="(item,index) in titleList1" :key="index"
        :label="item"
        :name="item"
      >
        <el-tabs v-model="value2" @tab-click="handle2Click">
          <el-tab-pane v-for="(arrItem,index) in titleList2" :key="index"
            :label="arrItem"
            :name="arrItem"
          >
            <Chart class="chartHeight"
              :option="chartOption"
            />
          </el-tab-pane>
        </el-tabs>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>

<script>
import axios from 'axios';
import Chart from "../../components/Chart.vue";
export default {
  name: "RenderingForObjectForm",
  data() {
    return {
       chartOption: {
         xAxis: { data: [] },
         series: {
           type: "line",
           smooth: true,
           data: [],
         },
       },
      objData:{},
      // 渲染一级 标题的数据
      titleList1:[],
      // 一级 标题对应的数据
      titleContent1:[],
      titleList2:[],
      titleContent2:[],
      value: "",
      value2:"",
    };
  },
  mounted(){
    // 我是用了mock
    this.getList();//获取数据 的方法
  },
  methods: {
    async getList(){// 初始化
      // 我们通过发请求,拿到了数据,并赋值给了 objData
      let data = await axios.get("/web/getList")
      this.objData = data.data
      console.log(this.objData);
      // 解析出来渲染一级 标题的数据
      this.titleList1 =  Object.keys(this.objData);
      this.titleContent1 = Object.values(this.objData);
        // 首先设置 一级title的默认值
        this.value = this.titleList1[0];
        this.setList1()
    },
    handleClick() { // 点击事件
      this.setList1()
    },
    handle2Click() {
      this.titleList1.forEach((item,index)=>{
        if(item == this.value){
          this.titleList2.forEach((item,index)=>{
            if(item == this.value2){
              this.editOption(index)
            }
          })
        }
      })
    },
    setList1(){
      this.titleList1.forEach((item,index)=>{
        if(item == this.value){
          let t2 = this.titleContent1[index]; 
            this.titleList2 = Object.keys(t2);
            this.titleContent2 = Object.values(t2);
            this.editOption()
            this.value2 = this.titleList2[0]
        }
      })
    },
    editOption( index = 0){
      this.chartOption.xAxis.data = Object.keys(this.titleContent2[index]);
      this.chartOption.series.data = Object.values(this.titleContent2[index]);
    }
  },
  components: { Chart },
};
</script>

<style scoped lang="less">
.chartHeight {
  height: 300px;
  width: 100%;
}
</style>
相关推荐
秋意钟5 分钟前
Element UI日期选择器默认显示1970年解决方案
前端·javascript·vue.js·elementui
我命由我1234542 分钟前
微信小程序 - 自定义实现分页功能
前端·微信小程序·小程序·前端框架·html·html5·js
程序员黄同学1 小时前
请谈谈 Vue 中的 key 属性的重要性,如何确保列表项的唯一标识?
前端·javascript·vue.js
繁依Fanyi2 小时前
巧妙实现右键菜单功能,提升用户操作体验
开发语言·前端·javascript·vue.js·uni-app·harmonyos
前端御书房2 小时前
前端防重复请求终极方案:从Loading地狱到精准拦截的架构升级
前端·javascript
web182854825122 小时前
nginx 部署前端vue项目
前端·vue.js·nginx
zy0101012 小时前
HTML标签
前端·css·html
程序员黄同学2 小时前
解释 Vue 中的虚拟 DOM,如何通过 Diff 算法最小化真实 DOM 更新次数?
开发语言·前端·javascript
蓝谷芮济2 小时前
二:前端发送POST请求,后端获取数据
前端
果粒chenl2 小时前
css+js提问
前端·javascript·css