HM-31. Добавлен роутинг для страниц (#9)
This commit is contained in:
48
src/services/EmitService.js
Normal file
48
src/services/EmitService.js
Normal file
@ -0,0 +1,48 @@
|
||||
/**
|
||||
* Класс для создвания объектов с генерацией событий
|
||||
*/
|
||||
class EmitService {
|
||||
/**
|
||||
* События компонента
|
||||
* @type {Object<string, Function[]>}
|
||||
*/
|
||||
_events;
|
||||
|
||||
constructor () {
|
||||
this._events = {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Метод подписки на события компонента
|
||||
* @param {string} eventName - событие компонента, на которое будет реагировать обработчик
|
||||
* @param {Function} listener - обработчик события
|
||||
*/
|
||||
subscribe = (eventName, listener) => {
|
||||
const listeners = this._events[eventName] || [];
|
||||
this._events[eventName] = [
|
||||
...listeners,
|
||||
listener,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Метод генерирует событие
|
||||
* @param {string} eventName - событие, которое необходимо сгенерировать
|
||||
* @param {unknown[]} args - аругемнты, который необходимо передать обработчикам события
|
||||
*/
|
||||
next = (eventName, ...args) => {
|
||||
const listeners = this._events[eventName];
|
||||
listeners.forEach((listener) => {
|
||||
listener(...args);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Очищает все события и слушателей
|
||||
*/
|
||||
clearSubscribes = () => {
|
||||
this._events = {};
|
||||
}
|
||||
}
|
||||
|
||||
export default EmitService;
|
||||
41
src/services/RouteService.js
Normal file
41
src/services/RouteService.js
Normal file
@ -0,0 +1,41 @@
|
||||
import EmitService from './EmitService';
|
||||
import {parse} from 'querystring';
|
||||
|
||||
const ROUTE_CHANGE = 'routeChange';
|
||||
|
||||
class RouteService extends EmitService {
|
||||
constructor () {
|
||||
super();
|
||||
|
||||
this.history = window.history;
|
||||
this._events[ROUTE_CHANGE] = [];
|
||||
}
|
||||
|
||||
getUrlData = () => {
|
||||
return {
|
||||
url: location.pathname,
|
||||
query: parse(location.search.slice(1)),
|
||||
};
|
||||
}
|
||||
|
||||
generateNext = () => {
|
||||
this.next(ROUTE_CHANGE, this.getUrlData());
|
||||
}
|
||||
|
||||
init = () => {
|
||||
this.generateNext();
|
||||
}
|
||||
|
||||
goTo = (url) => {
|
||||
this.history.pushState({}, '', url);
|
||||
this.generateNext();
|
||||
}
|
||||
|
||||
onChange = (listener) => {
|
||||
this.subscribe(ROUTE_CHANGE, listener);
|
||||
}
|
||||
}
|
||||
|
||||
const routeService = new RouteService();
|
||||
|
||||
export default routeService;
|
||||
Reference in New Issue
Block a user