Angular中制作一个按钮组件

本文将会介绍如何在Angular中制作一个按钮组件,直接在原生按钮上添加特性即可使用,还提供多种颜色方便切换。

预览

使用组件的方法如下,只需要在原生的button元素上加上 app-button 特性,该按钮也可变成一个特定组件,通过 color 特性,可以指定按钮的主题样式。

<button app-button color="primary" (click)="onClick($event)">测试</button>
<button app-button color="negative" (click)="onClick($event)">测试</button>

开发

创建组件

使用angular cli创建一个angular组件,请使用 generate component

ng g c app-button

元数据特性

配置组件的元数据,修改 selector,指定该组件的调用方式以及该组件仅可以用于按钮元素。定义检测策略为 ChangeDetectionStrategy.OnPush,同时在host里需要指定一下主题的使用方式,这里加上了两个主题 primaryaccent

@Component({
  selector: 'button[app-button]',
  templateUrl: './button.component.html',
  styleUrls: ['./button.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush,
  host: {
    '[class.app-primary]': 'color === "primary"',
    '[class.app-negative]': 'color === "accent"',
  }
})

模板

组件模板中,使用angular提供给我们的内容投影来实现用户自定义组件内容,详细使用可以参考 官方文档-内容投影

<div class="container">
    <ng-content></ng-content>
</div>

样式

在样式代码里,我们可以使用 :host 来完成对组件本身样式的修改,在其中定义两个颜色样式,分别是 app-primaryapp-accent ,其中对组件的背景颜色做出区分。

$primary-color:rgb(0, 132, 15);
$negative-color:rgb(185, 30, 72);

:host {
  position: relative;
  border-radius: 8px;
  border: none;
  outline: none;
  padding: 1rem;
  transition: background-color .25s;
  overflow: hidden;
  color: white;

  &.app-primary {
    background-color: $primary-color;
  }

  &.app-negative {
    background-color: $negative-color;
    color: white;
  }

}

在组件类内部,我们定义一个公开字段 color 用来接收组件调用时传入的主题色配置,其中还使用到了 @HostBinding@HostListener 来分别实现组件的属性监听和行为监听,更进一步,我们可以在此基础上实现类似material中按钮点击时出现波纹动画的效果。

export class ButtonComponent implements OnInit, OnDestroy {

  @Input()
  color: 'primary' | 'accent' = 'primary';

  @HostBinding('style.border') 
  border:string='1px solid #000';

  @HostListener("click")
  click() {
    console.log('按钮组件中点击事件')
  }

  constructor(
    private readonly _elementRef: ElementRef<HTMLButtonElement>,
    private readonly _focusMonitor: FocusMonitor
  ) { }

  ngOnInit(): void {
    this._focusMonitor.monitor(this._elementRef);
  }

  ngOnDestroy(): void {
    this._focusMonitor.stopMonitoring(this._elementRef);
  }

}

使用

只需要在原生按钮元素上加上特性,该按钮即可变成我们的组件按钮。其中,传入 color 来实现不同颜色的切换。

<button app-button color="primary" (click)="onClick($event)">测试</button>
<button app-button color="accent" (click)="onClick($event)">测试</button>

在组件类中实现对应的事件响应,在按钮点击的时候,会依次调用监听的事件响应。

export class AppComponent {
  title = 'test-com';

  onClick(e: Event): void {
    console.log('按钮真正的点击事件');
  }
}

// 点击会在控制台中输入下面两句话:
// 按钮组件中点击事件
// 按钮真正的点击事件
发布时间:2023-03-26
其他阅读

Linux中查看,添加,修改,删除用户和用户组

将用户分组是Linux系统中对用户进行管理及控制访问权限的一种手段。某个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。当一个用户同时是多个组中的成员时,登录时所属的为默认组,而其他组称为附加组。本文将会介绍在 Linux 中查看,添加,修改,删除用户和用户组,注意:权限管理非常重要,可能一不小心就导致系统无法登录,请谨慎操作

查看原文

本地部署DeepSeek大模型服务

之前的文章介绍了怎么对接DeepSeek的API实现自己的助手,但是依旧使用的DeepSeek官方服务器,在高峰期还是会出现超长延时的情况,本文介绍另一种思路,通过在本机上部署DeepSeek大模型服务来告别卡顿崩溃。

查看原文

HTTP方法

HTTP报文中包含了方法,指的是客户端希望服务器对资源执行的动作,是一个单独的词,比如GET,POST,OPTIONS等,本文将会介绍主流的几种方法。

查看原文

扩展Serilog实现日志推送平台

最近在完成一个服务管理平台,提供可视化管理车间控制服务,包括服务的启停,日志的查看。在各服务中使用 Serilog 对日志进行记录,推送到服务管理平台,再进行统一分发,各客户端同步查看服务运行日志。

查看原文

Windows的刘海生成器

其实是很早之前在论坛讨论当时苹果率先推出了带刘海的 mac book pro 的时候,就花了几分钟做了一个模拟刘海的软件,可以给 Windows 系统加上刘海。

查看原文