typescript - 需要帮助重构打字稿功能
问题描述
这是我关于stackoverflow的第一个问题。抱歉,如果它没有达到标准。我会尽力的。
我最近开始了一个 Angular 项目。
这个问题是如何在打字稿中重构 4 个简单的函数(它们做同样的事情)以使其成为 1 个函数。该功能是一个简单的切换,打开并显示更多内容,然后在关闭时将其隐藏。
目前我有四个 div,每个 div 都有自己的功能。所有四个都做完全相同的事情。
您会在 HTML 和 tyepScript 代码中注意到,每个 toogleLinks 函数都会增加 1。例如,toogleLinks1()、toogleLinks2()、toogleLinks3()等。
此外,每个 Div 的 ngIf 指令和 ngClass 指令中使用的变量也增加 1。例如,ngIf = " toggle1 " 、ngIf = " toggle2 "、ngIf = " toggle3 "。
我将在下面展示 HTML 和 typescript 代码。
我希望你们都有你需要的信息。
谢谢!!
<div id = 'menu-main-links'>
<div class = 'main-menu-link-item'>
<!-- click event occurs here-->
<div class = 'submenu-heading' (click)="toogleLinks1($event)" [ngClass]="status1 ? 'open' : 'close'">
<h1>Platform</h1>
</div>
<div class = 'sidebar-submenu' *ngIf = "toggle1" [ngClass]="status1 ? 'open' : 'close'">
<!--revealed content goe here -->
</div>
</div>
<div class = 'main-menu-link-item'>
<!-- click event occurs here-->
<div class = 'submenu-heading' (click)="toogleLinks2($event)" [ngClass]="status2 ? 'open' : 'close'">
<h1>Platform</h1>
</div>
<div class = 'sidebar-submenu' *ngIf = "toggle2" [ngClass]="status2 ? 'open' : 'close'">
<!--revealed content goe here -->
</div>
</div>
<div class = 'main-menu-link-item'>
<!-- click event occurs here-->
<div class = 'submenu-heading' (click)="toogleLinks3($event)" [ngClass]="status3 ? 'open' : 'close'">
<h1>Platform</h1>
</div>
<div class = 'sidebar-submenu' *ngIf = "toggle3" [ngClass]="status3 ? 'open' : 'close'">
<!--revealed content goe here -->
</div>
</div>
<div class = 'main-menu-link-item'>
<!-- click event occurs here-->
<div class = 'about-us-heading' (click)="toogleLinks4($event)" [ngClass]="status4 ? 'open' : 'close'">
<h1>Platform</h1>
</div>
<div class = 'sidebar-submenu' *ngIf = "toggle4" [ngClass]="status4 ? 'open' : 'close'">
<!--revealed content goe here -->
</div>
</div>
</div>
export class LayoutComponent {
constructor() { }
ngOnInit(): void {
}
toggle1 = false;
status1 = false;
toggle2 = false;
status2 = false;
toggle3 = false;
status3 = false;
toggle4 = false;
status4 = false;
toogleLinks1(event: Event){
setTimeout( () =>{
if (!this.toggle1) {
this.toggle1 = true;
this.status1 = !this.status1;
} else{
this.toggle1 = false;
this.status1 = false;
}
},100)
}
toogleLinks2(event: Event){
setTimeout( () =>{
if (!this.toggle2) {
this.toggle2 = true;
this.status2 = !this.status1;
} else{
this.toggle2 = false;
this.status2 = false;
}
},100)
}
toogleLinks3(event: Event){
setTimeout( () =>{
if (!this.toggle3) {
this.toggle3 = true;
this.status3 = !this.status2;
} else{
this.toggle3 = false;
this.status3 = false;
}
},100)
}
toogleLinks4(event: Event){
setTimeout( () =>{
if (!this.toggle4) {
this.toggle4 = true;
this.status4 = !this.status3;
} else{
this.toggle4 = false;
this.status4 = false;
}
},100)
}
}
解决方案
您可以用不同的方式重构当前代码。
解决方案 1: 创建 1 个子组件,您可以在其中将内容和标题作为参数传递。切换逻辑将保留在该子组件中。您可以根据您的要求增强此功能。
export class LinkComponent {
@Input() title: string;
status: boolean;
toogleLinks(toggle: string) {
this.status = !this.status;
}
}
<div class="main-menu-link-item">
<div
class="submenu-heading" (click)="toogleLinks('toggle1')"
[ngClass]="status ? 'open' : 'close'">
<h3>{{title}}</h3>
</div>
<div
class="sidebar-submenu" *ngIf="status"
[ngClass]="status ? 'open' : 'close'">
<ng-content></ng-content>
</div>
</div>
并在父组件中使用该组件。
<div id="menu-main-links">
<app-link title="Platform 1">
<h2>Platform 1</h2>
</app-link>
<app-link title="Platform 2">
<h2>Platform 2</h2>
</app-link>
</div>
解决方案 2: 您可以创建 1 个函数,您只需在其中传递将处理该部分切换的变量名称。
toggle1 = false;
toggle2 = false;
toggle3 = false;
toggle4 = false;
toogleLinks(toggle: string) {
this[toggle] = !this[toggle];
}
并在您的模板中传递该函数中的变量名称。
<div class="main-menu-link-item">
<div class="submenu-heading" (click)="toogleLinks('toggle1')"
[ngClass]="toggle1 ? 'open' : 'close'">
<h3>Platform 1</h3>
</div>
<div class="sidebar-submenu" *ngIf="toggle1"
[ngClass]="status1 ? 'open' : 'close'">
<h2>Platform 1</h2>
</div>
</div>
此外,您不需要状态变量来维护 CSS 类,您可以使用该toggle
变量。
工作代码框:-
https://codesandbox.io/s/toggle-comon-function-qjsou?file=/src/app/app.component.html
推荐阅读
- angular - Angular 中的 Git 工作流 npm 依赖项版本控制
- ms-access - 在查询中添加 IF 条件语句
- google-api - 在 Youtube Data API V3 上过早达到配额 - 优化 search.list
- java - 无法将上下文从 onpostexecute 传递到 sharedpreferences
- azure-devops - 由 PS 脚本导入的证书已损坏私钥
- php - 无法安装 ZMQ php 扩展。找不到 libzmq 安装。但它是通过“brew install zmq”安装的。MacOS 莫哈韦沙漠
- python - 运行不同版本的 Python 会出现“未找到”错误
- python - Plotly:如何在情节中包含多个文本变量?
- android - Android CheckBox 在恢复片段状态时不监听 OnCheckedChangeListener
- c# - Xamarin 表单:为什么 Popupimage 显示 2 次?