You need to enable JavaScript to run this app. Angular单组件多表单切换显示及对应提交的高效实现方案
优惠活动
大模型
产品
解决方案
定价
更多

Angular单组件多表单切换显示及对应提交的高效实现方案

实现方案

第一步:TS逻辑调整

使用枚举管理表单状态,比布尔值扩展性更强,后续新增设置用户名密码的展示逻辑也无需重构现有结构。

// 组件顶部先定义表单类型枚举
enum FormType {
  LOGIN = 'login',
  VERIFY_EMAIL = 'verifyEmail',
  SET_ACCOUNT = 'setAccount'
}

组件内部新增状态变量,调整原有请求和提交逻辑:

export class YourComponent implements OnInit {
  // 暴露枚举给模板使用
  public readonly FormType = FormType;
  // 默认展示登录表单
  public currentForm: FormType = FormType.LOGIN;
  // 提前声明三个表单实例
  public loginForm!: FormGroup;
  public verifyForm!: FormGroup;
  public setAccountForm!: FormGroup;
  public authKey: string | null = null;
  public hasSubmit = false;

  constructor(
    private router: ActivatedRoute,
    private userService: UserService,
    private fb: FormBuilder
  ) {}

  ngOnInit(): void {      
    this.router.paramMap.subscribe(paramMap => {
      this.authKey = paramMap.get('authkey')
      if (this.authKey !== null) {
        console.log("Auth key" , this.authKey)
        this.userService.getCode(4, this.authKey).subscribe(
          (res: any) => {
            console.log("res", res)
            // 接口返回code则切换到邮箱验证表单
            if(res?.code) {
              this.currentForm = FormType.VERIFY_EMAIL;
            }
          },
          (err: any) => {
            // 错误提示逻辑
          }
        );
      }
    });
    // 表单初始化逻辑省略,自行补充三个FormGroup的字段定义
  }

  // 统一提交方法,根据当前表单类型处理对应逻辑
  onSubmit() {
    this.hasSubmit = true;
    switch(this.currentForm) {
      case FormType.LOGIN:
        if(this.loginForm.invalid) {
          this.hasSubmit = false;
          return;
        }
        // 提交登录表单逻辑,取this.loginForm.value传参
        console.log('登录数据:', this.loginForm.value);
        break;
      case FormType.VERIFY_EMAIL:
        if(this.verifyForm.invalid) {
          this.hasSubmit = false;
          return;
        }
        // 提交邮箱验证表单逻辑,取this.verifyForm.value传参
        console.log('验证数据:', this.verifyForm.value);
        break;
      case FormType.SET_ACCOUNT:
        if(this.setAccountForm.invalid) {
          this.hasSubmit = false;
          return;
        }
        // 提交设置账号表单逻辑,取this.setAccountForm.value传参
        console.log('设置账号数据:', this.setAccountForm.value);
        break;
    }
  }
}

第二步:模板HTML调整

每个表单外层容器加*ngIf判断对应表单状态即可,无需额外的隐藏类控制:

<!-- 登录表单 -->
<div class="login-container-section" *ngIf="currentForm === FormType.LOGIN">
  <form [formGroup]="loginForm" novalidate (ngSubmit)="onSubmit()">    
    <div id="login-form">
      <button mat-raised-button class="full-width v-btn-lrg" color="primary" type="submit" [disabled]="hasSubmit">SUBMIT</button>            
      <mat-divider class="relative"></mat-divider>
    </div>    
  </form>
</div>

<!-- 邮箱验证表单 -->
<div class="verify-container-section" *ngIf="currentForm === FormType.VERIFY_EMAIL">
  <form [formGroup]="verifyForm" novalidate (ngSubmit)="onSubmit()">    
    <div id="verify-form">
      <button mat-raised-button class="full-width v-btn-lrg" color="primary" type="submit" [disabled]="hasSubmit">SUBMIT</button>            
      <mat-divider class="relative"></mat-divider>
    </div>    
  </form>
</div>

<!-- 设置用户名密码表单 -->
<div class="setaccount-container-section" *ngIf="currentForm === FormType.SET_ACCOUNT">
  <form [formGroup]="setAccountForm" novalidate (ngSubmit)="onSubmit()">    
    <div id="setaccount-form">
      <button mat-raised-button class="full-width v-btn-lrg" color="primary" type="submit" [disabled]="hasSubmit">SUBMIT</button>            
      <mat-divider class="relative"></mat-divider>
    </div>    
  </form>
</div>

该方案状态统一管理,无冗余判断逻辑,后续新增表单场景仅需扩展枚举、补充对应判断分支即可,维护成本极低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 23:09:01