vue+element-ui实现表格里嵌套表格

 

效果图:点击某行数据展开另一个嵌套在里面的table

核心代码:

从后台请求的数据格式:

代码实现:

<template>
  <div>
    <div class="assetnum">
      <div class="assetbox br pr30">
        <div class="assettitle">
          <span>
            已发现资产(数量:
            <strong>{{tableData2.length}}</strong>)
          </span>
        </div>
        <div class="mytable">
          <el-table ref="table2" :data="tableData2" style="width: 100%">
            <el-table-column width="50">
              <template slot-scope="scope">
                <i class="iconfont icon-tubiaozhizuomoban" @click="toogleExpand2(scope.row)"></i>
              </template>
            </el-table-column>
            <el-table-column class="sectable" prop="items" type="expand" width="1">
              <template slot-scope="scope">
                <el-table :data="scope.row.items" stripe style="width: 100%">
                  <el-table-column type="index"></el-table-column>
                  <el-table-column prop="port" label="端口"></el-table-column>
                  <el-table-column prop="protocol" label="协议"></el-table-column>
                  <el-table-column prop="service" label="服务"></el-table-column>
                  <el-table-column prop="software" label="软件"></el-table-column>
                </el-table>
              </template>
            </el-table-column>
            <el-table-column label="IP" prop="ip">
              <template slot-scope="scope">
                <span class="ipbtn">IP</span>
                {{scope.row.ip}}
              </template>
            </el-table-column>
            <el-table-column label="资产类型" prop="catagory">
              <template slot-scope="scope">
                <span v-if="scope.row.catagory=='host'">
                  <i class="iconfont icon-zhuji1"></i>
                </span>
                <span v-if="scope.row.catagory=='db'">
                  <i class="iconfont icon-weibiaoti-database"></i>
                </span>
                {{scope.row.catagory}}
              </template>
            </el-table-column>
            <el-table-column label="标准系统" prop="type">
              <template slot-scope="scope">
                <span v-if="scope.row.type=='windows'">
                  <img src="../../../../assets/img/windows.png" alt />
                </span>
                <span v-if="scope.row.type=='RedHat'">
                  <img src="../../../../assets/img/redhat.png" alt />
                </span>
                <span v-if="scope.row.type=='mysql'">
                  <img src="../../../../assets/img/Oracle.png" alt />
                </span>
                <span v-if="scope.row.type=='CentOS'">
                  <img src="../../../../assets/img/centos.png" alt />
                </span>
                {{scope.row.type}}
              </template>
            </el-table-column>
          </el-table>
        </div>
      </div>
      <div class="assetbox pl30">
        <div class="assettitle">
          <span>
            不存活资产(数量:
            <strong>{{tableData3.length}}</strong>)
          </span>
        </div>
        <div class="mytable">
          <el-table ref="table" :data="tableData3" style="width: 100%">
            <el-table-column width="50">
              <template slot-scope="scope">
                <i class="iconfont icon-tubiaozhizuomoban" @click="toogleExpand(scope.row)"></i>
              </template>
            </el-table-column>
            <el-table-column class="sectable" type="expand" width="1">
              <template>
                <el-table :data="tableData3.items" stripe style="width: 100%">
                  <el-table-column type="index"></el-table-column>
                  <el-table-column prop="port" label="端口"></el-table-column>
                  <el-table-column prop="xy" label="协议"></el-table-column>
                  <el-table-column prop="server" label="服务"></el-table-column>
                  <el-table-column prop="software" label="软件"></el-table-column>
                </el-table>
              </template>
            </el-table-column>
            <el-table-column label="IP" prop="ip">
              <template slot-scope="scope">
                <span class="ipbtn">IP</span>
                {{scope.row.ip}}
              </template>
            </el-table-column>
            <el-table-column label="资产类型" prop="catagory">
              <template slot-scope="scope">
                <span v-if="scope.row.catagory=='host'">
                  <i class="iconfont icon-zhuji1"></i>
                </span>
                <span v-if="scope.row.catagory=='db'">
                  <i class="iconfont icon-weibiaoti-database"></i>
                </span>
                {{scope.row.catagory}}
              </template>
            </el-table-column>
            <el-table-column label="标准系统" prop="type">
              <template slot-scope="scope">
                <span v-if="scope.row.type=='windows'">
                  <img src="../../../../assets/img/windows.png" alt />
                </span>
                <span v-if="scope.row.type=='RedHat'">
                  <img src="../../../../assets/img/redhat.png" alt />
                </span>
                <span v-if="scope.row.type=='Oracle'">
                  <img src="../../../../assets/img/Oracle.png" alt />
                </span>
                <span v-if="scope.row.type=='CentOS'">
                  <img src="../../../../assets/img/centos.png" alt />
                </span>
                {{scope.row.type}}
              </template>
            </el-table-column>
          </el-table>
        </div>
      </div>
      <div></div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      value2: [],
      value3: [],
      tableData2: [],
      tableData3: [],
    };
  },
  activated() {
    this.getDataList();
  },
  methods: {
    toogleExpand(row) {
      let $table = this.$refs.table;
      $table.toggleRowExpansion(row);
    },
    toogleExpand2(row) {
      let $table = this.$refs.table2;
      $table.toggleRowExpansion(row);
      console.log(this.$route.params.taskId)
    },
    getDataList(){
      //获取上一层页面点击要查看的任务ID
      var ids = this.$route.params.taskId;
      //发送请求给后台
      this.$http({
        url: this.$http.adornUrl("/ads/task/detail"),
        method: "get",
        params: this.$http.adornParams({
          taskId: ids
        })
      }).then(({ data }) => {

        if (data && data.code === 0) {
          let arr1 = data.data;
          let hadData = [];
          let noData = [];
          //对获取的数据利用status判断进行分类,再放进两个不同的数组中
          arr1.map(function(item,index){
            if(item.status == 1){
              hadData.push(item)
            }else{
              noData.push(item)
            }
          })
          //赋值给已发现资产
            this.tableData2 = hadData ;
          //赋值给不存活资产
            this.tableData3 = noData ;
            console.log(this.tableData2)
        } else {
        }
      });
    }
  }
};
</script>

 

  • 19
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Vue Element是一个基于Vue.js框架构建的UI组件库,提供了丰富的组件,方便开发者构建各种交互界面。要实现SKU表格,可以借助Vue Element的Table组件和选择器组件。 首先,需要准备好SKU的数据结构,包括SKU的属性以及对应的值。可以使用一个嵌套的数组来表示,例如: ``` [ { name: '颜色', values: ['红色', '蓝色', '绿色'] }, { name: '尺码', values: ['S', 'M', 'L'] } ] ``` 接下来,在Vue组件中使用Table组件来展示SKU表格。可以使用v-for指令循环遍历SKU的属性和值,生成表头和表格数据。同时,可以给每个单元格添加选择器组件来选择对应的属性值。 示例代码如下: ```html <template> <el-table :data="tableData"> <el-table-column v-for="attr in attributes" :key="attr.name" :label="attr.name" > <template slot-scope="scope"> <el-select v-model="scope.row[attr.name]" placeholder="请选择"> <el-option v-for="value in attr.values" :key="value" :label="value" :value="value"></el-option> </el-select> </template> </el-table-column> </el-table> </template> <script> export default { data() { return { attributes: [ { name: '颜色', values: ['红色', '蓝色', '绿色'] }, { name: '尺码', values: ['S', 'M', 'L'] } ], tableData: [] }; }, created() { // 生成SKU表格数据 const skuData = this.generateSkuData(this.attributes); this.tableData = skuData; }, methods: { generateSkuData(attributes) { // 根据属性生成表格数据 const skuData = []; const rowLength = attributes.reduce((acc, curr) => acc * curr.values.length, 1); for (let i = 0; i < rowLength; i++) { const rowData = {}; let remain = i; attributes.forEach(attr => { const valueIndex = remain % attr.values.length; rowData[attr.name] = attr.values[valueIndex]; remain = Math.floor(remain / attr.values.length); }); skuData.push(rowData); } return skuData; } } }; </script> ``` 通过上述代码,可以实现一个基于Vue Element的SKU表格。每个单元格都可以通过选择器组件选择对应的属性值,从而构建SKU表格。当选择器的值发生改变时,可以通过监听事件获取到最新的SKU数据。这样,就可以根据选择器的值进行相应的业务操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值