首页 > 其他分享 >ElementUI 动态渲染 el-table

ElementUI 动态渲染 el-table

时间:2024-09-09 17:54:20浏览次数:3  
标签:el name ElementUI label address date table prop columns

动态生成列

假设我们有一个 columns 数组,用于存储表格的列信息,每个元素包含列的 prop 和 label:

data() {
  return {
    tableData: [
      {
        date: '2016-05-03',
        name: 'Tom',
        address: 'No. 189, Grove St, Los Angeles'
      },
      {
        date: '2016-05-02',
        name: 'Jerry',
        address: 'No. 189, Grove St, Los Angeles'
      }
    ],
    columns: [
      { prop: 'date', label: '日期' },
      { prop: 'name', label: '姓名' },
      { prop: 'address', label: '地址' }
    ]
  };
}

接着,我们在模板中使用 v-for 指令动态生成 el-table-column 组件:

<template>
  <div>
    <el-table :data="tableData">
      <el-table-column
        v-for="column in columns"
        :key="column.prop"
        :prop="column.prop"
        :label="column.label">
      </el-table-column>
    </el-table>
  </div>
</template>

这样,我们就实现了根据 columns 数组动态生成表格的列。如果需要添加或删除列,只需修改 columns 数组即可。

动态生成数据

在实际应用中,数据源往往是动态变化的。我们可以通过调用 API 或监听用户操作来更新 tableData。以下是一个简单的示例:

<template>
  <div>
    <el-button @click="fetchData">获取数据</el-button>
    <el-table :data="tableData">
      <el-table-column
        v-for="column in columns"
        :key="column.prop"
        :prop="column.prop"
        :label="column.label">
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      columns: [
        { prop: 'date', label: '日期' },
        { prop: 'name', label: '姓名' },
        { prop: 'address', label: '地址' }
      ]
    };
  },
  methods: {
    fetchData() {
      // 模拟 API 调用
      setTimeout(() => {
        this.tableData = [
          {
            date: '2016-05-03',
            name: 'Tom',
            address: 'No. 189, Grove St, Los Angeles'
          },
          {
            date: '2016-05-02',
            name: 'Jerry',
            address: 'No. 189, Grove St, Los Angeles'
          }
        ];
      }, 1000);
    }
  }
};
</script>

在这个示例中,我们添加了一个按钮,点击按钮时调用 fetchData 方法,从而更新 tableData。通过这种方式,我们可以实现根据实际需求动态更新表格数据。

更高级的动态渲染

上述示例已经展示了基本的动态渲染技巧,但在实际应用中,我们可能需要处理更加复杂的场景。例如:

根据用户角色动态显示不同的列

动态设置列的属性,如宽度、对齐方式、排序等

动态渲染嵌套表格或自定义列内容

下面,我们逐一探讨这些高级应用场景。

根据用户角色动态显示列

在某些应用中,不同的用户角色需要看到不同的表格列。我们可以通过条件渲染来实现这一需求:

data() {
  return {
    tableData: [
      // 数据略
    ],
    columns: [
      { prop: 'date', label: '日期', roles: ['admin', 'user'] },
      { prop: 'name', label: '姓名', roles: ['admin'] },
      { prop: 'address', label: '地址', roles: ['user'] }
    ],
    userRole: 'user'
  };
}

在模板中,我们使用 v-if 指令根据用户角色动态渲染列:

<template>
  <div>
    <el-table :data="tableData">
      <el-table-column
        v-for="column in columns"
        :key="column.prop"
        :prop="column.prop"
        :label="column.label"
        v-if="column.roles.includes(userRole)">
      </el-table-column>
    </el-table>
  </div>
</template>

通过这种方式,我们可以根据用户角色动态显示不同的表格列。

动态设置列的属性

在实际应用中,我们可能需要动态设置列的属性,如宽度、对齐方式、排序等。我们可以在 columns 数组中定义这些属性,然后在模板中动态应用:

data() {
  return {
    tableData: [
      // 数据略
    ],
    columns: [
      { prop: 'date', label: '日期', width: 180, align: 'center', sortable: true },
      { prop: 'name', label: '姓名', width: 180, align: 'left', sortable: false },
      { prop: 'address', label: '地址', align: 'right' }
    ]
  };
}

在模板中,我们使用属性绑定动态应用这些属性:

<template>
  <div>
    <el-table :data="tableData">
      <el-table-column
        v-for="column in columns"
        :key="column.prop"
        :prop="column.prop"
        :label="column.label"
        :width="column.width"
        :align="column.align"
        :sortable="column.sortable">
      </el-table-column>
    </el-table>
  </div>
</template>

动态渲染嵌套表格或自定义列内容

在某些复杂场景中,我们可能需要在表格中嵌套其他表格或自定义列内容。我们可以通过 scoped slot 实现这一需求:

<template>
  <div>
    <el-table :data="tableData">
      <el-table-column
        v-for="column in columns"
        :key="column.prop"
        :prop="column.prop"
        :label="column.label">
        <template v-slot="scope">
          <!-- 自定义列内容 -->
          <div v-if="column.custom">{{ customRender(scope.row, column.prop) }}</div>
          <!-- 默认列内容 -->
          <div v-else>{{ scope.row[column.prop] }}</div>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        // 数据略
      ],
      columns: [
        { prop: 'date', label: '日期' },
        { prop: 'name', label: '姓名', custom: true },
        { prop: 'address', label: '地址' }
      ]
    };
  },
  methods: {
    customRender(row, prop) {
      // 自定义渲染逻辑
      return `${row[prop]} (custom)`;
    }
  }
};
</script>

在这个示例中,我们通过 v-slot 插槽自定义了列内容。如果 column.custom 为 true,则调用 customRender 方法渲染自定义内容,否则显示默认内容。

标签:el,name,ElementUI,label,address,date,table,prop,columns
From: https://blog.51cto.com/u_16307147/11962414

相关文章

  • shell 请求http get api,获取返回值
    在Shell脚本中,你可以使用curl或wget来发送HTTPGET请求并获取返回值。以下是使用curl的示例:#!/bin/bash#APIURL无参数时:URL="http://example.com/api/data"#APIURL有参数时:id=119URL="http://example.com/api/data?id="+${id}#发送GET请求并存储响应response=$(cu......
  • mybaties-plus使用@SelectProvider实现动态SQL
    mybaties-plus使用@SelectProvider实现动态SQL新建DynamicSqlProvider.java类packagecom.muphy.mapper;importorg.apache.ibatis.jdbc.SQL;importjava.util.*;publicclassDynamicSqlProvider{publicStringbuildSelectSql(Map<String,Object>params){......
  • Apache SeaTunnel 2.3.8 新功能与特性预览
    ApacheSeaTunnel最近持续发力,继2.3.6和2.3.7版本之后,2.3.8版本也即将与大家见面。每一个新版本都带来了新的功能和特性,2.3.8版本也不例外,这对于用户而言是一个令人振奋的消息!新的功能意味着SeaTunnel的能力更为强大,性能也会有显著提升。为让社区成员抢先了解2.3.8版本的精彩内......
  • 就这么学Linux 编写Shell脚本
    编写Shell脚本Shell脚本命令的工作方式有下面两种➢交互式:用户每输入一条命令就立即执行➢批处理:由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令.编写简单脚本当前系统已经默认使用Bash作为命令行终端解释器了echo$SHELL如果想查看当前所在工作......
  • nn.Sequential 和 nn.ModuleList()的联系与区别
    nn.Sequential和nn.ModuleList()是PyTorch中用于管理神经网络模型中的子模块的两种不同的方式。nn.Sequential是一个用于构建顺序模型的容器类。它允许按照给定的顺序添加一系列的子模块,并将它们串联在一起形成一个顺序的网络结构。nn.Sequential可以简化模型的定义和前向传......
  • CMakeLists.txt 和 Makefile
    CMakeLists.txt和Makefile都是用于自动化编译和构建软件项目的配置文件,但它们在构建系统中扮演不同的角色,并且使用不同的构建工具。CMakeLists.txtCMakeLists.txt 文件是CMake构建系统的配置文件。CMake是一个跨平台的自动化构建系统,它使用 CMakeLists.txt 文件来生......
  • vue3+el-upload上传文件
    <template><el-uploadclass="avatar-uploader"action="#":headers="headers":http-request="uploadAction":on-change="onchange":file-list="fi......
  • 编译hello world
    新建一个文件夹存放代码在文件夹内新建一个java文件。hello.java在文件内编写代码publicclasshello{ publicstaticvoidmain(String[]args){ System.out.print("helloworld!"); }}编译java文件,在文件目录下打开命令提示符窗口,输入:javachello.java编译java......
  • IIS 屏蔽Help页面和Swagger
    1、MVC屏蔽HelP页面暴露API接口方法:找到目录下的 Areas\HelpPage\Views\Help的Index.cshtml注释如代码中@[email protected]@usingSystem.Web.Http.Description@[email protected]......
  • Layui - table 和 laypage 组合
    要更新表格数据,通过table的reload方法。reload可以重新渲染表格,并更新其数据。<body><tableclass="layui-hide"id="demo-table"></table><divid="demo-laypage"></div><script>layui.use(["table"......