在elemenUI基础上,开发面板级联

news/2024/7/24 13:12:48 标签: vue.js

在elemenUI基础上,开发面板级联

最近开发的项目需要做图中左边这样的级联效果,但是elementUI提供的面板级联案例无法满足项目所需要的功能,所以自己手写一个

在这里插入图片描述
现附上代码记录一下,代码是静态页面,数据都是假的,并且有些数据绑定是随便绑定的一个值,交互没有做,纯粹记录一下

<template>
  <div class="campus">
    <el-row :gutter="24">
      <el-col :span="14">
        <div style="max-height: calc(100vh - 60px);background-color: #ffffff;overflow: auto">
          <div class="cascade_content">
            <div class="cascade_col">
              <div class="cascade_header">
              <span>院区 <el-button style="float: right; padding: 0;line-height: 57px" type="text"><i
                class="el-icon-search"></i></el-button></span>
                <span><el-button style="padding: 3px 0" type="text">新增</el-button>&nbsp;&nbsp;共计:{{campus.length}}</span>
              </div>
              <div class="cascade_item" v-for="(item,index) in campus" :key="index" :class="item.id===current.campus?'is-choose':''" @click="chooseItem('campus',item)">
                <div>{{item.name}}</div>
                <div>
                  <el-button style="padding: 3px 0;" type="text"><i
                    class="el-icon-edit"></i></el-button>
                  <el-button style="padding: 3px 0" type="text"><i
                    class="el-icon-delete"></i></el-button>
                </div>
              </div>
            </div>
            <div class="cascade_col">
              <div class="cascade_header">
              <span>建筑物 <el-button style="float: right; padding: 0;line-height: 57px" type="text"><i
                class="el-icon-search"></i></el-button></span>
                <span><el-button  v-show="building.length" style="padding: 3px 0" type="text">新增</el-button>&nbsp;&nbsp;共计:{{building.length}}</span>
              </div>
              <div class="cascade_item" v-for="(item,index) in building" :key="index" :class="item.id===current.building?'is-choose':''" @click="chooseItem('building',item)">
                <div>{{item.name}}</div>
                <div>
                  <el-button style="padding: 3px 0;" type="text"><i
                    class="el-icon-edit"></i></el-button>
                  <el-button style="padding: 3px 0" type="text"><i
                    class="el-icon-delete"></i></el-button>
                </div>
              </div>
            </div>
            <div class="cascade_col">
              <div class="cascade_header">
              <span>楼层 <el-button style="float: right; padding: 0;line-height: 57px" type="text"><i
                class="el-icon-search"></i></el-button></span>
                <span><el-button  v-show="floor.length" style="padding: 3px 0" type="text">新增</el-button>&nbsp;&nbsp;共计:{{floor.length}}</span>
              </div>
              <div class="cascade_item" v-for="(item,index) in floor" :key="index" :class="item.id===current.floor?'is-choose':''" @click="chooseItem('floor',item)">
                <div>{{item.name}}</div>
                <div>
                  <el-button style="padding: 3px 0;" type="text"><i
                    class="el-icon-edit"></i></el-button>
                  <el-button style="padding: 3px 0" type="text"><i
                    class="el-icon-delete"></i></el-button>
                </div>
              </div>
            </div>
            <div class="cascade_col">
              <div class="cascade_header">
              <span>房间 <el-button style="float: right; padding: 0;line-height: 57px" type="text"><i
                class="el-icon-search"></i></el-button></span>
                <span><el-button v-show="room.length" style="padding: 3px 0" type="text">新增</el-button>&nbsp;&nbsp;共计:{{room.length}}</span>
              </div>
              <div class="cascade_item" v-for="(item,index) in room" :key="index" :class="item.id===current.room?'is-choose':''" @click="chooseItem('room',item)">
                <div>{{item.name}}</div>
                <div>
                  <el-button style="padding: 3px 0;" type="text"><i
                    class="el-icon-edit"></i></el-button>
                  <el-button style="padding: 3px 0" type="text" ><i
                    class="el-icon-delete"></i></el-button>
                </div>
              </div>
            </div>
          </div>
        </div>

      </el-col>
      <el-col :span="10">
        <el-card class="right_box" shadow="never">
          <div slot="header" class="clearfix">
            <span class="header_title">房间信息</span>
            <template v-if="!isEdit">
              <el-button style="float: right; padding: 3px 0" type="text" @click="deleteTree"><i
                class="el-icon-delete"></i></el-button>
              <el-button style="float: right; padding: 3px 0;margin-right: 20px" type="text" @click="editRoomDetail"><i
                class="el-icon-edit"></i></el-button>
            </template>
            <template v-else>
              <el-button size="mini" style="float: right;" @click="editRoomDetail">取消</el-button>
              <el-button size="mini" style="float: right;margin-right: 10px" type="primary" @click="saveEdit">保存
              </el-button>
            </template>
          </div>
          <div class="text item">
            <el-form ref="form" :model="roomDetail" label-width="200px" size="mini" label-position="left">
              <div class="form_title">基础信息</div>
              <el-form-item label="房间名称">
                <span slot="label">房间名称 : </span>
                <el-input v-if="isEdit" v-model="roomDetail.name"></el-input>
                <span v-else class="value">{{roomDetail.name|| '-'}}</span>
              </el-form-item>
              <el-form-item label="房间编号">
                <span slot="label">房间编号 : </span>
                <el-input v-if="isEdit" v-model="roomDetail.num"></el-input>
                <span v-else class="value">{{roomDetail.num|| '-'}}</span>
              </el-form-item>
              <el-form-item label="房间类型">
                <span slot="label">房间类型 : </span>
                <el-select v-if="isEdit" v-model="roomDetail.type" placeholder="请选择">
                  <el-option  label="房间" value="房间"></el-option>
                  <el-option  label="区域" value="区域"></el-option>
                </el-select>
                <span v-else class="value">{{roomDetail.num|| '-'}}</span>
              </el-form-item>
              <el-form-item label="使用科室">
                <span slot="label">使用科室 : </span>
                <el-select v-if="isEdit" v-model="roomDetail.useType" placeholder="请选择">
                  <el-option  label="房间" value="房间"></el-option>
                  <el-option  label="区域" value="区域"></el-option>
                </el-select>
                <span v-else class="value">{{roomDetail.useType|| '-'}}</span>
              </el-form-item>
              <el-form-item label="面积">
                <span slot="label">面积:</span>
                <el-input v-if="isEdit" v-model="roomDetail.area"></el-input>
                <span v-else class="value">{{roomDetail.area|| '-'}}</span>
              </el-form-item>
              <el-form-item label="朝向">
                <span slot="label">朝向 : </span>
                <el-select v-if="isEdit" v-model="roomDetail.direction" placeholder="请选择">
                  <el-option  label="房间" value="房间"></el-option>
                  <el-option  label="区域" value="区域"></el-option>
                </el-select>
                <span v-else class="value">{{roomDetail.num|| '-'}}</span>
              </el-form-item>
              <div class="form_title">环境要求</div>
              <el-form-item label="额定温度(℃)">
                <span slot="label">额定温度()</span>
                <template v-if="isEdit">
                  <el-input-number v-model="roomDetail.minTemperature" controls-position="right"></el-input-number>~
                  <el-input-number v-model="roomDetail.maxTemperature" controls-position="right"></el-input-number>
                </template>
                <span v-else class="value">{{roomDetail.minTemperature}}~{{roomDetail.maxTemperature}}</span>
              </el-form-item>
              <el-form-item label="额定温度(℃)">
                <span slot="label">额定温度()</span>
                <template v-if="isEdit">
                  <el-input-number v-model="roomDetail.minHumidity" controls-position="right"></el-input-number>~
                  <el-input-number v-model="roomDetail.maxHumidity" controls-position="right"></el-input-number>
                </template>
                <span v-else class="value">{{roomDetail.minHumidity}}~{{roomDetail.maxHumidity}}</span>
              </el-form-item>
              <el-form-item label="额定气压(hPa)">
                <span slot="label">额定气压(hPa)</span>
                <template v-if="isEdit">
                  <el-input-number v-model="roomDetail.minPressure" controls-position="right"></el-input-number>~
                  <el-input-number v-model="roomDetail.maxPressure" controls-position="right"></el-input-number>
                  <div>注:1hPa = 100Pa</div>
                </template>
                <span v-else class="value">{{roomDetail.minPressure}}~{{roomDetail.maxPressure}}</span>
              </el-form-item>
              <el-form-item label="颗粒物(mg/m³)">
                <span slot="label">颗粒物(mg/)</span>
                <template v-if="isEdit">
                  <el-input-number v-model="roomDetail.minPressure" controls-position="right"></el-input-number>~
                  <el-input-number v-model="roomDetail.maxPressure" controls-position="right"></el-input-number>
                </template>
                <span v-else class="value">{{roomDetail.minPressure}}~{{roomDetail.maxPressure}}</span>
              </el-form-item>
              <el-form-item label="TVOC(mg/m³)">
                <span slot="label">TVOC(mg/)</span>
                <template v-if="isEdit">
                  <el-input-number v-model="roomDetail.minPressure" controls-position="right"></el-input-number>~
                  <el-input-number v-model="roomDetail.maxPressure" controls-position="right"></el-input-number>
                </template>
                <span v-else class="value">{{roomDetail.minPressure}}~{{roomDetail.maxPressure}}</span>
              </el-form-item>
              <el-form-item label="光照(lx)">
                <span slot="label">光照(lx)</span>
                <template v-if="isEdit">
                  <el-input-number v-model="roomDetail.minPressure" controls-position="right"></el-input-number>~
                  <el-input-number v-model="roomDetail.maxPressure" controls-position="right"></el-input-number>
                </template>
                <span v-else class="value">{{roomDetail.minPressure}}~{{roomDetail.maxPressure}}</span>
              </el-form-item>
              <el-form-item label="CO2浓度(mg/m³)">
                <span slot="label">CO2浓度(mg/)</span>
                <template v-if="isEdit">
                  <el-input-number v-model="roomDetail.minPressure" controls-position="right"></el-input-number>~
                  <el-input-number v-model="roomDetail.maxPressure" controls-position="right"></el-input-number>
                </template>
                <span v-else class="value">{{roomDetail.minPressure}}~{{roomDetail.maxPressure}}</span>
              </el-form-item>
              <el-form-item label="房间开门要求">
                <span slot="label">房间开门要求 : </span>
                <template v-if="isEdit">
                  <el-radio v-model="roomDetail.doorStatus" label="1">无要求</el-radio>
                  <el-radio v-model="roomDetail.doorStatus" label="2">常开</el-radio>
                  <el-radio v-model="roomDetail.doorStatus" label="3">常闭</el-radio>
                </template>
                <span v-else class="value">{{roomDetail.minPressure}}~{{roomDetail.maxPressure}}</span>
              </el-form-item>
            </el-form>
          </div>
        </el-card>
      </el-col>
    </el-row>
  </div>
