en
Правильное использование @drupal/once

Правильное использование @drupal/once

Для чего нужен @drupal/once

Нам необходима библиотека drupal/once для того, чтобы обеспечить запуск кода ровно один раз. Так как Drupal Behaviors запускаются каждый раз, когда срабатывает Drupal Ajax, нам необходимо удостовериться, что код запускается единожды.

Ранее этим занималась библиотека jQuery.once, теперь у нас есть её нативная альтернатива, которая включена в ядро Drupal с версии 9.2.

Как пользоваться @drupal/once

Add core/once library as a dependency to Drupal library:

my-library:
  dependencies:
    - core/once

Чтобы разрешить глобальную функцию в eslint, добавьте это в файл .eslintrc.json:

{
  "globals": {
    "once": true
  }
}

Примеры использования

Найти один элемент:

const [editorMenu] = once('editor-menu', '.editor-menu', context)
if (editorMenu) {
  console.log(editorMenu)
}

Найти несколько элементов:

// Используя Array.foreach()
const editorMenuItems = once('editor-menu-items', '.menu-item', context)
editorMenuItems.forEach(item, index) => {
  console.log(item, index)
}

// или for...of
const editorMenuItems = once('editor-menu-items', '.menu-item', context)
for (item of editorMenuItems) {
  console.log(item)
}

Сниппеты для Vscode

Для редактора VSCode мы можем подготовить кастомные сниппеты, чтобы не писать once каждый раз вручную:

{
  "once drupal behavior (one element)": {
    "prefix": "oncedrupal",
    "body": "const [${1:element}] = once('${2:once-string}', '${3:selector}', context);\nif (${1:element}) {\n// code \n}",
    "description": "once drupal behavior (one element)"
  },
  "once drupal behavior (array foreach)": {
    "prefix": "oncedrupal",
    "body": "const ${1:array} = once('${2:once-string}', '${3:selector}', context);\n${1:array}.forEach(${4:element} => {\n// code \n});",
    "description": "once drupal behavior (array foreach)"
  },
  "once drupal behavior (array for of)": {
    "prefix": "oncedrupal",
    "body": "const ${1:array} = once('${2:once-string}', '${3:selector}', context);\nfor (const ${4:element} of ${1:array}) {\n// code \n};",
    "description": "once drupal behavior (array for of)"
  }
}

Ссылки:

Последнее обновление: