Introducing Pages - A component convention to manage pages
Tags: angular, typescript, components
Published: 2017-10-08 22:49:55

---
title: Introducing Pages - A component convention to manage pages
published: true
description: A component convention to manage pages
tags: angular, typescript, components
---

# Previously on...
 - [Widgets introduction](https://dev.to/michaeljota/widgets-and-components-for-angular-2-and-up)
 - [Input-set "pattern" in Widgets](https://dev.to/michaeljota/input-set-pattern-for-widgets-in-angular)
 - [Read-only primitives in Widgets](https://dev.to/michaeljota/readonly-inputs-for-primitives-properties-in-widgets-for-angular)


# And now...

Ok, boys, girls, another people that thinks that you can decide wherever pasta is rice just cause it defines it self as such, right now I had published two of my ways to manages components. I currently separate my angular components into 3 categories, based on what their concern is, widgets, to manage the look of them, components, to manage the behavior of them, and as I will introduce to you today, pages, to manage well, pages. 

# What a _page_ is?

A page is this. What you are looking, what the user will look. Most of the time will be a component that will no be referenced by its `selector`, but by the router at a certain url. And that its the is first difference between a page component and a regular component.

- A page can contain another pages

For sure. But, they all should be represented by a url state, nothing more, nothing else. They should never be reference by it's `selector`, cause, then I won't be much of a page, would it?

- A page should not have a `selector`

If the `@Component` decorator does not have a `selector` them is unlikely to reference a page by such. I think is just safer to not do so. 

- A page should not have a behavior

Much as our AppComponent, or wherever you call the entry component of your application, the logic there should be minimum. Most of the AppComponent delegates the behavior to their inner components, the router, and the services.

- A page must have components only

Well, you have to show something after all. But, why components only? Well, it happens that if you put a widget there, them is more likely to put the logic of that widget inside your page, and it should not be there. 

- A page should have end-to-end test

This is what you user will interact, so I think is logic to put aside this your e2e for that page. If your components should have a unit test beside them, and your widgets should... I think they should have a unit test as well, then your pages should contain nothing more than e2e tests. After all you test all your components. Right? RIGHT? 'Cause I don't.

# A page

What would be life without examples to copy-paste? Well, I'm sorry, this is just too useless to be copy-pasted. But still, I hope this idea keeps in you mind. 

```typescript
import { Component } from '@angular/core';

@Component({
  template: `
    <my-add-todo></my-add-todo>
    <my-visible-todo-list></my-visible-todo-list>
    <my-filter-buttons-widget></my-filter-buttons-widget>
  `,
})
export class TodoPage {}
```

In this example we can see how a todo page would be. When you navigate to `/todo` url you would know exactly what to expect, only the components you previously defined, with the behavior you put into them. 

# Thanks you!
As always, I hope you liked this post, and I'm very thankful that you read all of it. If you have comments about it, ideas or just want to say that this should not be like this, please, use the comment section below. I'm looking forward to read you too.