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
其他阅读

Entity Framework Core链接Oracle的问题

最近使用 Entity Framework Core 来链接 Oracle 11g 数据库,发现很多 LINQ 语句使用起来都会有问题,查看日志输出发现是生成SQL语句无法被 11g 版本执行,好在Oracle官方已经给我们提供了解决方案。

查看原文

本地部署DeepSeek大模型服务

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

查看原文

HTTP状态码

HTTP状态码为客户端提供了一种理解事务处理结果的边界方式。本文列出一些原因短语,所使用的是HTTP/1.1规范所定义的。

查看原文

LinqPad 8 分享下载

LinqPad是一个 .Net 快速验证工具,使得.Net开发者可以不借助 Visual Studio 就可以快速验证想法,毕竟vs冷启动和创建项目耗时久,负担大。本文分享一个LinqPad学习版,可直接下载使用。

查看原文

解决sqlite依赖无法打包单文件的问题

在一次WPF开发中,选用了sqlite作为内嵌数据库,使用 ystem.Data.SQLite 库来调用,在使用 Fody 进行单文件打包时,发现打包文成后会出现 x86 和 x64 两个特定的文件夹,分别对应着32位和64位的 SQLite.Interop.dll,本文介绍修改项目文件来实现将 sqlite 通信库一起打包成单文件的方法。

查看原文