</template>

<script>
  export default {
    name: "platform-campus",
    data() {
      return {
        isEdit: false,
        current:{
          campus:null,
          building:null,
          floor:null,
          room:null,
        },
        campus:[
          { id:1, name:'默认园区',}
        ],
        roomDetail: {},
        building:[ ],
        floor:[ ],
        room:[ ]
      }
    },
    methods: {
      chooseItem(item,data){
        this.current[item] = data.id
        if (item==='campus'){
          this.building=[
            { id:1, name:'住院部',},
            { id:2, name:'门诊楼',},
            { id:3, name:'检验科',},
            { id:4, name:'放射楼',},
          ]
        }
        if (item==='building'){
          this.floor=[
            { id:1, name:'1层',},
            { id:2, name:'2层',},
            { id:3, name:'2层',},
            { id:4, name:'2层',},
            { id:5, name:'2层',}
          ]
        }
        if (item==='floor'){
          this.room=[
            { id:1, name:'急救室',},
            { id:2, name:'ICU',},
            { id:3, name:'手术室',},
          ]
        }
      },
      editRoomDetail() {
        this.isEdit = !this.isEdit
      },
      deleteTree() {
        this.$message('删除科室')
      },
      saveEdit() {
        // 在这里提交修改
        this.editRoomDetail()
      }
    }
  }
