Element UI Table实现可编辑表格+校验(行和行,列和列)

这篇具有很好参考价值的文章主要介绍了Element UI Table实现可编辑表格+校验(行和行,列和列)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Table:

<template>
  <div class="as-details-section">
    <span class="title">任务分解表</span>
    <div class="as-detail-list">
      <el-table
        :data="tableData"
        :row-key="getRowKeys"
        border
        style="width: 100%">
        <el-table-column
          prop="stageName"
          label="阶段"
          width="120">
        </el-table-column>
        <el-table-column
          prop="taskName"
          label="任务"
          width="190">
        </el-table-column>
        <el-table-column
          prop="planStartTime"
          label="计划开始时间"
          className="editable"
          width="120">
          <template slot-scope="{ row, column, $index }">
            <table-date-picker
              v-if="row.isTask && !row.isDisabled"
              v-model="row.planStartTime"
              :valueValid="row.planStartTimeValid"
              :valueEmpty="row.planStartTimeEmpty"
              @change="change(row, column, $index)"
              @blur="onBlur(row, column)">
            </table-date-picker>
            <span v-else class="cell-value">{{row.planStartTime | dateFormat}}</span>
          </template>
        </el-table-column>
        <el-table-column
          prop="planEndTime"
          label="计划结束时间"
          className="editable"
          width="120">
          <template slot-scope="{ row, column, $index }">
            <table-date-picker
              v-if="row.isTask && !row.isDisabled"
              v-model="row.planEndTime"
              :valueValid="row.planEndTimeValid"
              :valueEmpty="row.planEndTimeEmpty"
              isEndDate
              @change="change(row, column, $index)"
              @blur="onBlur(row, column)">
            </table-date-picker>
            <span v-else class="cell-value">{{row.planEndTime | dateFormat}}</span>
          </template>
        </el-table-column>
        <el-table-column
          prop="actualStartTime"
          label="实际开始"
          className="editable"
          width="120">
          <template slot-scope="{ row, column, $index }">
            <table-date-picker
              v-if="row.isTask && !row.isDisabled"
              v-model="row.actualStartTime"
              :valueValid="row.actualStartTimeValid"
              :valueEmpty="row.actualStartTimeEmpty"
              :disabled="row.isActualDisabled"
              :pickerOptions="pickerOptions"
              @change="changeRealDate(row, column, $index)">
            </table-date-picker>
            <span v-else class="cell-value">{{row.actualStartTime | dateFormat}}</span>
          </template>
        </el-table-column>
        <el-table-column
          prop="actualEndTime"
          label="实际结束"
          className="editable"
          width="120">
          <template slot-scope="{ row, column, $index }">
            <table-date-picker
              v-if="row.isTask && !row.isDisabled"
              v-model="row.actualEndTime"
              :valueValid="row.actualEndTimeValid"
              :valueEmpty="row.actualEndTimeEmpty"
              :disabled="row.isActualDisabled"
              :pickerOptions="pickerOptions"
              isEndDate
              @change="changeRealDate(row, column, $index)">
            </table-date-picker>
            <span v-else class="cell-value">{{row.actualEndTime | dateFormat}}</span>
          </template>
        </el-table-column>
        <el-table-column
          prop="projectWbsTaskResourceList"
          label="资源及投入比例"
          min-width="200">
          <template slot-scope="{ row, column, $index }">
            <table-person-picker
              v-if="row.isTask && !row.isDisabled"
              v-model="row.projectWbsTaskResourceList"
              :projectWbsTrackId="row.id"
              :valueEmpty="row.projectWbsTaskResourceListEmpty"
              @change="percentChange(row, column, $index)"
              @blur="onBlur(row, column)"
            ></table-person-picker>
            <span v-else class="cell-value">{{ resourceFormat(row.projectWbsTaskResourceList) }}</span>
          </template>
        </el-table-column>
        <el-table-column
          prop="planWorkHour"
          label="预计工时(天)"
          width="120">
        </el-table-column>
        <el-table-column
          prop="actualWorkHour"
          label="实际工时(天)"
          width="120">
        </el-table-column>
        <el-table-column
          prop="planWorkDay"
          label="预计工期(天)"
          width="120">
        </el-table-column>
        <el-table-column
          prop="actualWorkDay"
          label="实际工期(天)"
          width="120">
        </el-table-column>
      </el-table>
    </div>
    <el-dialog
      title="流转确认"
      :visible.sync="dialogVisible"
      :close-on-click-modal="false"
      width="400px">
      <el-row v-if="!isShowRollback">确认要流转至下一阶段吗?</el-row>
      <el-row v-else>确认要流转至下一阶段吗?</el-row>
      <span slot="footer" class="dialog-footer">
        <el-button v-if="!isShowRollback" @click="dialogVisible = false">取 消</el-button>
        <el-button v-if="isShowRollback" @click="promoteProject(true)">回滚至2分</el-button>
        <el-button type="primary" @click="promoteProject()">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

