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

如何使用Angular自定义color指令实现卡片hover按分类切换颜色

实现步骤如下:

1. 先修正自定义指令的bug

你的现有指令在constructor中读取@Input属性是拿不到值的,Angular的输入属性会在构造函数执行完成后才完成赋值,同时你重复写了两次设置颜色的逻辑,优化后的指令代码:

import { Directive, Input, ElementRef, Renderer2, HostListener, OnInit } from '@angular/core';

@Directive({
  selector: "[appColor]",
})
export class ColorDirective implements OnInit {
  // 可以直接把输入属性名和指令选择器对齐,使用起来更直观
  @Input() appColor: string;
  constructor(private element: ElementRef, private render: Renderer2) {}

  ngOnInit() {
    // 初始化默认颜色
    this.ChangeColor("black");
  }

  @HostListener("mouseenter") onMouseEnter() {
    this.ChangeColor(this.appColor);
  }

  @HostListener("mouseleave") onMouseLeave() {
    this.ChangeColor("black");
  }

  ChangeColor(color: string) {
    this.render.setStyle(this.element.nativeElement, "color", color);
  }
}

如果你不想修改原有@Input的别名配置,保持@Input("color") color: string的写法也可以,后续绑定的时候对应调整属性名即可。

2. 在卡片组件中配置分类和颜色的映射关系

在你展示todo卡片的组件ts文件中,新增分类到颜色的映射配置,按你实际的分类项调整对应颜色值:

// 卡片组件ts文件
categoryColorMap: Record<string, string> = {
  '工作': '#ff4d4f',
  '生活': '#52c41a',
  '学习': '#1890ff',
  '其他': '#faad14'
};

如果你的todo对象本身就存了对应分类的颜色值,这一步可以省略,直接绑定todo的颜色属性即可。

3. 修改模板代码绑定指令

找到你模板中class为card的div节点,添加自定义指令并绑定对应颜色:

<div routerLink="/todo/{{ todo.id }}" class="card" *ngFor="let todo of todos | filter:searchValue"
  [appColor]="categoryColorMap[todo.category]">
  <!-- 其余原有代码保持不变 -->
  <button class="btn btn-danger" (click)="deleteTodo(todo.id)">X</button>
  <div class="card-body">
    <h3 [class.completed]="todo.completed">{{todo.title | uppercase}}</h3>
    <p [class.completed]="todo.completed">{{todo.description}}</p>
  </div>
  <div>
    <div class="edit-button">
      <div>Category: {{todo.category}}</div>
      <div>
        <button class="btn"><a routerLink="/todo/{{todo.id}}">Edit</a></button>
        <button class="btn" (click)="completeTodo(todo.id)">Complete</button>
      </div>
    </div>
  </div>
</div>

如果你没有修改指令的@Input别名,还是保持@Input("color")的写法,把上面的[appColor]改成[color]即可。

如果需要hover的时候修改卡片的背景色而不是文字颜色,只需要把指令中ChangeColor方法里的"color"改成"backgroundColor"即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:45:03