Веб-компоненты и JS элементов DOM с заполнителем - PullRequest
0 голосов
/ 08 мая 2020

В последнее время все запрыгивают на поезд веб-компонентов, чтобы узнать о c элементах пользовательского интерфейса. Пока я читаю об этом, он выглядит естественным способом написания пользовательских элементов браузером. Но у меня вопрос вроде. насколько он отличается от js способа расширения div (заполнителей) для улучшения и предоставления некоторых функций, которые нам нужны.

Например: если мне нужен компонент таблицы Веб-компонент: <my-table></my-table> ---- Соответствующий код в JS --- Скомпилировать в файл js и использовать в скрипте извне

JS Способ: <div id="my-table"></div> ---- код в JS ---- Компилировать в JS и использовать в теге скрипта для внешнего использования Я беру пример ag-grid, чтобы было понятно

ex: ag-grid https://www.ag-grid.com/javascript-grid/

<div id="myGrid" style="height: 200px; width:500px;" class="ag-theme-alpine"></div>

new agGrid.Grid(gridDiv, gridOptions);

Что за разница и преимущества одного над другим? Пожалуйста, помогите

1 Ответ

3 голосов
/ 09 мая 2020

Моя первая реакция была:

В чем разница между ES5 и ES6? (если вы все еще не используете ES3)

Есть так много различий, что скоро будет сравнение яблок и яблок.

Читайте все блоги, играйте с Custom Элементы, изучите.


TL; DR

  • Используйте элементы DOM с Javascript - Требуется порядок (1 и 2 можно переключать) :

    1. Загрузить JavaScript
    2. Создать элементы DOM
    3. Выполнить JavaScript
    4. Преобразовать DOM Элементы
  • Использовать API пользовательских элементов: - Порядок не имеет значение :

  • Создание пользовательских элементов DOM

  • Загрузка JavaScript


Различия и преимущества

