Angular中制作一个按钮组件

发布时间:2023-03-26

本文将会介绍如何在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('按钮真正的点击事件');
  }
}

// 点击会在控制台中输入下面两句话:
// 按钮组件中点击事件
// 按钮真正的点击事件
其他阅读

Nginx重定向HTTP到HTTPS

HTTP协议以纯文本形式进行数据的交互,数据明文传输,容易被监听,窃取和伪造,HTTPS在HTTP的基础上,使用了TLS/SSL对通信过程进行加密,数据得到了有效的保护,就算被拦截到也无法获取信息,更没法实施中间人攻击。本文将会介绍如何在Nginx中配置HTTP重定向到HTTPS。

查看原文

软考中级-系统集成项目管理工程师复习总章

2025年下半年的软考将于11月开考,我将复习的过程笔记使用一个系列文章记录,本文只作为总章,将每个章节的复习时间和难度进行罗列,方便大家跟随学习。

查看原文

Js文件上传

文件上传是一个前端比较常见的功能,无论是以前的MVC客户端,还是现代化SPA客户端中,但万变不离其宗,其内核基本不变,本文就此讨论简单文件上传(以图片为例子)。

查看原文

Web前端中实现自定义右键菜单

在原生的桌面应用中,右键菜单是个很常见也很常用的东西,但是在Web应用中,由于浏览器自带了右键菜单,所以我们很少见到应用有自己的右键菜单,但不常见并不代表没有,本文就会介绍一个右键菜单的实现。

查看原文

在ASP.NET Core中使用过滤器

ASP.NET Core是一个高性能的Web开发框架,过滤器(Filter)在ASP.NET Core中被用于路由方法之上,可以在路由方法执行前后完成一些额外的操作。本文将会介绍在ASP.NET Core中使用 IActionFilter 实现过滤器并读取路由方法中的参数。

查看原文