Element Table业务场景之表格内根据数据实现密码的查看与隐藏

2,739 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前几天遇到的业务需求,需要在表格内展示密码,但大部分情况下,密码的展示是不应该直接展示的,因此需要做一个密码的显示与隐藏的功能,并且这个业务需要在组件中做,以便复用,下面是我对代码的重新整理

  • 1. 先放效果图

动画.gif

  • 2. 放代码
<template>
    <div>
      <!-- 员工信息 -->
      <el-table
        :data="tableData"
        style="width: 1400px; margin-top: 10px"
        border
        stripe
        max-height="500px"
      >
      <el-table-column
            v-for="(item, index) in fieldList"
            :key="index"
            :label="item.name"
            :prop="item.value"
            :width="item.width"
            show="true"
            :sortable="item.noSort ? false : 'custom'"
            >
            </el-table-column>
            <el-table-column label="密码" >
                <template slot-scope="scope">
                    <div  style="margin-left:10px  font-size:12px" v-if="scope.row.passwordShow">
                        {{ scope.row.cPassword }}<el-button
                        class="view"
                        @click="view(scope.$index, scope.row)"
                        ><i class="el-icon-view"></i
                            ></el-button>
                        </div>
                    </template>
            </el-table-column>
      </el-table>
    </div>
  </template>
  
  <script>
  export default {
    data() {
      return {
        fieldList:[
            {name : '日期',value: 'date',noSort: false,width:'300' },
            {name : '姓名',value: 'name',noSort: true,width:'100' },
            {name : '地址',value: 'address',noSort: true,width:'400' },
            {name : '性别',value: 'sex',noSort: true,width:'100' },
            {name : '年龄',value: 'age',noSort: true,width:'100',passWordShow:false },
        ],
        //员工账号信息
        tableData: [
        {
          date: "2016-05-02",
          name: "王小狗",
          address: "上海市普陀区金沙江路 1518 弄",
          sex: "女",
          age: null,
          password: "asdsadsadsa",
          cPassword: "******",
          passwordShow: true,
        },
        {
          date: "2016-05-04",
          name: "王小猫",
          address: "上海市普陀区金沙江路 1517 弄",
          sex: null,
          age: "29",
          password: "wqewqewqewq",
          cPassword: "******",
          passwordShow: true,
        },
        {
          date: "2016-05-01",
          name: "王小猪",
          address: "上海市普陀区金沙江路 1519 弄",
          sex: "女",
          age: "12",
          password: "354354354",
          cPassword: "******",
          passwordShow: true,
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1516 弄",
          sex: "男",
          age: null,
          password: "uytutyutt",
          cPassword: "******",
          passwordShow: true,
        },
        ],
      };
    },
    methods: {
       // 点击查看密码
       view(index) {
      if (this.tableData[index].cPassword === "******") {
        this.tableData[index].cPassword = this.tableData[index].password;
      } else {
        this.tableData[index].cPassword = "******";
      }
    },
    },
  };
  </script>
  <style lang="less" scoped>
  .view {
  background:rgba(255,255,255,1) !important;
  border: 0px solid ;
  position: static !important;
}
  </style>
  

1、根据数据渲染表格行

在工作中,这个部分应该进行二次封装做成组件的,但是为了演示方便,我给他做成了一个文件,表格行根据fieldList数组,并将其进行渲染,而这个数组包含着的每一个对象,即表头,渲染的时候也根据这个数组携带的参数进行配置.

在组件化开发中我们可以在组件外创建一个fieldList数组,并将其传入至组件中

<template>
    <div>
      <!-- 员工信息 -->
      <el-table
        :data="tableData"
        style="width: 1400px; margin-top: 10px"
        border
        stripe
        max-height="500px"
      >
      <el-table-column
            v-for="(item, index) in fieldList"
            :key="index"
            :label="item.name"
            :prop="item.value"
            :width="item.width"
            show="true"
            :sortable="item.noSort ? false : 'custom'"
            >
            </el-table-column>
            
              tableData: [
        {
          date: "2016-05-02",
          name: "王小狗",
          address: "上海市普陀区金沙江路 1518 弄",
          sex: "女",
          age: null,
          password: "asdsadsadsa",
          cPassword: "******",
          passwordShow: true,
        },
        {
          date: "2016-05-04",
          name: "王小猫",
          address: "上海市普陀区金沙江路 1517 弄",
          sex: null,
          age: "29",
          password: "wqewqewqewq",
          cPassword: "******",
          passwordShow: true,
        },
        {
          date: "2016-05-01",
          name: "王小猪",
          address: "上海市普陀区金沙江路 1519 弄",
          sex: "女",
          age: "12",
          password: "354354354",
          cPassword: "******",
          passwordShow: true,
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1516 弄",
          sex: "男",
          age: null,
          password: "uytutyutt",
          cPassword: "******",
          passwordShow: true,
        },
        ],

2、根据数据设置密码列的显示与隐藏

一般我们可以根据后端返回的数据,来设置这个业务是否需要,在数据tableData数组中,使用passwordShow: true来进行判断,就可以啦!!!

            <el-table-column label="密码" >
                <template slot-scope="scope">
                    <div  style="margin-left:10px  font-size:12px" v-if="scope.row.passwordShow">
                        {{ scope.row.cPassword }}<el-button
                        class="view"
                        @click="view(scope.$index, scope.row)"
                        ><i class="el-icon-view"></i
                            ></el-button>
                        </div>
                    </template>
            </el-table-column>
      </el-table>

3、实现点击按钮密码的显示与隐藏

在渲染密码那一列时,我们是使用了插槽的知识(备注:组件封装三要素 slotprop,$emit),因此我们可以给点击的button按钮添加点击事件时将被点击的行传入进去,然后我们就可以在下面的事件函数中拿到进行判断,来实现密码的显示与隐藏啦!!!

    methods: {
       // 点击查看密码
       view(index) {
      if (this.tableData[index].cPassword === "******") {
        this.tableData[index].cPassword = this.tableData[index].password;
      } else {
        this.tableData[index].cPassword = "******";
      }
    },
    },
  };

ok!!我写完了!!

image.png

Suggestion.gif