简单谈谈Angular中的独立组件的使用
目录
- 前言
- 如何创建一个独立组件
- 在独立组件中导入已有的模块
- 使用独立组件启动Angular应用
- 为独立组件配置路由
- 配置依赖注入
- 源代码
前言
Angular 14一项令人兴奋的特性就是Angular的独立组件终于来了。
在Angular 14中, 开发者可以尝试使用独立组件开发各种组件,但是值得注意的是Angular独立组件的API仍然没有稳定下,将来可能存在一些破坏性更新,所以不推荐在生产环境中使用。
如何创建一个独立组件
对于已有的组件,我们可以在
@Component()
中添加standalone: true的标识,然后我们可以在没有@NgModule()
的情况下直接使用imports
导入其他模块了。如果是新建组件,可以使用
ng generate component --standalone
的命令,直接创建一个独立组件, 例如:ng generate component button-list --standalone
@Component({selector: 'app-button-list',standalone: true,imports: [CommonModule,],templateUrl: './button-list.component.html',styleUrls: ['./button-list.component.scss']})export class ButtonListComponent implements OnInit
在独立组件中导入已有的模块
我们可以在
imports
中添加已有的模块,以MatButtonModule
为例:imports: [CommonModule,MatButtonModule,],
这样子我们就可以在
ButtonListComponent
中使用MatButtonModule
的mat-button
组件了:Link
效果图:
【简单谈谈Angular中的独立组件的使用】
文章图片
使用独立组件启动Angular应用
第一步, 将
AppComponent
设置为独立组件:@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss'],standalone: true,})export class AppComponent {...}
第二步,将
AppModule
的imports中的导入的模块加入到AppComponent
的imports中,但是有两个模块例外: BrowserModule
和BrowserAnimationsModule
。如果导入的话,可能会导致**
BrowserModule
have already been loaded. If you need access to common directives such as NgIf and NgFor, import the CommonModule
instead.**的问题:文章图片
第三步,删除
app.module.ts
文件最后一步, 将
main.ts
中的:import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; platformBrowserDynamic().bootstrapModule(AppModule).catch(err => console.error(err));
改为:
bootstrapApplication(AppComponent).catch(err => console.error(err));
这样子我们就实现了使用独立组件启动Angular组件了。
为独立组件配置路由
我这里分别有三个独立组件:
HomeComponent
, ButtonListComponent
和 ChipListComponent
,然后在
main.ts
中创建ROUTES对象const ROUTES: Route[] = [{path: '',pathMatch: 'full',redirectTo: 'home'},{path: 'home',component: HomeComponent},{path: 'button',loadComponent: () =>import('./app/button-list/button-list.component').then((mod) => mod.ButtonListComponent),},{path: 'chip',loadComponent: () =>import('./app/chip-list/chip-list.component').then((mod) => mod.ChipListComponent),},];
其中
ButtonListComponent
和ChipListComponent
使用loadComponent
去实现路由懒加载。最后在
bootstrapApplication
的第二个参数中使用providers
注册RouterModule
好了。bootstrapApplication(AppComponent, {providers: [importProvidersFrom(RouterModule.forRoot([...ROUTES])),],}).catch(err => console.error(err));
效果图:
配置依赖注入
当我们想要启动Angular应用的时候,可能需要注入一些值或者服务。 在
bootstrapApplication
, 我们可以通过providers
来注册值或者服务。比如,我有一个获取图片的url,需要注入到
PhotoService
中:bootstrapApplication(AppComponent, {providers: [{provide: 'photoUrl',useValue: 'https://picsum.photos',},{provide: PhotosService, useClass: PhotosService },importProvidersFrom(RouterModule.forRoot([...ROUTES])),importProvidersFrom(HttpClientModule)],})
PhotoService
代码如下:@Injectable()export class PhotosService {constructor(@Inject('photoUrl') private photoUrl: string,private http: HttpClient) { }public getPhotoUrl(i: number): string {return `${this.photoUrl}/200/300?random=${i}`; }}
源代码
本文所使用的源代码
线上demo
推荐阅读
- #|pandas的简单使用(数据统计)
- 关于|关于 Angular PWA 应用中的 ngsw.json 文件
- Angular|Angular 里的 Service Worker
- Angular|Angular 应用要启用 Service Worker 所需满足的一些前提条件
- springboot|搭建一个springboot+templates+mysql+mybatisplus代码生成器简单框架
- Python3常用到的函数总结|Python实战项目—金融量化分析(数据的简单预处理)
- gozero mapreduce源码分析和简单实现
- 函数,递归以及dom简单操作
- GraphQL入门总体创建教程
- Java实现简单学生管理系统