Angular6 写一个简单的Select组件示例
Select组件目录结构
/src /app /select /select.ts /select.html /select.css /options.ts /index.ts
//select.ts
import{Component,ContentChildren,ViewChild,Input,Output,EventEmitter,QueryList,HostListener}from'@angular/core';
import{NzOptionDirective}from'./option';
@Component({
selector:'nz-select',
templateUrl:'./select.html',
styleUrls:['./select.css']
})
exportclassNzSelectComponent{
@Input()isOpen:boolean;
@Input()value:string;
@Output()valueChange=newEventEmitter();
label:string;
@ContentChildren(NzOptionDirective,{descendants:true})options:QueryList;
ngAfterContentInit(){
this.options.forEach(option=>{
option.select.subscribe(()=>{
this.value=option.value;
this.label=option.renderLabel();
this.options.map(r=>r.isSelected=false);
option.isSelected=true;
this.valueChange.emit(option.value);
})
setTimeout(()=>{
option.isSelected=option.value===this.value;
if(option.isSelected){
this.label=option.renderLabel();
this.valueChange.emit(option.value);
}
});
})
}
@HostListener('click')
onClick(){
this.isOpen=!this.isOpen;
}
}
//select.html {{label}}
//select.css
:host{
display:inline-block;
border:1pxsolid;
cursor:pointer;
text-align:center;
border-radius:4px;
}
:host.current{
padding:5px10px;
background:red;
color:#FFF;
text-align:center;
width:40px;
outline:none;
border:none;
}
::ng-deepdiv:not(.current):hover{
background:green;
color:#FFF;
}
::ng-deep.selected{
font-weight:700;
background:red;
color:#FFF;
}
//options.ts
import{Directive,HostBinding,HostListener,Input,Output,ElementRef,EventEmitter}from'@angular/core';
@Directive({
selector:'[nzOption]'
})
exportclassNzOptionDirective{
@Input()value:string;
constructor(privateel:ElementRef){}
@Output()select=newEventEmitter();
@HostBinding("class.selected")
isSelected:boolean;
renderLabel(){
return(this.el.nativeElement.textContent||"").trim();
}
@HostListener('click')
onClick(){
this.select.emit();
}
}
//index.ts
import{NzOptionDirective}from'./option';
import{NzSelectComponent}from'./select';
exportconstcomponents=[
NzSelectComponent,
NzOptionDirective
];
应用Select组件
结构
/src /app/ /app.module.ts /app.component.ts /app.component.html
//app.module.ts
import{NgModule}from'@angular/core';
import{BrowserModule}from'@angular/platform-browser';
import{FormsModule}from'@angular/forms';
import{CommonModule}from'@angular/common';
import{components}from'./select';
import{AppComponent}from'./app.component';
@NgModule({
imports:[BrowserModule,FormsModule,CommonModule],
declarations:[AppComponent,...components],
bootstrap:[AppComponent]
})
exportclassAppModule{}
//app.component.ts
import{Component}from'@angular/core';
@Component({
selector:'my-app',
templateUrl:'./app.component.html',
styleUrls:['./app.component.css']
})
exportclassAppComponent{
name='Angular';
defaultValue:any='value5'
menus:any[]=[];
ngOnInit(){
for(leti=0;i<=6;i++){
this.menus.push({
value:'value'+i,
label:'item'+i
})
}
}
}
//app.component.html{{m.label}}
selectvalueis{{defaultValue|json}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。