table组件实现某一列的显隐效果

95 阅读5分钟

点击“灯示条件”按钮能控制表格中“灯示条件”这一列的显隐

勾选前:

image.png 勾选后:

image.png

代码:

image.png

“灯示条件”按钮:

     <a-checkbox
        v-model:checked="conditioncChecked"
        class="chos"
        @click="changeChecked"
        >灯示条件</a-checkbox
      >

表格的列数据:

   const lightColumns = ref([
      {
        title: '列名一',
        dataIndex: 'companyName',
        key: 'companyName',
        width: '6%'
      },
      {
        title: '列名二',
        dataIndex: 'taskName',
        key: 'taskName',
        width: '10%'
      },
      {
        title: '灯示条件',
        dataIndex: 'lightCondition',
        key: 'lightCondition',
        width: '15%',
        type: 'wrap'
      },
      {
        title: '灯示情况',
        key: 'list',
        dataIndex: 'list',
        align: 'left'
      }
    ]);

columns没有子级children的情况: 增加一种方法,datas 为表格中的列名配置

import datas from "@/utils/column";

export default {
  columns: [
    {
      name: "No.",
      key: "No.",
    },
    {
      name: "Project",
      key: "Project",
    },
    {
      name: "Assignee",
      key: "Assignee",
    },
    {
      name: "Subject",
      key: "Subject",
    },
    {
      name: "Status",
      key: "Status",
    },
    {
      name: "File Type",
      key: "File Type",
    },
    {
      name: "In Progress Date",
      key: "In Progress Date",
    },
    {
      name: "No. of Pages",
      key: "No. of Pages",
    },
    {
      name: "No. of Reference",
      key: "No. of Reference",
    },
  ],
  allDatas: [
    "No.",
    "Project",
    "Assignee",
    "Subject",
    "Status",
    "File Type",
    "In Progress Date",
    "No. of Pages",
    "No. of Reference",
  ],
};

<template>
  <div>
    <el-popover
      :visible="visible"
      placement="bottom"
      :width="250"
      style="height: 200px"
    >
      <el-tree
        :data="columns"
        show-checkbox
        node-key="key"
        ref="tree"
        :props="defaultProps"
        :default-checked-keys="defaultChecked"
        @check="handleCheckChange"
        style="max-height: 450px; overflow-y: auto; overflow-x: hidden"
      />
      <template #reference>
        <el-button-group class="ml-4">
          <el-button
            @click="selectBtn()"
            class="el-popover-btn-left"
            size="small"
            type="primary"
            >Select All</el-button
          >
          <el-button
            class="el-popover-btn"
            size="small"
            type="primary"
            @click="visible = true"
            icon="Setting"
          ></el-button>
        </el-button-group>
      </template>
    </el-popover>

    <el-table :data="tableData" class="tablePage" style="margin-top: 20px">
      <template v-if="checkColumns.indexOf('No.') > -1">
        <el-table-column prop="id" label="No." width="80">
          <template #default="scope"
            ><div class="underLine">
              {{ scope.row.id }}
            </div></template
          >
        </el-table-column>
      </template>
      <template v-if="checkColumns.indexOf('Project') > -1"
        ><el-table-column prop="project" label="Project"
      /></template>
      <template v-if="checkColumns.indexOf('Assignee') > -1">
        <el-table-column prop="assignee" label="Assignee">
          <template #default="scope"
            ><div class="underLine">
              {{ scope.row.assignee }}
            </div></template
          >
        </el-table-column></template
      >
      <template v-if="checkColumns.indexOf('Subject') > -1">
        <el-table-column prop="subject" label="Subject">
          <template #default="scope"
            ><div class="underLine">
              {{ scope.row.subject }}
            </div></template
          >
        </el-table-column></template
      >
      <template v-if="checkColumns.indexOf('Status') > -1">
        <el-table-column prop="status" label="Status"
      /></template>
      <template v-if="checkColumns.indexOf('File Type') > -1">
        <el-table-column prop="fileType" label="File Type"
      /></template>
      <template v-if="checkColumns.indexOf('In Progress Date') > -1">
        <el-table-column prop="date" label="In Progress Date"
      /></template>
      <template v-if="checkColumns.indexOf('No. of Pages') > -1">
        <el-table-column prop="pages" label="No. of Pages" />
      </template>
      <template v-if="checkColumns.indexOf('No. of Reference') > -1">
        <el-table-column prop="reference" label="No. of Reference" />
      </template>
    </el-table>
  </div>
