Creating Reusable Angular Components for Consistent UI
Learn how to design reusable components that maintain a consistent look and feel across your Angular application, improving both development speed and user experience.
0 likes
23 views
Rule Content
{ "title": "Creating Reusable Angular Components for Consistent UI", "description": "Learn how to design reusable components that maintain a consistent look and feel across your Angular application, improving both development speed and user experience.", "category": "Angular Cursor Rules", "rules": [ { "name": "Component Naming Convention", "description": "Ensure all component selectors are prefixed with a unique identifier to prevent conflicts and enhance readability.", "pattern": "selector: 'app-(\\w+)'", "replacement": "selector: 'myapp-$1'", "message": "Component selectors should be prefixed with 'myapp-' to maintain consistency and avoid conflicts." }, { "name": "Single Responsibility Principle", "description": "Each component should have a single, well-defined responsibility to enhance maintainability and reusability.", "pattern": "class (\\w+)Component \\{[^}]*\\}", "replacement": "class $1Component { // Ensure this component adheres to the Single Responsibility Principle }", "message": "Review this component to ensure it has a single, well-defined responsibility." }, { "name": "Use of Input and Output Decorators", "description": "Utilize @Input and @Output decorators for component communication to promote reusability and modularity.", "pattern": "@Component\\({[^}]*\\})\\s*export class (\\w+)Component \\{", "replacement": "@Component({ /* component metadata */ })\nexport class $1Component {\n @Input() inputProperty: type;\n @Output() outputEvent = new EventEmitter<type>();\n // Component logic\n}", "message": "Consider using @Input and @Output decorators for effective component communication." }, { "name": "Avoid Logic in Templates", "description": "Move complex logic from templates to component classes to improve readability and maintainability.", "pattern": "\\*ngIf=\"[^\"]*\\?[^:]*:[^\"]*\"", "replacement": "*ngIf=\"condition\"", "message": "Avoid using ternary operators in templates; move logic to the component class." }, { "name": "Use of Lifecycle Hooks", "description": "Implement appropriate lifecycle hooks to manage component behavior effectively.", "pattern": "export class (\\w+)Component \\{", "replacement": "export class $1Component implements OnInit, OnDestroy {\n ngOnInit() {\n // Initialization logic\n }\n ngOnDestroy() {\n // Cleanup logic\n }\n // Component logic\n}", "message": "Implement OnInit and OnDestroy lifecycle hooks to manage component initialization and cleanup." }, { "name": "CSS Encapsulation", "description": "Encapsulate component styles to prevent unintended side effects on other components.", "pattern": "@Component\\({[^}]*\\})", "replacement": "@Component({ /* component metadata */ encapsulation: ViewEncapsulation.Emulated })", "message": "Use ViewEncapsulation.Emulated to encapsulate component styles." }, { "name": "Dependency Injection", "description": "Use Angular's dependency injection to manage service dependencies, enhancing testability and modularity.", "pattern": "constructor\\(\\)", "replacement": "constructor(private serviceName: ServiceType) { }", "message": "Inject necessary services through the constructor to utilize Angular's dependency injection." }, { "name": "Avoid Direct DOM Manipulation", "description": "Use Angular's templating and data-binding features instead of direct DOM manipulation to ensure compatibility and maintainability.", "pattern": "document\\.querySelector\\(.*\\)", "replacement": "// Avoid direct DOM manipulation; use Angular's templating features instead", "message": "Avoid using document.querySelector; utilize Angular's templating and data-binding features." }, { "name": "Implement OnPush Change Detection", "description": "Use OnPush change detection strategy to optimize performance by reducing unnecessary checks.", "pattern": "@Component\\({[^}]*\\})", "replacement": "@Component({ /* component metadata */ changeDetection: ChangeDetectionStrategy.OnPush })", "message": "Set changeDetection to ChangeDetectionStrategy.OnPush to optimize performance." }, { "name": "Use TrackBy with ngFor", "description": "Implement trackBy function with ngFor to improve rendering performance for dynamic lists.", "pattern": "\\*ngFor=\"let item of items\"", "replacement": "*ngFor=\"let item of items; trackBy: trackByFn\"", "message": "Use trackBy function with ngFor to enhance performance when rendering lists." } ] }