Учебник Angular о том, как перезагрузить/обновить один компонент или все приложение и повторно использовать логику в нескольких компонентах.
Существует большая разница между перезагрузкой одного компонента и перезагрузкой всего приложения. Мы увидим, как оба могут быть достигнуты.
Это очень простое приложение. Существует 3 компонента: AppComponent, в котором размещается TestComponent, и TestComponent, в котором размещается ChildComponent.
У нас всего 2 цели:
- Возможность перезагрузить текущий маршрут, дочерний маршрут, родительский маршрут и все приложение.
- Используйте наследование, чтобы добавить эту функциональность в один компонент, чтобы любой другой компонент мог расширять и повторно использовать ее.
Давайте сначала проверим CommonFunctionalityComponent, который будут расширять компоненты AppComponent, TestComponent и ChildComponent.
В компоненте мы написали 2 метода: reloadComponent() для перезагрузки другого компонента или текущего маршрута и reloadPage() для перезагрузки всего приложения.
Функция reloadPage() говорит сама за себя.
В reloadComponent() мы приняли 2 аргумента: self и urlToNavigateTo.
Если self содержит значение true, это означает, что текущий маршрут необходимо перезагрузить.
2-й аргумент urlToNavigateTo нужен, только если self имеет значение false, потому что в этом случае, если мы не хотим перезагружать текущий маршрут, нам нужно указать путь, который мы хотим загрузить второй аргумент.
const url=self ? this.router.url :urlToNavigateTo;
Таким образом, константа URL будет содержать путь текущего маршрута, если аргумент self равен true, иначе она будет содержать значение аргумента urlToNavigateTo.
this.router.navigateByUrl(‘/’,{skipLocationChange:true}).then(()=>{ this.router.navigate([`/${url}`]).then(()=>{ console.log(`After navigation I am on:${this.router.url}`) }) })
В приведенном выше фрагменте кода я сначала перехожу к '/' без изменения URL-адреса, о котором заботится свойство skipLocationChange. После этого перехода я перехожу к пути, содержащемуся в константе ссылка.
I. Давайте теперь посмотрим, как AppComponent расширяет CommonFunctionalityComponent.
Шаблон AppComponent: у нас есть 3 кнопки для перезагрузки текущего маршрута, для перезагрузки всего приложения и, наконец, для загрузки TestComponent.
reloadPage() наследуется от CommonFunctionalityComponent.
reloadCurrent() определяется классом AppComponent.
Класс AppComponent:
В классе AppComponent мы определили только reloadCurrent(), где мы вызвали reloadComponent(), унаследованный от CommonFunctionalityComponent.
Мы передали true в качестве аргумента функции reloadComponent(), что означает, что мы хотим перезагрузить текущий маршрут, а не переходить к какому-либо другому маршруту.
Вот так наше приложение выглядит сейчас. Как вы можете видеть в консоли, constructor() и ngOnInit() AppComponent выполнились:
- Сначала я нажимаю кнопку Обновить текущий маршрут. Как вы можете видеть в консоли, навигация прошла успешно, но AppComponent не перезагрузился снова. AppComponent можно перезагрузить только путем перезагрузки всей страницы.
2. Затем мы нажимаем кнопку Обновить страницу, которая вызывает window.location.reload(). Это перезагрузит AppComponent, как и ожидалось. Выполнены constructor() и ngOnInit() AppComponent:
3. При нажатии на кнопку Load TestComponent загрузится TestComponent. Как вы можете видеть в консоли ниже, выполняются constructor() и ngOnInit() TestComponent:
II. Переходим к TestComponent.
Шаблон TestComponent. Этот шаблон имеет 4 кнопки, которые перезагружают текущий маршрут, перезагружают страницу, загружают ChildComponent и перезагружают ChildComponent:
Класс TestComponent:
В reloadCurrent() мы вызвали reloadComponent(), унаследованный от CommonFunctionalityComponent.
Мы передали true в качестве аргумента функции reloadComponent(), что означает, что мы хотим перезагрузить текущий маршрут, а не переходить к какому-либо другому маршруту.
reloadChild() также будет вызывать reloadComponent(), но с другими аргументами. Мы передаем false в качестве первого аргумента, чтобы указать, что мы не хотим перезагружать текущий маршрут, а второй аргумент указывает маршрут, который мы хотим перезагрузить.
- Нажатие кнопки Обновить текущий маршрут приведет к выводу, как показано ниже. TestComponent constructor() и ngOnInit() выполняются снова.
2. Нажав кнопку Обновить страницу, вы снова перезагрузите все приложение. Выполняются constructor() и ngOnInit() компонентов AppComponent и TestComponent.
3. Нажав кнопку Загрузить дочерний компонент, вы загрузите дочерний компонент. Выполняются constructor() и ngOnInit() ChildComponent.
4. Нажав кнопку Reload ChildComponent,выполнит constructor() и ngOnInit() ChildComponent. и снова TestComponent.
III. Переходим к классу ChildComponent. Класс и шаблон говорят сами за себя, поскольку они следуют тому же шаблону, что и AppComponent и TestComponent.
Шаблон дочернего компонента:
Класс дочернего компонента:
- Нажатие кнопки Обновить текущий маршрут снова выполнит constructor() и ngOnInit() дочернего компонента и тестового компонента.
2. Нажатие на кнопку Обновить страницу снова выполнит constructor() и ngOnInit() AppComponent, ChildComponent и TestComponent.
3. Нажав кнопку Обновить тестовый компонент, мы перейдем к маршруту /test и выполним constructor() и ngOnInit. () компонента TestComponent еще раз.
Весь код доступен по адресу:
Дальнейшее чтение
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку. Подпишитесь на нас в Twitter, LinkedIn, и Раздор.