</template>

<script>
import datas from "@/utils/column";

export default {
  name: "Login",
  data() {
    return {
      visible: false,
      defaultProps: {
        children: "children",
        label: "name",
      },
      tableData: [
        {
          id: "00001",
          project: "Layout-Main",
          subject: "TSP_CMC_49805",
          assignee: "Arlo Wang",
          status: "In Porgress",
          fileType: "DOC",
          date: "2024-05-06 08:35:01",
          pages: "15",
          reference: "40",
        },
      ],
      defaultChecked: [],
      checkColumns: ["Project"],
      tree: "",
      allColumns: datas.allDatas,
      columns: datas.columns,
    };
  },
  mounted() {
    this.checkColumns = this.allColumns;
    this.$refs.tree?.setCheckedKeys(this.allColumns);
  },
  methods: {
    //选取改变
    handleCheckChange(data, checked, indeterminate) {
      this.checkColumns = checked.checkedKeys;
    },
    selectBtn() {
      this.columns.map(function (items, key) {
        if (this.checkColumns.indexOf(items.key) === -1) {
          this.checkColumns.push(items.key);
        }
      });
      this.$refs.tree?.setCheckedKeys(this.checkColumns);
    },
  },
};
</script>

<!-- 补充vue3写法 -->
<!-- 
1. 界面相同 
2. 方法

const defaultProps = {
  children: "children",
  label: "name",
};
const defaultChecked = ref([]);
let columns = datas.columns;
let allColumns = datas.allDatas;
let checkColumns = ref<any>([]);
const tree = ref();

onMounted(() => {
  checkColumns.value = allColumns;
  tree.value!.setCheckedKeys(allColumns);
});

//选取改变
const handleCheckChange = (data, checked, indeterminate) => {
  checkColumns.value = checked.checkedKeys;
};
const selectBtn = () => {
  columns.map(function (items, key) {
    if (checkColumns.value.indexOf(items.key) === -1) {
      checkColumns.value.push(items.key);
    }
  });
  tree.value!.setCheckedKeys(checkColumns.value);
}; -->

columns有子级children的情况: 增加一种方法,datas 为表格中的列名配置 import datas from "@/utils/column";

