Skip to content

列表静态与动态渲染分析

在 Vue 前端列表页面中,使用 el-table-column 逐个渲染(方式一)和通过 v-for 基于数组渲染(方式二)是两种常见实现方式,它们在灵活性、可维护性、功能支持等方面各有优劣,以下是深度对比:

1. 实现方式差异

  • 方式一(逐个字段渲染)
    手动编写每个 el-table-column 组件,明确指定每个列的 proplabel、格式化逻辑等,例如:

    vue
    <el-table :data="tableData">
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="age" label="年龄"></el-table-column>
      <el-table-column label="操作">
        <template #default="scope">
          <el-button @click="handleEdit(scope.row)">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
  • 方式二(v-for 数组渲染)
    先定义一个列配置数组(如 columns),包含每个列的 proplabelrender 等属性,再通过 v-for 循环渲染 el-table-column,例如:

    vue
    <el-table :data="tableData">
      <el-table-column 
        v-for="col in columns" 
        :key="col.prop" 
        :prop="col.prop" 
        :label="col.label"
      >
        <template v-if="col.render" #default="scope">
          {{ col.render(scope) }}
        </template>
      </el-table-column>
    </el-table>
    
    <script>
      export default {
        data() {
          return {
            columns: [
              { prop: "name", label: "姓名" },
              { prop: "age", label: "年龄" },
              {
                label: "操作",
                render: (scope) => (
                  <el-button onClick={() => this.handleEdit(scope.row)}>
                    编辑
                  </el-button>
                ),
              },
            ],
          };
        },
      };
    </script>

2. 核心对比维度

维度方式一(逐个渲染)方式二(v-for 数组渲染)
灵活性低。列的增减、修改需手动修改模板,不适合动态列场景。高。通过修改 columns 数组即可动态增删列,支持动态配置(如权限控制显示列)。
可维护性列少时清晰直观,列多时模板冗长,修改需定位到具体列。列配置集中在 columns 数组,修改只需调整数组,适合多列场景(如 10+列)。
功能支持原生支持 el-table-column 所有特性(如排序、筛选、自定义模板),写法直接。需通过配置项映射特性(如 sortable: true),自定义模板需用 render 函数或插槽,写法较间接。
开发效率列少时开发快,无需额外定义配置数组。列多时开发效率高(一次定义,多处复用),但需提前设计配置结构。
可读性模板结构直观,直接看到每个列的逻辑,易于理解。列逻辑分散在 columns 数组和 render 函数中,复杂列可能降低可读性。
性能无额外性能开销,模板编译直接。v-for 循环会增加少量渲染开销(可忽略,除非列数极多),render 函数性能略低于模板。
兼容性完全兼容 Element UI/Plus 的所有列特性,无额外适配成本。部分高级特性(如嵌套列、复杂表头)需特殊处理配置数组,可能存在适配成本。
扩展性扩展列需修改模板,不适合复用(如多个列表共享列配置)。配置数组可抽离为公共函数/文件,支持跨组件复用,易于扩展(如全局注册通用列)。

3. 适用场景

  • 优先选方式一

    • 列表列数少(如 5 列以内),且固定不变;
    • 列逻辑简单,无需动态配置;
    • 需要使用 el-table-column 高级特性(如嵌套表头、树形结构),且希望写法直观。
  • 优先选方式二

    • 列表列数多(如 10 列以上),或列需要动态显示/隐藏(如根据用户权限);
    • 多个列表共享相同的列配置(如复用操作列、通用筛选列);
    • 需要通过接口动态获取列配置(如后端返回自定义列);
    • 追求配置化开发,减少模板冗余。

4. 注意事项

  • 方式二中,render 函数的写法在 Vue 2 中需依赖 jsxcreateElement,Vue 3 中可结合 <script setup lang="tsx"> 简化;
  • 复杂列(如包含表单、弹窗的操作列)在方式二中可能导致 render 函数冗长,可通过 作用域插槽 优化:
    vue
    <el-table-column v-for="col in columns" :key="col.prop">
      <template #default="scope" v-if="col.slot">
        <slot :name="col.slot" :row="scope.row"></slot>
      </template>
    </el-table-column>
  • 动态列场景下,需确保 columns 数组的 key 唯一且稳定,避免 v-for 导致的组件频繁销毁重建。

总结

两种方式的核心差异在于 “静态编写” vs “动态配置”:方式一适合简单、固定的列表,注重直观性;方式二适合复杂、动态的列表,注重灵活性和可维护性。实际开发中可根据列数、动态需求、复用性等因素选择,也可混合使用(如固定列用方式一,动态列用方式二)。

Released under the MIT License.