🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] >[success] # 初始组件 接下来讲解一下如何创建组件以及如何封装一个完整的组件 >[success] ## 创建组件 1. **使用指令创建组件** ~~~ // 创建组件指令 ng generate component 组件名(大驼峰形式) // 简写 ng g c 组件名 ~~~ 默认会在 **src\app** 文件夹下创建出来组件,总共有4个文件,样式文件html文件逻辑文件,还有个测试文件如图 ![](https://img.kancloud.cn/11/cb/11cba36747ce9e6428d5bfc2065b87c0_1327x734.png) 如果不想直接在 **app** 下创建组件,而是在 **app/components/** 下进行创建,这样写指令即可 ~~~ // 在conpoments文件下创建ScrollableTab组件 ng g c conpoments/ScrollableTab ~~~ 这里注意,如果是新创建的组件,都会自动在 **src\app\app.module.ts**文件中引入这个新创建的组件,如下图 ![](https://img.kancloud.cn/32/bb/32bb8add10fed3c5302118acd56feb60_978x533.png) >[success] ## 在根(父组件)组件中引用子组件 1. **子组件代码** **src\app\components\scrollable-tab\scrollable-tab.component.html 页面元素文件** ~~~ <ul> <li *ngFor="let menu of menus; let i = index; let f= first; let even= even;"> <a href="#" [class.active]="i == selectedIndex" [class.first]="f" [class.even]="even" (click)="selectedIndex = i">{{ menu.title }}</a> </li> </ul> ~~~ **src\app\components\scrollable-tab\scrollable-tab.component.css 页面样式文件** ~~~ ul{ padding: 0; margin: 0; display: flex; } ul li { display: inline-block; margin: 0 5px; white-space: nowrap; } a{ text-decoration: none; } ::-webkit-scrollbar{ display: none; } .active{ color: red; } .first{ color: green; } .even{ color: pink; } ~~~ **src\app\components\scrollable-tab\scrollable-tab.component.ts 页面逻辑代码文件** ~~~ import { Component, OnInit } from '@angular/core'; // 声明菜单接口 interface TopMenu { title: string; link: string; } @Component({ selector: 'app-scrollable-tab', templateUrl: './scrollable-tab.component.html', styleUrls: ['./scrollable-tab.component.css'] }) export class ScrollableTabComponent implements OnInit { selectedIndex = -1; // 高亮选中的颜色下标 menus:TopMenu[] = [ // 菜单列表 { title:'热门', link: '' }, { title:'男装', link: '' }, { title:'百货', link: '' }, { title:'运动', link: '' }, { title:'手机', link: '' }, { title:'家纺', link: '' }, { title:'食品', link: '' }, { title:'电器', link: '' }, { title:'鞋包', link: '' }, { title:'汽车', link: '' }, { title:'水果', link: '' }, { title:'电脑', link: '' }, { title:'内衣', link: '' }, { title:'家装', link: '' }, { title:'母婴', link: '' }, { title:'美妆', link: '' }, { title:'家具', link: '' }, ] constructor() {} ngOnInit(): void { } } ~~~ 这里其实还有一个测试文件,里面的代码是生成时候的样子没有改动,就不在这里写了,然后 **子组件** 的文件夹中还要创建一个 **index.ts** 文件,方便外部引入组件, **src\app\components\scrollable-tab\index.ts 导出组件文件** ~~~ // 导出组件文件 export * from './scrollable-tab.component' ~~~ 然后这个文件导出到 **components 文件夹** 中,这时在 **components** 也需要创建一个 **index.ts** 文件,向外导出组件 **src\app\components\index.ts(components文件夹中的index.ts文件)** ~~~ // 继续把整个 scrollable-tab 组件导出 export * from './scrollable-tab' ~~~ 2. **父组件引入子组件** ~~~ <!-- 引入组件 --> <app-scrollable-tab></app-scrollable-tab> ~~~ 3. **简化 app.module.ts 中组件引入** 下面引入 **ScrollableTabComponent** 组件就会方便多了,这就是为什么创建组件时在组件中定义 **index.ts** 的原因了 **app.module.ts** ~~~ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; // 之前的写法 // import { ScrollableTabComponent } from './components/scrollable-tab/scrollable-tab.component'; // 简化后的写法 import { ScrollableTabComponent } from './components'; // 这样就省了一层的引用操作 @NgModule({ declarations: [ // 声明我这个模块有哪些组件 AppComponent, ScrollableTabComponent ], imports: [ // 该组件依赖的其他模块 BrowserModule ], providers: [], // 目前不讲解,猜测是跟vue的组件跨组件传值差不多 bootstrap: [AppComponent] // 只有根模块才有bootstrap属性,也就是【根组件】 }) export class AppModule { } ~~~ >[success] # 真机调试 ![](https://img.kancloud.cn/40/d8/40d89eca87a7461d3332d8c800d15255_867x436.png) 1. 首先到dos命令上执行ipconfig找到自己IP地址 2. 然后按照上图操作 3. [编辑器写html的快捷键方式](https://docs.emmet.io/cheat-sheet/) >[success] # 总结 ![](https://img.kancloud.cn/28/ad/28ad1cf1353c7837d5e29d32e87e8249_942x456.png) 1. **索引类型** 就是给 **对象的属性定义类型** >[success] # 组件的概念 下面3张图讲一下接下来要开发的组件,以及组件的概念,以及ts接口的概念 ![](https://img.kancloud.cn/6e/68/6e68bc98385dae45f87387317579a852_1090x614.png) ![](https://img.kancloud.cn/48/48/48486cf790bf9ce77e481a647ba6f4a8_1056x503.png)