TablePersonPicker:

<template>
  <div class="table-date-picker">
    <div class="cell-content-wrap">
      <span class="cell-content">{{displayValue}}</span>
      <i
        class="el-icon-edit-outline"
        style="float: right"
      ></i>
    </div>
  </div>
</template>

<script>
import TablePersonPickerDialog from '@/components/projectManagement/TablePersonPickerDialog'

export default {
  name: 'TablePersonPicker',
  model: {
    prop: 'value',
    event: 'change'
  },
  props: {
    value: {
      type: Array,
      default() {
        return [];
      }
    },
    valueValid: {
      type: Boolean,
      default() {
        return true;
      }
    },
    valueEmpty: {
      type: Boolean,
      default() {
        return false;
      }
    },
    disabled: {
      type: Boolean,
      default() {
        return false;
      }
    },
    projectWbsTrackId: {
      type: String,
      default() {
        return null;
      }
    }
  },
  data() {
    return {
      newValue: [],
      displayValue: '',
      pencentArr: []
    };
  },
  mounted() {
    // 点击表格td,编辑状态,输入框获取焦点
    this.$el.parentNode.parentNode.onclick = () => {
      if (!this.disabled) {
        this.showDialog();
      }
    }
  },
  methods: {
    showDialog() {
      this.$utils.create(TablePersonPickerDialog, {
        context: this,
        keyName: this.id,
        deliveryDept: this.options,
        value: this.value
      });
    },
    confirm(data) {
      this.pencentArr = data;
      this.displayValue = this.formatDisaplyValue();
      this.$emit('change', this.pencentArr);
    },
    getItemById(personId) {
      let item = null;
      // 新增人员
      for (const obj of this.data) {
        if (obj.personId === personId) {
          item = obj;
          break;
        }
      }
      return item;
    },
    formatDisaplyValue() {
      const displayArr = [];
      for (const item of this.pencentArr) {
        displayArr.push(`${item.personLabel}(${item.inputPercentage}%)`)
      }
      return displayArr.join(',');
    },
    formatOptions() {
      const optons = [];
      let option = null;
      for (const item of this.$store.state.DICT_DATA.delivery_dept) {
        option = {
          id: item.dictValue,
          personLabel: item.dictName,
          disabled: true
        };
        optons.push(option);
      }
      return optons;
    }
  },
  created() {
    this.options = this.formatOptions();
    let template = null;
    for (const item of this.value) {
      this.newValue.push(item.personId);
      template = {
        personId: item.personId,
        projectWbsTrackId: this.projectWbsTrackId,
        inputPercentage: item.inputPercentage,
        personLabel: item.personLabel
      };
      this.pencentArr.push(template);
    }
    this.displayValue = this.formatDisaplyValue();
  },
  watch: {
    valueEmpty() {
      if (this.valueEmpty) {
        this.$el.parentNode.parentNode.style.background = '#FEF0F0';
      } else {
        this.$el.parentNode.parentNode.style.background = 'none';
      }
    },
    valueValid() {
      if (!this.valueValid) {
        this.$el.parentNode.parentNode.style.background = '#FEF0F0';
      } else {
        this.$el.parentNode.parentNode.style.background = 'none';
      }
    }
  }
};
</script>
<style scoped lang="scss">
.table-date-picker {
  display: flex;
  flex-flow: row;
  align-items: center;
  .cell-content-wrap {
      display: flex;
      flex-flow: row;
      align-items: center;
      i {
        color: #20a0ff;
        margin-left: 8px;
        cursor: pointer;
      }
  }
  .cell-content {
    padding: 0 8px;
    flex: 1;
  }
}
</style>

