vue在表格中创建多个三级联动并实现增加、删除行

35 篇文章 1 订阅

效果如下:

其中区块、一级、二级、是属于三级联动,计划量、计划开始时间、计划结束时间是三级联动的数据,不能修改

后面的变更开始、结束时间可以修改,但做了限制,结束时间不能在开始时间之前

 

HTML代码:

<div>
    <div style="padding-bottom:10px">
      <el-button type="primary" @click="insertEvent(-1)">插入一行</el-button>
      <el-button type="primary" @click="removeCheckboxRow">删除选中</el-button>
    </div>

    <el-table ref="myTable" border :data="tableData" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55"></el-table-column>
      <el-table-column label="区块所属" align="center">
        <template slot-scope="scope">
          <el-select v-model="scope.row.firstValue" @change="oneSelectChange(scope, $event)" placeholder="请选择">
            <el-option
              v-for="item in optionsList"
              :key="item.value"
              :label="item.label"
              :value="item.value">
            </el-option>
          </el-select>
        </template>
      </el-table-column>
      <el-table-column align="center" label="一级区块">
        <template slot-scope="scope">
          <el-select v-model="scope.row.secondValue" @change="twoSelectChange(scope, $event)" placeholder="请选择">
            <el-option
              v-for="item in scope.row.optionsOneList"
              :key="item.value"
              :label="item.label"
              :value="item.value">
            </el-option>
          </el-select>
        </template>
      </el-table-column>
      <el-table-column align="center" label="二级区块">
        <!-- optionsTwoList -->
        <template slot-scope="scope">
          <el-select v-model="scope.row.VFPBlock" @change="threeSelectChange(scope, $event)" placeholder="请选择">
            <el-option
              v-for="item in scope.row.optionsTwoList"
              :key="item.value"
              :label="item.label"
              :value="item.value">
            </el-option>
          </el-select>
        </template>
      </el-table-column>
      <el-table-column align="center" label="计划量">
        <template slot-scope="scope">
          <el-input v-model="scope.row.changeQuantity" :disabled="true" placeholder="请输入内容"></el-input>
        </template>
      </el-table-column>
      <el-table-column align="center" label="计划开始时间">
        <template slot-scope="scope">
          <el-date-picker
            v-model="scope.row.plannedStartTime"
            readonly
            type="date">
          </el-date-picker>
        </template>
      </el-table-column>
      <el-table-column align="center" label="计划结束时间">
        <template slot-scope="scope">
          <el-date-picker
            v-model="scope.row.plannedEndTime"
            readonly
            type="date">
          </el-date-picker>
        </template>
      </el-table-column>
      <el-table-column align="center" label="变更开始时间">
        <template slot-scope="scope">
          <el-date-picker
            v-model="scope.row.changeStartTime"
            type="date"
            value-format="yyyy-MM-dd"
            @change="dateChangeEvent($event, scope.row)"
            placeholder="选择日期">
          </el-date-picker>
        </template>
      </el-table-column>
      <el-table-column align="center" label="变更结束时间">
        <template slot-scope="scope">
          <el-date-picker
            v-model="scope.row.changeEndTime"
            type="date"
            value-format="yyyy-MM-dd"
            @change="dateChangeEvent($event, scope.row)"
            placeholder="选择日期">
          </el-date-picker>
        </template>
      </el-table-column>
    </el-table>
  </div>

 

js代码:

data() {
    return {
      tableData: [],
      optionsList: [
        {
			"amount":45000.0,
			"children":[
				{
					"amount":20126.0,
					"children":[
						{
							"amount":914.0,
							"children":[],
							"label":"B区地下",
							"planEnd":"2020-05-04 00:00:00",
							"planStart":"2020-04-20 00:00:00",
							"value":1395
						},
						{
							"amount":1505.0,
							"children":[],
							"label":"B区夹层",
							"planEnd":"2020-06-11 00:00:00",
							"planStart":"2020-04-01 00:00:00",
							"value":1399
						},
					],
					"label":"B展厅",
					"planEnd":"2020-07-27 00:00:00",
					"planStart":"2020-04-01 00:00:00",
					"value":1391
				},
				{
					"amount":24161.0,
					"children":[
						{
							"amount":788.0,
							"children":[],
							"label":"A1地下结构",
							"planEnd":"2020-04-15 00:00:00",
							"planStart":"2020-04-04 00:00:00",
							"value":1431
						},
						{
							"amount":782.0,
							"children":[],
							"label":"A2地下结构",
							"planEnd":"2020-04-15 00:00:00",
							"planStart":"2020-04-04 00:00:00",
							"value":1435
						},
					],
					"label":"A展厅",
					"planEnd":"2020-07-30 00:00:00",
					"planStart":"2020-04-04 00:00:00",
					"value":1427
				},
				{
					"amount":671.0,
					"children":[
						{
							"amount":671.0,
							"children":[],
							"label":"登陆厅地下结构",
							"planEnd":"2020-04-15 00:00:00",
							"planStart":"2020-04-05 00:00:00",
							"value":1463
						}
					],
					"label":"登陆厅",
					"planEnd":"2020-04-15 00:00:00",
					"planStart":"2020-04-05 00:00:00",
					"value":1459
				}
			],
			"label":"详图设计",
			"planEnd":"2020-07-30 00:00:00",
			"planStart":"2020-04-01 00:00:00",
			"value":42
		},
		{
			"amount":45000.0,
			"children":[
				{
					"amount":20126.0,
					"children":[
						{
							"amount":914.0,
							"children":[],
							"label":"B区地下",
							"planEnd":"2020-06-21 00:00:00",
							"planStart":"2020-05-11 00:00:00",
							"value":1396
						},
						{
							"amount":1505.0,
							"children":[],
							"label":"B区夹层",
							"planEnd":"2020-08-07 00:00:00",
							"planStart":"2020-06-18 00:00:00",
							"value":1400
						}
					],
					"label":"B展厅",
					"planEnd":"2020-09-23 00:00:00",
					"planStart":"2020-05-11 00:00:00",
					"value":1392
				},
				{
					"amount":24161.0,
					"children":[
						{
							"amount":788.0,
							"children":[],
							"label":"A1地下结构",
							"planEnd":"2020-05-24 00:00:00",
							"planStart":"2020-04-16 00:00:00",
							"value":1432
						},
						{
							"amount":782.0,
							"children":[],
							"label":"A2地下结构",
							"planEnd":"2020-05-22 00:00:00",
							"planStart":"2020-04-16 00:00:00",
							"value":1436
						}
					],
					"label":"A展厅",
					"planEnd":"2020-08-10 00:00:00",
					"planStart":"2020-04-16 00:00:00",
					"value":1428
				},
				{
					"amount":671.0,
					"children":[
						{
							"amount":671.0,
							"children":[],
							"label":"登陆厅地下结构",
							"planEnd":"2020-05-20 00:00:00",
							"planStart":"2020-04-16 00:00:00",
							"value":1464
						}
					],
					"label":"登陆厅",
					"planEnd":"2020-05-20 00:00:00",
					"planStart":"2020-04-16 00:00:00",
					"value":1460
				}
			],
			"label":"物资管理",
			"planEnd":"2020-09-23 00:00:00",
			"planStart":"2020-04-16 00:00:00",
			"value":43
		}],
      optionsOneList: [],
      optionsTwoList: [],
      optionsTherrList: {},
      multipleSelection: [],
    };
  },

  methods: {
    // 区块触发
    oneSelectChange(e,data){
      if (data) {
        let item = this.optionsList.find(item => item.value == data)
        if (item) {
          this.tableData[e.$index].optionsOneList = item.children
          this.tableData[e.$index].secondValue =''
        }
      }
    },
    // 一级触发
    twoSelectChange(e,data){
      if (data) {
        let item = this.tableData[e.$index].optionsOneList.find(item => item.value == data)
        if (item) {
          this.tableData[e.$index].optionsTwoList = item.children
          this.tableData[e.$index].VFPBlock =''
        }
      }
    },
    // 二级触发
    threeSelectChange(e,data){
      if (data) {
        let item = this.tableData[e.$index].optionsTwoList.find(item => item.value == data)
        if (item) {
          this.tableData[e.$index].optionsTherrList = item
          this.tableData[e.$index].plannedStartTime = item.planStart
          this.tableData[e.$index].plannedEndTime = item.planEnd
          this.tableData[e.$index].changeStartTime = item.planStart
          this.tableData[e.$index].changeEndTime = item.planEnd
          this.tableData[e.$index].changeQuantity = item.amount
        }
      }
    },
    // 删除复选框选中的数据
    removeCheckboxRow(){ 
      for (var i = 0; i < this.multipleSelection.length; i++) {
        for (var j = 0; j < this.tableData.length; j++) {
          if(this.multipleSelection[i].index == this.tableData[j].index) {  
            this.tableData.splice(j, 1)
          }
        }
      } 
    },
    // 复选框选中数据
    handleSelectionChange(val){
      this.multipleSelection = val;
    },
    // 插入一行时调用
    insertEvent (data ={}, i='') {
      let record = { 
        index: data.coId || new Date().getTime(),
        firstValue: data.firstValue || '', 
        secondValue: data.secondValue || '', 
        VFPBlock: data.thirdValue || '', 
        changeQuantity: data.afterAmount || '',
        plannedStartTime: data.beforeStart || '', 
        changeStartTime: data.afterStart || '', 
        plannedEndTime: data.beforeEnd || '', 
        changeEndTime: data.afterEnd || ''
        }
        this.tableData.push(record)
        if(this.isEdit) {
          this.selectChange(data, i)
        }
    },
    // 但有数据时回赋值
    selectChange(data, i){
      if (data.firstValue) {
        let item = this.optionsList.find(item => item.value == data.firstValue)
        if (item) {
          this.tableData[i].optionsOneList = item.children
          if (data.secondValue) {
            let items = item.children.find(items => items.value == data.secondValue)
            if (items) {
              this.tableData[i].optionsTwoList = items.children
              if (data.thirdValue) {
                let itemss = items.children.find(itemss => itemss.value == data.thirdValue)
                if (itemss) {
                  this.tableData[i].optionsTherrList = itemss
                  this.tableData[i].plannedStartTime = itemss.planStart
                  this.tableData[i].plannedEndTime = itemss.planEnd
                  this.tableData[i].changeQuantity = itemss.amount
                }
              }
            }
          }
        }
      }
    },
    // 判断时间是否符合
    dateChangeEvent(e, data){
      let startdate = data.changeStartTime;
      let enddate = data.changeEndTime;
      let start = new Date(Date.parse(startdate.replace(/-/g, "/")));
      let end = new Date(Date.parse(enddate.replace(/-/g, "/")));
      if (start > end) {
          this.$message({ message: '变更结束时间不能在变更开始时间之前',type: 'warning'});
      }
    },
  },

 

css代码:

.el-table >>> tr td .cell {
    display: flex;
  }

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值