Предположим, клиент хотел ТРИ сетки на странице:

  • Вы добавляете 3 DIV: <div id="myGrid1" .../> <div id="myGrid2" .../> <div id="myGrid3" .../>

  • Для их активации необходимо также добавить: new agGrid.Grid(document.getElementById("myGird1") new agGrid.Grid(document.getElementById("myGird2") new agGrid.Grid(document.getElementById("myGird3")

  • Это ужасно неправильно, если JavaScript выполняет до элементов DOM Итак, вы добавляете прослушиватель событий: window.addEventListner("onload",()=>ActivateGrids());

Обратите внимание, как вам нужно было добавить сюда (какой-то тип) глобальную функцию; так скрестите пальцы, никто другой не собирается перезаписывать ваш драгоценный код;

  • Думая о вышеизложенном, вы решаете перестраховаться:

    • вы переименуйте все свои идентификаторы во что-то действительно уникальное (и действительно нечитаемое)
    • вы переименуете все свои селекторы БЭМ в действительно уникальные (и нечитаемые) имена
    • React, Angular, Vue сделай это (частично) для тебя, но вы используете Native JavaScript, поэтому вам придется делать это вручную.
  • Почему не работает? Вы запускаете F12, отлаживаете и хлопаете головой ... вы сделали опечатку в ID .. grid и gird

  • 2 дня спустя ... Штопать! Заказчик хочет 4-ю сетку! Прежде чем он поставит перед вами пятую ошибку, вы решите провести рефакторинг своей функции ActivateGrids для обработки любого количества сеток на странице

[...document.querySelectorAll('[id*="MyuniQueIDgridComponent_KUT!"]')].forEach(...)

У нас есть компонент! ! Играть: Королева, мы чемпионы!

  • 3 недели спустя Клиент имеет очень простой запрос: Это можно сделать за полчаса , он говорит. Мы хотим изменить цвет фона с помощью атрибута на DIV

  • Вы в тупике! Изменение свойств с помощью атрибутов DIV!?! Почему они не могут просто вызвать JavaScript экземпляр Grid?!?

    Вы пытались обучить клиента много лет назад; У Семанти c HTML НЕТ будущего! Нанимайте только СТАРШИХ веб-разработчиков ... но он бы не стал их слушать

    Какой смысл с <my-grid background=green></my-grid>

    Когда вы можете это сделать, круто программистский путь:

    document.getElementById("myGird1").mySetPropperty("background","green");

    Но Клиент оплачивает вашу ипотеку; так что вы узнаете о MutationObserver и прикрепите его к тегу BODY. ( Это одно предложение легко написать, но кодирование потребует серьезных усилий! )

  • 5 месяцев спустя клиент говорит, что больше не хочет вас нанимать, потому что добавление / удаление сеток в их SPA вызывает утечку памяти.

Введите API пользовательских элементов (он же веб-компоненты)

Все вышеперечисленное (лишь немного) проще с помощью Framework ..

Но вы хотите создать повторно используемый компонент, а НЕ приложение, созданное с компонентами

  • Итак, вы решили использовать go API собственных пользовательских элементов

    Вы думали об использовании Lit или Stencil, или Hybrids, или Component Libray X; но решил против них. Использование Native JavaScript занимает всего пару дополнительных строк кода, но прежде всего вы не хотите вводить зависимость (вы помните ранние jQuery дни, когда существовала дюжина альтернатив, и вам приходилось отказываться от проекта $$$, потому что разработчик выбрал Mootools)

Собственный JavaScript будет работать, пока JavaScript поддерживается в браузере.

  • Вы определяете, как (конечный) пользователь будет использовать ваш компонент:

    <KCB-grid rows=3 columns=5 background=color ></KCB-grid>

  • Затем вы программируете компонент. Я взял пространство имен KCB- из вашего дескриптора Twitter Это пространство имен (как и ваша глобальная функция) должно быть уникальным на странице См. Код ниже, это текстовая строка, поэтому ее можно создавать динамически! <KCB-Grid-Customer rows=3 columns=5 background=color ></KCB-grid-Customer>

  • Что работает в любом современном браузере Есть полифилл для IE11; но, честно говоря, избегайте IE11. Вы перестали поддерживать IE9 годами go. Настало время прекратить поддержку IE11, этот момент сейчас ... даже Microsoft заявила об этом больше года a go

  • Работает со всеми фреймворками и библиотеки (кроме React вам нужно проделать дополнительную работу .. потому что Facebook все еще пытается навязать свой «стандарт» остальному миру) https://custom-elements-everywhere.com/libraries/react/results/results.html

  • Нет проблем с onload, не имеет значения, объявлены ли элементы до или после скрипта. Пользовательские элементы автоматически обновляются.

  • вы можете сделать .innerHTML = "<KCB-Grid></KCB-Grid>" в любое время. Заказчик тоже этого хотел, но нанял другого программиста, чтобы сделать это с помощью настраиваемого элемента ниже

  • Нет CSS Проблемы с уникальностью селектора ... и, вероятно, вообще не будут выполнять БЭМ

  • rows и columns можно изменить в любой момент Запустить фрагмент кода, щелкнуть по сетке

<template id="KCB-GRID">
  <!-- use TEMPLATES! don't mess with JSX, CSSinJS or HTML in textstrings! -->
  <style>
    #grid { /* no BEM, no forced unique IDs or style names */
      display: grid;
      grid-template-columns: repeat(var(--columns), 1fr);
      grid-auto-rows:        minmax(min-content, max-content);
      gap: .2em;
    }
    #grid div {
      background: var(--background);
      text-align: center;
    }
  </style>
  <div id=grid></div>
</template>

<KCB-Grid columns=5 rows=3 background=#FF9933></kcb-grid>
<KCB-Grid columns=3 rows=3 background=white  ></kcb-grid>
<KCB-Grid columns=4 rows=3 background=#138808></kcb-grid>

<script>
  customElements.define('kcb-grid', class extends HTMLElement {
    static get observedAttributes() {
      return [ "columns", "rows" ] // only these can be changed at any time
    }
    constructor() {
      super().attachShadow({ mode: 'open' })
             .append(document.getElementById(this.nodeName).content.cloneNode(true));
      this.grid = this.shadowRoot.querySelector("#grid");
    }
    connectedCallback() {
      const random = (x, y) => Math.floor(Math.random() * (y + 1 - x) + x);
      this.setProperty("background");
      this.grid.onclick = () => {
                this.setAttribute("columns", random(2, 6));
                this.setAttribute("rows",    random(2, 4));
      }
    }
    attributeChangedCallback(name, oldValue, newValue) {
      let columns = this.setProperty("columns");
      let rows =    this.setProperty("rows"   );
      this.grid.innerHTML = "<div>Hello World!</div>".repeat(columns * rows);
    }
    setProperty(name, value = this.getAttribute(name)) {
      this.grid.style.setProperty("--" + name, value);
      return value;
    }
    disconnectedCallback() {} //clean memory, remove listeners, etc.
  });
</script>

Cue Tom Lehrer's Elements song: https://www.youtube.com/watch?v=AcS3NOQnsQM

И многое другое для Custom Elements

Вы можете играть с KCB-Grid

В этом JSFiddle: https://jsfiddle.net/CustomElementsExamples/nk9co3bu/

...