#inheritance #vue.js #lifecycle #vue-class-components
#наследование #vue.js #жизненный цикл #vue-класс-компоненты
Вопрос:
Я использую Vue CLI 3.x с классами TypeScript (файлами .tsx).
Я хочу реализовать обработку разрешений для всех моих представлений.
Самым простым сценарием было бы: Маршрутизация к компоненту X; есть разрешение на доступ? остаться; нет разрешения? перенаправление на страницу по умолчанию.
Я уже реализовал логику для правильной обработки всего, но я испытываю трудности с хорошей архитектурой.
На данный момент я добавил свою защищенную функцию обработчика в компонент Vue ViewBase
, и все мои компоненты, которые также являются представлениями, наследуют этот класс и вызывают эту функцию в своем created()
цикле жизненного цикла. Это выглядит так:
import Vue from 'vue';
import Component from 'vue-class-component';
@Component
class ViewBase extends Vue {
protected handleAccess() {
// route here
}
}
@Component
class MyView extends ViewBase {
private created() {
this.handleAccess();
}
}
Но мне не нравится вызывать что-то в созданном хук вручную в каждом из моих компонентов. Могу ли я как-то это автоматизировать?
Ответ №1:
Вы можете использовать микшины (TypeScript).
Определите свой код доступа к дескриптору в created
хуке непосредственно в микшировании и включите (или расширьте в TypeScript) это микширование для всех ваших компонентов представления. Перехват будет объединен с вашими компонентами просмотра, точно так же, как если бы вы определили перехват в компонентах просмотра.
// mixin.ts
import Vue from 'vue'
import Component from 'vue-class-component'
// You can declare a mixin as the same style as components.
@Component
export default class MyMixin extends Vue {
created () {
// handle access code
}
}
// my-view.ts
import Component, { mixins } from 'vue-class-component'
import MyMixin from './mixin.ts'
@Component
export class MyView extends mixins(MyMixin) {
}
Комментарии:
1. Очень приятно! Хотя кажется, что мне нужно выполнить свой
created()
хукprotected
в моем классе mixin, поэтому я все еще могу использовать его в своих дочерних компонентах. Но для меня это не имеет большого значения. Большое спасибо!