export default {
  columns: [
    {
      name: "Paper ID",
      key: "aid",
      single: true,
      webUrl: true,
      visible: false,
      fixed: true,
      width: "150",
    },
    {
      name: "Paper Info",
      key: "paperinfo",
      visible: true,
      single: false,
      children: [
        {
          name: "Submission Date",
          visible: true,
          key: "submit_date",
          width: "200",
        },
        {
          name: "Duration",
          key: "submitDuration",
          visible: true,
        },
        {
          name: "Status",
          key: "paperStatus",
          visible: true,
        },
        {
          name: "Title",
          visible: true,
          key: "article_title",
        },
        {
          name: "Title in Chinese",
          visible: true,
          width: "150",
          key: "titleCn",
        },
        {
          name: "Article Type",
          visible: true,
          width: "150",
          key: "articleTypeName",
        },

        {
          name: "Journal",
          visible: true,
          key: "journal_title",
        },
        {
          name: "Section",
          visible: true,
          width: "200",
          key: "section_title",
        },
        {
          name: "Warning",
          visible: true,
          waring: true,
          width: "200",
          key: "articleWarning",
        },
        {
          name: "Field",
          key: "articleField",
          visible: true,
        },
        {
          name: "Academic Classification",
          key: "manuscriptSource",
          width: "180",
          visible: true,
        },
      ],
    },
    {
      name: "QC Management",
      key: "qcmanagement",
      visible: true,
      single: false,
      children: [
        {
          name: "QS",
          key: "qualityStatus",
          visible: true,
        },
        {
          name: "QC Times",
          key: "qualityCheckNumber",
          visible: true,
        },
        {
          name: "QC Rounds",
          key: "qcRounds",
          visible: true,
          arrayNew: true,
        },

        {
          name: "QC History Messages ",
          array: true,
          html: true,
          key: "qualityMessages",
          width: "300",
          visible: true,
        },

        {
          name: "Initial Status",
          key: "initialStatus",
          width: "110",
          visible: true,
        },
        {
          name: "Initial Comments",
          key: "initialRemark",
          width: "140",
          visible: true,
          popup: true,
        },
        {
          name: "ME Action Required",
          key: "meActionRequired",
          width: "160",
          visible: true,
        },
        {
          name: "QC Name",
          key: "qcName",
          visible: true,
        },
      ],
    },
    // --------------------------------------------------
    {
      name: "Quality Control Results",
      key: "qcControlResults",
      visible: true,
      single: false,
      children: [
        {
          name: "Red Flag",
          key: "redFlag",
          visible: true,
          type: "0",
        },
        {
          name: "Yellow Flag",
          key: "yellowFlag",
          visible: true,
          type: "1",
        },
        {
          name: "Blue Flag",
          key: "blueFlag",
          visible: true,
          type: "2",
        },

        {
          name: "QC Results Comments",
          key: "comment",
          visible: true,
          width: "200",
          popup: true,
        },
      ],
    },

    {
      name: "First Author Info",
      key: "firstAuthorInfo",
      visible: true,
      single: false,
      children: [
        {
          name: "Name",
          key: "firstAuthor",
          visible: true,
        },
        {
          name: "H",
          key: "firstHIndex",
          visible: true,
        },
        {
          name: "Link",
          key: "firstAuthorLink",
          visible: true,
        },
        {
          name: "Email",
          key: "firstAuthorEmail",
          visible: true,
        },
        {
          name: "Affiliation",
          key: "firstAuthorAffiliation",
          visible: true,
        },
      ],
    },
    {
      name: "Corresponding Author Info",
      key: "correspondingAuthorInfo",
      visible: true,
      single: false,
      children: [
        {
          name: "Name",
          key: "correspondingAuthor",
          visible: true,
        },
        {
          name: "H",
          key: "correspondingHIndex",
          visible: true,
        },
        {
          name: "Link",
          key: "correspondingLink",
          visible: true,
        },
        {
          name: "Email",
          key: "correspondingEmail",
          visible: true,
        },
        {
          name: "Affiliation",
          key: "correspondingAffiliation",
          visible: true,
        },
      ],
    },
    {
      name: "Editorial Remark",
      key: "editorialRemark",
      visible: true,
      single: false,
      children: [
        {
          name: "Title",
          key: "titleRemark",
          visible: true,
        },
        {
          name: "Abstract",
          key: "abstractRemark",
          visible: true,
        },
        {
          name: "Internal Comments",
          width: "300px",
          key: "remark",
          visible: true,
        },
      ],
    },
    {
      name: "Grammarly",
      key: "grammarly",
      visible: true,
      single: false,
      children: [
        {
          name: "Abstract",
          key: "abstractGrammerly",
          visible: true,
        },
        {
          name: "Conclusion",
          key: "conclusionGrammerly",
          visible: true,
        },
        {
          name: "Random",
          key: "randomGrammerly",
          visible: true,
        },
        {
          name: "Comments",
          key: "languageRemark",
          width: "300px",
          html: true,
          visible: true,
        },
      ],
    },
    {
      name: "Scores(1-10)",
      key: "scores",
      visible: true,
      single: false,
      children: [
        {
          name: "EA",
          key: "eaScore",
          visible: true,
        },
        {
          name: "ME",
          key: "meScore",
          visible: true,
        },
      ],
    },
    {
      name: "Sensitivity",
      key: "sensitivity",
      visible: true,
      single: false,
      children: [
        {
          name: "Valid",
          key: "sensitiveSuccess",
          visible: true,
        },
        {
          name: "Fail",
          key: "sensitiveError",
          visible: true,
        },
      ],
    },
    {
      name: "Similarity Check(%)",
      key: "similarityCheck",
      visible: true,
      single: false,
      children: [
        {
          name: "Total",
          key: "similarity",
          visible: true,
        },
        {
          name: "Max",
          key: "similarityMax",
          visible: true,
        },
      ],
    },
    {
      name: "ME & SCE & EA",
      key: "meEa",
      visible: true,
      single: false,
      children: [
        {
          name: "EA",
          key: "eaName",
          visible: true,
        },
        {
          name: "SCE",
          key: "sceName",
          visible: true,
        },
        {
          name: "ME",
          key: "meName",
          visible: true,
        },
      ],
    },
    {
      name: "PE Information",
      key: "peInformation",
      visible: true,
      single: false,
      children: [
        {
          name: "Name",
          key: "preReviewer",
          visible: true,
        },
        {
          name: "Decision",
          key: "preReviewDecisionDesc",
          visible: true,
        },
        {
          name: "Start",
          key: "preReviewDate",
          visible: true,
        },
        {
          name: "End",
          key: "preReviewDecisionDate",
          visible: true,
        },
        {
          name: "Comments",
          key: "preReviewRemark",
          html: true,
          width: "300px",
          visible: true,
        },
      ],
    },
    {
      name: "FD Information",
      key: "fdinformation",
      visible: true,
      single: false,
      children: [
        {
          name: "Name",
          key: "finalReviewer",
          visible: true,
        },
        {
          name: "Decision",
          key: "finalReviewDecisionDesc",
          visible: true,
        },
        {
          name: "Start",
          key: "finalReviewDate",
          visible: true,
        },
        {
          name: "End",
          key: "finalReviewDecisionDate",
          visible: true,
        },
      ],
    },
    {
      name: "Lasted Operator",
      key: "operatorName",
      width: "150px",
      single: true,
      visible: true,
    },
    {
      name: "Other Notes",
      key: "invitationNotes",
      width: "300px",
      single: true,
      visible: true,
    },
    {
      name: "Time Indicators (days)",
      key: "timeIndicators",
      width: "300px",
      visible: true,
      children: [
        {
          name: "Review",
          key: "sendToReviewDays",
          width: "100px",
          visible: true,
        },
        {
          name: "Round1 Days",
          width: "120px",
          key: "roundOneDays",
          visible: true,
        },
        {
          name: "Round1 Submitted Days ",
          width: "180px",
          key: "roundOneSubmittedDays",
          visible: true,
        },
        {
          name: "Accepted",
          key: "acceptedDays",
          visible: true,
        },
        {
          name: "Payment",
          key: "paymentDays",
          visible: true,
        },
        {
          name: "Production",
          key: "productionDays",
          visible: true,
        },
        {
          name: "Production Files Uploaded",
          key: "productionFileUploadedDays",
          width: "200px",
          visible: true,
        },
        {
          name: "Online",
          key: "onlineDays",
          width: "100px",
          visible: true,
        },
        {
          name: "Published",
          key: "publishedDays",
          width: "100px",
          visible: true,
        },
      ],
    },
  ],
};

组件中使用:

//选取改变
const handleCheckChange = (data, checked, indeterminate) => {
  let pd;

  checkColumns.value.forEach((item, index) => {
    if (!item.single) {
      // 有children数组
      if (item.key === data.key) {
        checkColumns.value[index].visible = checked;
        // TODO : ------------------------------------------------------
        // 暂时先注释下方两行,这个筛选设置bug:选了一个大类的子菜单,但是整个大类的都不见了
        // 注释完后暂时解决了选择子类,整个大类会消失的问题
        // item.children.forEach((value, da) => {
        //   checkColumns.value[index].children[da].visible = checked;
        // });
      } else {
        pd = false;
        item.children.forEach((value, da) => {
          if (value.key === data.key) {
            checkColumns.value[index].children[da].visible = checked;
          }
          if (value.visible) {
            pd = true;
          }
        });
        checkColumns.value[index].visible = pd;
      }
    } else {
      // 无children数组
      if (item.key === data.key) {
        checkColumns.value[index].visible = checked;
      }
    }
  });
  tableKey.value = Math.random();
};