输入校验:


    /**
     * 表格预计开始时间和预计结束时间注册事件
     */
    change(row, column, $index) {
      const { property } = column;
      const value = row[property];
      if ((!value || value === '') && value !== 0) {
        row[`${property}Empty`] = true;
      } else {
        row[`${property}Empty`] = false;
        // 时间发生变化,往下开始计算时间
        this.calculatePlanDate(row, column, $index);
        // 计算预计工时和预计工期
        this.caculatePlanData();
        // 任务预计开始时间小于任务结束时间
        const isValid = this.validateDate(row.planStartTime, row.planEndTime);
        if (!isValid) {
          this.$message.error('预计结束时间必须大于等于预计开始时间!');
        }
        // 任务的预计开始时间大于上一个阶段的结束时间
        const isStartDateValid = this.validateTaskStartDate(row, property, $index);
        if (!isStartDateValid) {
          this.$message.error('任务的预计开始时间和预计结束时间必须大于上一个阶段的预计结束时间');
        }
        if (isValid && isStartDateValid) {
          row[`${property}Valid`] = true;
        } else {
          row[`${property}Valid`] = false;
        }
        this.$set(this.tableData, $index, Object.assign({}, row));
      }
    },

效果图:

element 表格,elementui

 文章来源地址https://www.toymoban.com/news/detail-613068.html

element 表格,elementui

 

到了这里,关于Element UI Table实现可编辑表格+校验(行和行,列和列)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue+element实现el-table行内编辑并校验

    el-table行内编辑情况情况概要:之前在开发过程中对于element数据的新增,修改,删除。一般直接结合el-form使用。也就是新增的时候点新增然后出来一个弹框,里面嵌套一个表单,然后保存就好了。这次项目中要求所有的新增,修改,删除功能加在表格中,实现行内编辑功能。

    2024年02月15日
    浏览(38)
  • 【Vue/element】 el-table实现表格动态新增/插入/删除 表格行,可编辑单元格

    效果如下: 点击“新增一行”可以在表格最后新增一行,单元格内容可编辑 点击绿色+按钮,可在指定行的后面插入一行 点击红色-按钮,可以删除指定行 原理:表格 el-table 是通过动态循环 tableData 生成,只要对 tableData 数组进行增加删除元素,就可以达到效果 这里用了ele

    2024年02月16日
    浏览(49)
  • 论element-ui表格的合并行和列(巨细节)

    ​ 作为一个后端来写前端属实是痛苦、讲真的、刚开始我是真不想用饿了么的这个合并行和列、因为太语焉不详了、看着头疼、后来发现好像我没得选、只好硬着头皮上了。 效果图: 代码: 这里只展示关键代码 先看看它们是怎么完成这个的: ​ 首先,看似是合并了行、实

    2023年04月13日
    浏览(33)
  • Vue+Element UI弹窗实现表格编辑

    点击编辑按钮弹出Dialog js如下 时间格式化 3.1 方法一

    2024年02月12日
    浏览(32)
  • element-ui table 表格控件实现单选功能

    今天遇到一个需求,感觉挺简单的,需求如下: 就是一个表格,在表格的前面加上一个选择框,注意: 只能单选 然后我就去element ui上粘代码: 虽然element ui上有对应的单选表格,可是并不符合我的需求 然后我又发现下面有一个多选的表格,样式虽然相似,可是还是不符合我

    2024年02月11日
    浏览(43)
  • element-ui实现表格每行可以编辑数据

    每行可以编辑数据可以不使用弹窗实现修改数据的功能,这里使用到element-ui框架 效果图如下: 代码如下: 可获取到编辑的数据 这里展示axios.post请求来实现编辑功能

    2024年02月12日
    浏览(43)
  • vue element ui table表格--实现列的显示与隐藏

    实现效果 提示:代码段太简单就不解释了,自己看代码自己更改,下面代码直接无脑复制更改就行

    2024年02月02日
    浏览(39)
  • element-ui/view-ui表格的合并行和列的多种方法(超级详细)

    vue的这两个组件库的表格的行和列的合并写法是一样的,都是通过span-method方法可以实现的;下面我们就以view ui的表格组件为例; 该方法参数为 4 个对象: row: 当前行 column: 当前列 rowIndex: 当前行索引 columnIndex: 当前列索引 该函数可以返回一个包含两个元素的数组,第一个元

    2024年04月14日
    浏览(33)
  • Vue中使用Element UI的Table组件实现嵌套表格(最简单示例)

    以下是一个简单的示例代码,演示如何在Vue中使用Element UI的Table组件实现嵌套表格: 上面的代码通过type=\\\"expand\\\"设置了一个展开按钮,点击该按钮会显示与当前行关联的子表格内容。 在上面的示例中,我们定义了一个包含姓名和年龄的主表格,以及一个展开列用于显示与每行

    2024年02月02日
    浏览(39)
  • Element-ui中表格el-table图片预览效果实现(非常实用)

    🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅  文末获取源码联系 🏆先展示效果:   🏆使用的是下面这个插

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包