В предыдущем блоге мы узнали о том, как работают функции edit и save. Они описывают структуру внешнего вида блока. Однако они вернули только простые абзацы. В этом блоге мы узнаем, как можно изменить структуру блока, когда пользователь меняет блок.

Состояние блока:

Чтобы добиться динамического изменения структуры блока, когда пользователь изменяет блок, state of a block сохраняется в сеансе редактирования как простой объект JavaScript.

Каждый раз, когда блок обновляется, вызывается функция редактирования.

Атрибуты:

Чтобы снова извлечь объект JavaScript из сохраненного содержимого сообщения и повторно использовать его, мы используем attribute property. типа блока. Они предоставляют механизм для сопоставления сохраненной разметки с представлением блока в JavaScript.

Источники атрибутов:

Источники атрибутов помогают извлекать значения атрибутов блока из сохраненного содержимого сообщения. Они помогают сопоставить сохраненную разметку с представлением блока в JavaScript. Если attribute source не указан, атрибут будет сохранен (и прочитан) в разделителе комментариев блока.

hpq: источники атрибутов - это расширенный набор функций, предоставляемых hpq, небольшой библиотекой, используемой для синтаксического анализа и запроса HTML-разметки в форме объекта.

Вы можете использовать разные типы источников атрибутов. Например children, attribute, text, html, query, meta

Пример атрибутов source: 'meta'

registerBlockType( 'myguten-block/test-block', {

   attributes: {
      content: {
         type: 'array',
         source: 'children',
         selector: 'p'
      },
   },

Когда вы определяете эти атрибуты в registerBlockType (), они передаются edit() и save()

source: ‘children’ означает, что он будет искать текст внутри селектора <p>
Как вы используете его в своей функции редактирования:

edit( props ) {
let { attributes , setAttributes, className } = props;
    function onChange( event ) {
        setAttributes( { author: event.target.value } );
    }

    return <p onChange={ onChange }/>{ attributes.content }</p>;
},

После сохранения в базе данных его можно извлечь с помощью props.attributes

save: ( props ) => {
   console.log( 'save-props', props );
   return (
      <p>{ props.attributes.content } </p>
   );
}

Разделитель комментариев

Сохраняя данные в комментариях HTML, мы будем знать, что не нарушим остальной HTML в документе, что браузеры должны его игнорировать, и что мы могли бы упростить наш подход к синтаксическому анализу документа.

Давайте создадим атрибут,

registerBlockType( 'myguten-block/test-block', {
   title: 'Basic Example',
   icon: 'smiley',
   category: 'layout',
attributes: {
      contentStyle: {
         type: 'object',
         default: {
            color: 'black',
            textAlign: 'left'
         }
      }
   },
}

Когда мы не указываем источник в атрибуте contentStyle, данные сохраняются в разделителе комментариев. И его можно извлечь в функции save с помощью props.attributes.contentStyle.

Преимущества использования разделителя комментариев

  • В то время как атрибуты HTML сложно правильно проанализировать, комментарии довольно легко описываются начальным <!-- followed by anything except -- until the first -->. Эта простота и вседозволенность означает, что синтаксический анализатор может быть реализован несколькими способами без необходимости правильного понимания HTML.
  • Мы можем использовать литералы JSON внутри комментария.
  • Эти явные границы также защищают повреждение в одном блоке от перетекания в другие блоки или запятнения всего документа.

Компоненты Гутенберга

Поскольку многие блоки имеют одно и то же сложное поведение, доступны повторно используемые компоненты, чтобы упростить реализацию edit функции вашего блока. Распространенные из них:

  • Богатый текст
  • BlockControls
  • Выравнивание
  • Осмотреть
  • Цветовая палитра

Вы можете найти компоненты в репозитории Gutenberg git
https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/

Компонент 1-RichText

Вместо того, чтобы создавать узлы DOM с помощью createElement(), мы можем инкапсулировать это поведение с помощью Components. Компоненты обеспечивают возможность повторного использования и позволяют скрыть сложность в их автономных единицах. Есть ряд доступных компонентов. Поговорим об одном из них, который называется RichText компонент. Его можно рассматривать как элемент textarea, который позволяет редактировать расширенное содержимое, включая жирный шрифт, курсив, гиперссылки и т. Д.
Вы можете найти компонент RichText, определенный в https://github.com/WordPress/gutenberg/blob/master/packages /block-editor/src/components/rich-text/index.js

Не забудьте добавить wp-editor в массив зависимостей зарегистрированных дескрипторов скрипта при вызове wp_register_script.

Возвращаемое значение registerBlockType ()

Если вы console log( results ), что возвращает registerBlockType (), вы получите:

attributes:
className: {type: "string"}
__proto__: Object
category: "layout"
edit: ƒ edit(props)
icon: {src: "smiley"}
name: "myguten-block/test-block"
save: ƒ save()
title: "Basic Example"

Реквизиты
Если вы console.log( props ) внутри edit () и когда вы что-то редактируете, вы получаете следующие данные в реквизитах

// Result for console.log( props );
attributes:
content: ["h"]
__proto__: Object
className: "wp-block-myguten-block-test-block"
clientId: "be406ad0-a7e6-45ca-b47d-5ff44673b280"
insertBlocksAfter: ƒ ()
isSelected: true
isSelectionEnabled: true
mergeBlocks: ƒ ()
name: "myguten-block/test-block"
onReplace: ƒ ()
setAttributes: ƒ ()
toggleSelection: ƒ ()

2-BlockControls и AlignmentToolbar

Если возвращаемое значение функции edit вашего типа блока включает элемент BlockControls, эти элементы управления будут отображаться на панели инструментов выбранного блока. Это покажет, что ряд кнопок управления может отображаться на панели инструментов над выбранным блоком.

Компонент 3-Inspect и ColorPalette

Инспектор используется для отображения редко используемых настроек или настроек, требующих больше места на экране.

Если вы включите элемент InspectorControls в возвращаемое значение функции edit вашего типа блока, добавьте в него некоторое содержимое, эти элементы управления и содержимое будут отображаться в области инспектора.
Давайте добавим ColorPalette компонент внутри него. Мы хотим добиться того, чтобы, когда пользователь выбирает любой цвет на палитре, цвет текста нашего настраиваемого блока должен измениться на этот.
https://github.com/imranhsayed/myguten-block/tree / инспектор-контроль-компонент

Ядро WordPress:

Вы можете найти основные файлы JavaScript Gutenberg в репозитории Gutenberg Git https://github.com/WordPress/gutenberg/.
Например, registerBlockType () находится в https://github.com/WordPress/ gutenberg / blob / master / packages / blocks / src / api / registration.js .
Кроме того, вы можете найти компоненты в репозитории Gutenberg git
https://github.com/WordPress/gutenberg / blob / master / packages / block-editor / src / components /