You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Angular与Angular Material实现用户自定义表格列添加及命名的组件开发

基于Angular + Angular Material实现自定义数据表格组件

1. 前期准备

确保项目已集成Angular Material,若未集成,先通过命令安装依赖并导入核心模块:

ng add @angular/material

在使用该组件的模块中,导入所需的Material模块及表单模块:

// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatTableModule } from '@angular/material/table';
import { MatInputModule } from '@angular/material/input';
import { MatButtonModule } from '@angular/material/button';
import { FormsModule } from '@angular/forms';

import { AppComponent } from './app.component';
import { CustomDataTableComponent } from './custom-data-table/custom-data-table.component';

@NgModule({
  declarations: [AppComponent, CustomDataTableComponent],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    MatTableModule,
    MatInputModule,
    MatButtonModule,
    FormsModule
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

2. 定义数据结构

在组件目录下创建数据模型,明确列和行的格式:

// custom-data-table.model.ts
export interface TableColumn {
  key: string; // 列的唯一标识,对应行数据的键名
  name: string; // 用户自定义的列显示名称
}

export interface TableRow {
  [key: string]: any; // 支持任意键值对,适配自定义列结构
}

3. 组件核心逻辑实现

编写组件类,实现添加列、添加行、单元格数据更新等核心功能:

// custom-data-table.component.ts
import { Component } from '@angular/core';
import { TableColumn, TableRow } from './custom-data-table.model';

@Component({
  selector: 'app-custom-data-table',
  templateUrl: './custom-data-table.component.html',
  styleUrls: ['./custom-data-table.component.scss']
})
export class CustomDataTableComponent {
  columns: TableColumn[] = [];
  dataSource: TableRow[] = [];
  displayedColumns: string[] = []; // 绑定MatTable的列显示配置

  // 添加新列
  addColumn(columnName: string): void {
    if (!columnName.trim()) return;
    // 生成唯一键名避免重复
    const columnKey = `col_${Date.now()}`;
    this.columns.push({ key: columnKey, name: columnName });
    this.updateDisplayedColumns();
    // 为已有行补充新列的空值
    this.dataSource.forEach(row => row[columnKey] = '');
    this.dataSource = [...this.dataSource];
  }

  // 添加新行
  addRow(): void {
    const newRow: TableRow = {};
    // 为每个列初始化空值,确保表格单元格完整
    this.columns.forEach(col => newRow[col.key] = '');
    this.dataSource.push(newRow);
    this.dataSource = [...this.dataSource]; // 触发表格刷新
  }

  // 更新表格显示列列表
  private updateDisplayedColumns(): void {
    this.displayedColumns = this.columns.map(col => col.key);
  }

  // 同步单元格数据变更
  onCellChange(row: TableRow, columnKey: string, value: any): void {
    row[columnKey] = value;
  }
}

4. 模板与交互实现

编写HTML模板,整合控件与Angular Material表格,实现可视化操作:

<!-- custom-data-table.component.html -->
<div class="table-controls">
  <!-- 列添加控件 -->
  <mat-form-field appearance="fill">
    <mat-label>输入列名</mat-label>
    <input matInput #columnNameInput placeholder="例如:姓名">
  </mat-form-field>
  <button mat-raised-button color="primary" 
          (click)="addColumn(columnNameInput.value); columnNameInput.value=''">
    添加列
  </button>

  <!-- 行添加控件 -->
  <button mat-raised-button color="accent" style="margin-left: 10px;" (click)="addRow()">
    添加行
  </button>
</div>

<!-- 自定义表格主体 -->
<div class="table-container">
  <table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
    <!-- 动态生成列定义 -->
    <ng-container [matColumnDef]="col.key" *ngFor="let col of columns">
      <th mat-header-cell *matHeaderCellDef> {{ col.name }} </th>
      <td mat-cell *matCellDef="let row">
        <input matInput [(ngModel)]="row[col.key]" 
               (ngModelChange)="onCellChange(row, col.key, $event)">
      </td>
    </ng-container>

    <!-- 渲染表头与数据行 -->
    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
  </table>
</div>

5. 基础样式优化

添加简单样式优化布局体验:

// custom-data-table.component.scss
.table-controls {
  margin: 20px;
  display: flex;
  align-items: center;
  gap: 12px;
}

.table-container {
  margin: 0 20px;
}

table {
  width: 100%;
}

mat-cell input {
  width: 100%;
  padding: 4px;
}

可选扩展功能

如果需要更完整的体验,可按需添加:

  • 列删除/重命名功能
  • 行删除功能
  • 数据导出(如JSON、Excel)
  • 列排序、筛选功能
  • 单元格数据格式校验

内容的提问来源于stack exchange,提问作者Devine92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:06:38