</script>

<style scoped>
  .campus {
    margin: 5px 20px;
  }

  .header_title {
    font-size: 16px;
  }

  .cascade_header {
    width: 100%;
    height: 57px;
    display: flex;
    flex-direction: row;
  }

  .cascade_header {
    min-width: 210px;
    border-bottom: 1px solid #eee;
    font-size: 16px;
    line-height: 57px;
    display: flex;
    flex-direction: row;
    justify-content: space-between;
  }

  .cascade_header span {
    margin: 0 10px;
  }

  .cascade_header span a {
    font-size: 14px;
    color: #20a0ff;
  }

  .cascade_header span:nth-child(2) {
    font-size: 14px;
  }

  /deep/ .el-cascade-menu {
    width: 25%;
    /*min-width: 200px;*/
  }

  .cascade_content {
    border-top: 1px solid #eee;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    color: rgba(0,0,0,.65);;
  }

  .cascade_col {
    width: 25%;
    min-width: 210px;
    border-right: 1px solid #eee
  }

  .cascade_item {
    width: 100%;
    height: 44px;
    box-sizing: border-box;
    line-height: 44px;
    font-size: 14px;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    justify-content: space-between;
    border-bottom: 1px solid #eee;
  }
  .cascade_item div{
    margin: 0 10px;
  }
  .is-choose{
    background-color: #99d2fb;
  }

  .form_title{
    font-size: 16px;
    margin-bottom: 20px;
    color: rgba(0,0,0,.65);
    font-weight: bold;
  }
  /deep/ label {
    font-weight: normal;
  }
