组件三层_Angular 练级之旅(8)-Zorro Select组件的实现和进阶

本文介绍了Angular Zorro Select组件的三层结构——Input、下拉列表和控制器,并探讨了组件的实现细节,包括API语法、数据传递、状态管理以及遇到的挑战,如搜索模式下的input选中、滚动、层级覆盖等问题。作者提出了通过BehaviorSubject改进组件状态管理和性能优化的建议,并分享了改造组件的经验。
摘要由CSDN通过智能技术生成

0f660406fcc63cc8ca128371e15e5e76.png

很久没写相关的文章,正好前两天把抄来的Select组件重写了一下,简化了一些逻辑。

先看下zorro 中select组件的一个目录结构

a4f33e65d60ef27024c21b77c9f58d81.png

zorro将select组件分成了 三大块

  • Input / 选择框
  • 下拉列表
  • 连接以上2层的控制器层

先看 我们使用的 nz-select 内部的模板到底是什么样的

d36affc5359653b707e7bc0193c918bd.png

正如我们之前提到的那样, 整个组件结构分成三个部分 nz-select-top-control ,nz-option-container,以及该组件自身的 cdk-overlay

而我们的API用法则是

<nz-select>
  <nz-option>
    </...>

API语法更接近于原生的html体验。

实际上<nz-select>并不直接渲染 <ng-content>而是通过选择器

68102dc3353cb9e894f723c7f4f165fe.png

放入变量,传递到 nz-select-top-control ,nz-option-container,进行dom结构的渲染

三层的数据的走向都是相互的。即我变了传给你,你变了传给我。因此数据的传递主要依靠@input 去做数据的传递

b7d811834acb5e6adf32791982d308de.png

整个代码实现逻辑也相对来讲比较复杂,或者说可以有点啰嗦,但是存在一些不得不解决的问题。比如说设置是否打开下拉框这一状态

674ffdcc6d9769543ef0987d2d75b7c4.png

由于API本身比较丰富,功能强大,因此要考虑的部分也比较多

这里主要考虑了几个问题

  1. 在搜索模式下input的选中问题
  2. 滚动问题
  3. overlay打开的时候的层级覆盖问题,(由于overlay在dom中越前面层级越下,因此select可能会和其他同样使用overlay打开的组件层级互相覆盖)此处需把select指定。
  4. top-control和option-container的一些状态设置问题

由于把nz-select本身做数据处理媒介,再加上组件API功能强大,因此组件看上去比较臃肿。

当然,整个select组件在性能上也有些许问题,如该issue描述

Please consider removing cdkConnectedOverlay element when `nz-select`s are not open, like what `nz-dropdown` does · Issue #2465 · NG-ZORRO/ng-zorro-antd​github.com
acf9c29edf075105879699729ade61e2.png

在select未打开的情况下,由于zorro的设置,overlay处于创建好的状态。除非nz-select组件被destroy掉。因此。页面select组件的多少。很大程度上影响了整个系统的性能。

”借鉴“nz-select的思路+ rxjs ,我们可以充分的自己改造/提升一下nz-select组件,将对组件的数据/状态操作抽离到 该select scope的service中去。

b132123e3f9029eea0ce81599f5c3fe7.png

2c2c9987d9efa9221b491461772b2b4e.png

我把大部分状态的操作都通过BehaviorSubject 做媒介传递,(此处不能使用Subject,如需使用,也许会需要shareReplay

32d7cbadae7abda27c3ea8d7e89f1ff9.png

截取部分改变状态的代码。

当然,这里有一个注意点。由于overlay 中的option-container 超脱于三界之外。因此对于service 的scope注入不进去(非同一实例,因此,我们需要手动传值)

f39d5b773a3d93acb75322ef696b4e8c.png

本篇结束,另祝广大Angular devs 元旦快乐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我将为您介绍如何使用Angular和ng-zorro-antd组件库来实现以下7种组件的功能: 1. Button(按钮):创建一个带有文本或图标的按钮,当用户点击该按钮时可以执行相应的操作。 ``` // 在组件中引入Button模块 import { NzButtonModule } from 'ng-zorro-antd/button'; // 在模板中使用按钮组件 <button nz-button>点击我</button> ``` 2. Input(输入框):让用户输入文本或数字,可以添加校验规则。 ``` // 在组件中引入Input模块 import { NzInputModule } from 'ng-zorro-antd/input'; // 在模板中使用输入框组件 <nz-input [(ngModel)]="inputValue" [nzPlaceHolder]="'请输入内容'"></nz-input> ``` 3. Checkbox(复选框):让用户从多个选项中选择一个或多个选项。 ``` // 在组件中引入Checkbox模块 import { NzCheckboxModule } from 'ng-zorro-antd/checkbox'; // 在模板中使用复选框组件 <nz-checkbox [(ngModel)]="isChecked">选我</nz-checkbox> ``` 4. Radio(单选框):让用户从多个选项中选择一个选项。 ``` // 在组件中引入Radio模块 import { NzRadioModule } from 'ng-zorro-antd/radio'; // 在模板中使用单选框组件 <nz-radio-group [(ngModel)]="radioValue"> <label nz-radio nzValue="A">A</label> <label nz-radio nzValue="B">B</label> <label nz-radio nzValue="C">C</label> </nz-radio-group> ``` 5. Select(下拉框):让用户从多个选项中选择一个选项。 ``` // 在组件中引入Select模块 import { NzSelectModule } from 'ng-zorro-antd/select'; // 在模板中使用下拉框组件 <nz-select [(ngModel)]="selectedValue" [nzPlaceHolder]="'请选择'"> <nz-option *ngFor="let option of options" [nzValue]="option.value" [nzLabel]="option.label"></nz-option> </nz-select> ``` 6. Table(表格):用于展示大量的数据。 ``` // 在组件中引入Table模块 import { NzTableModule } from 'ng-zorro-antd/table'; // 在模板中使用表格组件 <nz-table [nzData]="data"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Age</th> <th>Address</th> </tr> </thead> <tbody> <tr *ngFor="let item of data"> <td>{{ item.id }}</td> <td>{{ item.name }}</td> <td>{{ item.age }}</td> <td>{{ item.address }}</td> </tr> </tbody> </nz-table> ``` 7. Modal(弹框):用于展示额外的信息或操作,需要用户进行确认或取消。 ``` // 在组件中引入Modal模块 import { NzModalModule } from 'ng-zorro-antd/modal'; // 在模板中使用弹框组件 <button nz-button (click)="showModal()">打开弹框</button> <nz-modal [(nzVisible)]="isVisible" [nzTitle]="'提示'" [nzContent]="'确定执行该操作吗?'" [nzOkText]="'确定'" [nzCancelText]="'取消'" (nzOnOk)="handleOk()"> </nz-modal> ``` 以上就是7种ng-zorro-antd组件的使用方法,您可以根据自己的需求进行修改和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值