• vue+element 表格单元格内添加/编辑


    需求:

    点击某个单元格可以添加、修改数据,点击底部按钮并且保存数据

    <el-tabs type="border-card" v-model="configure" @tab-click="handleClick">
          <el-tab-pane label="配置因子" name="first">
            <el-table :data="tableData1" style="100%;">
              <el-table-column type="index" width="50" label="序号"></el-table-column>
              <el-table-column prop="deptTypeTrans" label="类型"></el-table-column>
              <el-table-column prop="deptName" label="部门"></el-table-column>
              <el-table-column prop="headQuarterWeight" label="各单位总部因子">
                <template slot-scope="scope">
                    <div class="sine" @click="dataClick(scope.row, scope.row.headQuarterWeight)" v-if="!scope.row.headQuarterWeight.edit">{{scope.row.headQuarterWeight.label}}</div>
                    <el-input size="mini" v-else v-model="scope.row.headQuarterWeight.label" @blur="loseFcous(scope.row, scope.row.headQuarterWeight)"></el-input>
                </template>
              </el-table-column>
              <el-table-column prop="projectCompanyWeight" label="项目公司因子">
                <template slot-scope="scope">
                    <div class="sine"  @click="dataClick(scope.row, scope.row.projectCompanyWeight)" v-if="!scope.row.projectCompanyWeight.edit">{{scope.row.projectCompanyWeight.label}}</div>
                    <el-input size="mini" v-else v-model="scope.row.projectCompanyWeight.label" @blur="loseFcous(scope.row, scope.row.projectCompanyWeight)"></el-input>
                </template>
              </el-table-column>
              <el-table-column prop="contractingWeight" label="总承包因子">
                <template slot-scope="scope">
                    <div class="sine"  @click="dataClick(scope.row, scope.row.contractingWeight)" v-if="!scope.row.contractingWeight.edit">{{scope.row.contractingWeight.label}}</div>
                    <el-input size="mini" v-else v-model="scope.row.contractingWeight.label" @blur="loseFcous(scope.row, scope.row.contractingWeight)"></el-input>
                </template>
              </el-table-column>
              <el-table-column prop="level3ProjectWeight" label="三级项目">
                <template slot-scope="scope">
                    <div class="sine"  @click="dataClick(scope.row, scope.row.level3ProjectWeight)" v-if="!scope.row.level3ProjectWeight.edit">{{scope.row.level3ProjectWeight.label}}</div>
                    <el-input size="mini" v-else v-model="scope.row.level3ProjectWeight.label" @blur="loseFcous(scope.row, scope.row.level3ProjectWeight)"></el-input>
                </template>
              </el-table-column>
              <el-table-column prop="trusteeshipProjectWeight" label="(托管)项目公司因子">
                <template slot-scope="scope">
                    <div class="sine"  @click="dataClick(scope.row, scope.row.trusteeshipProjectWeight)" v-if="!scope.row.trusteeshipProjectWeight.edit">{{scope.row.trusteeshipProjectWeight.label}}</div>
                    <el-input size="mini" v-else v-model="scope.row.trusteeshipProjectWeight.label" @blur="loseFcous(scope.row, scope.row.trusteeshipProjectWeight)"></el-input>
                </template>
              </el-table-column>
              <el-table-column prop="trusteeshipHeadWeight" label="(托管)总承包因子">
                <template slot-scope="scope">
                    <div class="sine"  @click="dataClick(scope.row, scope.row.trusteeshipHeadWeight)" v-if="!scope.row.trusteeshipHeadWeight.edit">{{scope.row.trusteeshipHeadWeight.label}}</div>
                    <el-input size="mini" v-else v-model="scope.row.trusteeshipHeadWeight.label" @blur="loseFcous(scope.row, scope.row.trusteeshipHeadWeight)"></el-input>
                </template>
              </el-table-column>
            </el-table>
            <div class="dialog-footer">
                <el-button size="small" type="primary" @click="handleSave1()">保存</el-button>
                <el-button size="small" type="info" @click="handleCancel1()">取消</el-button>
            </div>
          </el-tab-pane>
        </el-tabs>
    
    data() {
        return {
          configure: 'first',
           tableData1: [
              {
                  headQuarterWeight: {
                    label: '',
                    edit: false,
                  },
                  projectCompanyWeight: {
                    label: '',
                    edit: false,
                  },
                  contractingWeight: {
                    label: '',
                    edit: false,
                  },
                  level3ProjectWeight: {
                    label: '',
                    edit: false,
                  },
                  trusteeshipProjectWeight: {
                    label: '',
                    edit: false,
                  },
                  trusteeshipHeadWeight: {
                    label: '(托管)总承包因子',
                    edit: false,
                  },
              }
            ],
        };
      },
    
     methods: {
        loseFcous(row, name) {
           name.edit = false;
         },
        dataClick(row, name) {
            console.log(name);
            name.edit = true;
        }
     }
    

    问题记录:

    记录在动态表头的时候,点击单元无法添加/编辑的问题,DOM结构中只有span没有el-input框

    <el-tab-pane label="配置各单位总部业务比例" name="second">
            <template>
              <el-table :data="tableData2" style="100%;" border>
                <el-table-column type="index" width="50" label="序号"></el-table-column>
                <el-table-column prop="deptTypeTrans" label="类型"></el-table-column>
                <el-table-column prop="deptName" label="部门"></el-table-column>
                <el-table-column v-for="item in tableData2" :key="item.id" :label="item.companyName" :prop="item.prop">
                  <template slot-scope="scope" >
                    <span class="sine" @click="dataClick(scope.row, scope.row.rate)" v-if="!scope.row.rate.edit">{{scope.row.rate.label}}</span>
                    <el-input 
                      size="mini" 
                      oninput="value=value.replace(/[^d.]/g,'')" 
                      v-focus 
                      v-else 
                      v-model="scope.row.rate.label" 
                      @blur="loseFcous(scope.row, scope.row.rate)">
                    </el-input>
                  </template>
                </el-table-column>
              </el-table>
              <div class="dialog-footer">
                <el-button size="small" type="primary" @click="handleSave2()">保存</el-button>
                <el-button size="small" type="info" @click="handleCancel2()">取消</el-button>
              </div>
            </template>
          </el-tab-pane>
    
    methods: {
       loseFcous(row, name) {
            console.log(row, name);
            name.edit = false;
         },
        dataClick(row, name) {
            console.log(row, 'name');
            name.edit = true;
        },
       //获取各单位总部业务比例
    	getBusinProportion() {
    		let params = {
          queryFields:JSON.stringify({
            id: '',
            annual: this.searchParams.annual,					
            checkDeptId: '',					
            companyId: '',	
            rate: '',		
          })
    		}
    		this.$axios({
          method: 'get',
          url: this.getBusinExList,
          params: params
    		}).then((res) => {
          console.log(res, '各单位总部业务比例数据')
          res.data.results.forEach(item => {
            item.rate = {
              label: item.rate || 10,
              edit: false
            }
          })
          this.tableData2 = res.data.results;
          console.log(this.tableData2, 'tableData2');
    		})
    	}    
    }
    

    原因:

    1、更改视图$set用错了

        loseFcous2(row, name) {
            console.log(row, name.edit);
            this.$set(name, 'edit', false); //源数据、key、value
         },
        dataClick2(row, name) {
            console.log(row, name.edit);
            this.$set(name, 'edit', true);
        },
    

     2、自定义指令 v-focus影响的

    因为v-focus是焦点存在或者离开的时候隐藏的,所以值是true的时候,指令又处理一次,焦点没存在当前input上。(点击按钮,input显示 但是input没焦点)

  • 相关阅读:
    ubuntu 安装mysql和redis 开放远程连接
    linux时间不对,执行ntpdate时间同步始终不对。
    Web漏洞
    生产者消费者模型
    多进程抢票问题
    socket通讯-----UDP
    python3读写csv文件
    # 把csv转xls
    python os模块 用资源管理器显示文件,pyinstall打包命令
    创建一个最简单的pyqt5窗口
  • 原文地址:https://www.cnblogs.com/theblogs/p/13627925.html
Copyright © 2020-2023  润新知