</style>


http://www.niftyadmin.cn/n/1181841.html

相关文章

[开发笔记]-winfom ListBox控件选中项上下移动排序

实现ListBox控件选中项上下移动重新排序功能 效果图&#xff1a; 移动后效果&#xff1a; 代码&#xff1a; /// <summary>/// 上移选中项/// </summary>/// <param name"sender"></param>/// <param name"e"></param>…

MM相关T-code

物料主檔建立物料 MM01更改物料 MM02顯示物料 MM03標示待刪除物料MM06更改物料類型MMAM物料清單查詢MM60延伸儲存位置MMSC大量上傳物料主檔ZMMT018分類系統 維護物料特性CT04維護物料類別CL02LED主檔上載特性值範圍表及Bin碼組合規則表 ZMMT001LED屬性維護 ZMMT002供應商建立供…

存储2006,一个并购的大时代?

存储2006&#xff0c;一个并购的大时代&#xff1f;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />2003年&#xff0c;EMC斥资30多亿美元&#xff0c;连续收购了Legato、VMWare和Documentum三家软件公司&#xff0c;从此开启了…

UPnP工作过程

UPnP在控制指针和被控制设备之间提供通讯功能。而网络介质、TCP/IP协议、HTTP仅提供基本的连接和IP地址分配。整个工作过程需要处理六个方面的内容&#xff0c;即设备寻址、发现设备、对设备的描述、设备控制、设备事件、设备表达。设备寻址&#xff1a;地址是整个UPnP系统工作…

vue后台路由动态配置

vueelementUI后台路由动态配置 做了好几个项目都需要根据用户角色做动态路由配置 1.现在附上页面的实现&#xff0c;其中根据路由表生成右侧复选框需要的数据&#xff0c;在改变复选框状态后&#xff0c;将已经勾选的路由名字传递给后台&#xff1b; 2.不同用户登录后&#…

performSelector:withObject:afterDelay: 精要概览(持续更新)

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; &#xff0d;&#xff0d;1&#xff0d;&#xff0d; 知识点&#xff1a;这个方法是单线程的&#xff0c;也就是说只有当前调用此方法的函数执行完毕后&#xff0c;selec…

delphi datetimppicker的使用

添加日期和时间在format属性中设置格式 yyyy-MM-dd HH:mm:ss 注意大小写&#xff0c;否则不准。在kind属性中&#xff0c;设置kind 为dtkdate.dtp_begin.DateTime : StrToDateTime(FormatDateTime(yyyy-MM-dd 00:00,Now())); dtp_end.DateTime : StrToDateTime(FormatDateTime(…

防火墙安装配置(准备)

cisco pix 515防火墙已到现场&#xff0c;公司安排俺配置防火墙。这下可就为难了。为什么需要防火墙&#xff1f;根据要求&#xff0c;防火墙应该怎么配置呢&#xff1f;虽然2003年配置过cisco路由器&#xff0c;可是&#xff0c;对路由器那已经有一个非常清楚的概念了&#xf…