router.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. export default class Router {
  2. constructor(settings) {
  3. this.routes = settings.routes;
  4. for (let i =0;i<this.routes.length;i++) {
  5. if (!this.routes[i].element) {
  6. const elementName = 'template-' + this.routes[i].component.name.toLocaleLowerCase();
  7. if (!customElements.get(elementName)) customElements.define(elementName, this.routes[i].component);
  8. this.routes[i].element = document.createElement(elementName);
  9. }
  10. }
  11. this.link = settings.link || "router-link";
  12. this.view = settings.view || "router-view";
  13. this.home = window.location.toString();
  14. customElements.define(this.link, RouterLink);
  15. customElements.define(this.view, RouterView);
  16. this.bindEvents();
  17. }
  18. bindEvents() {
  19. document.addEventListener("router-click",(e)=> {
  20. let route = this.routes.find(route=> route.path === e.detail);
  21. if (!route) return;
  22. window.history.pushState({page: 2},String(e.path), this.home+String(e.detail));
  23. // if (!route.element) {
  24. // const elementName = 'template-' + route.component.name.toLocaleLowerCase();
  25. // if (!customElements.get(elementName)) customElements.define(elementName, route.component);
  26. //
  27. //
  28. // route.element = document.createElement(elementName);
  29. //
  30. // }
  31. document.querySelector(this.view).dispatchEvent(new CustomEvent(
  32. 'router-view', {
  33. detail: route.element
  34. }
  35. ));
  36. })
  37. }
  38. }
  39. class RouterView extends HTMLElement {
  40. connectedCallback() {
  41. this.bindEvents();
  42. }
  43. bindEvents() {
  44. this.addEventListener('router-view', (e) => {
  45. this.innerHTML = '';
  46. this.append(e.detail);
  47. });
  48. }
  49. }
  50. class RouterLink extends HTMLElement {
  51. constructor() {
  52. super();
  53. this.bindEvents();
  54. }
  55. bindEvents() {
  56. this.addEventListener('click', () => {
  57. document.dispatchEvent(new CustomEvent(
  58. 'router-click', {
  59. detail: this.getAttribute('to')
  60. }
  61. ));
  62. });
  63. }
  64. }