В прошлом блоге я в основном говорил о настройке среды разработки, а в этом блоге речь пойдет о разработке интерактивного диалога.

С тех пор я работаю над преобразованием еще нескольких диалогов в React. Я преобразовал три диалога — диалог свойств календаря, диалог предупреждений календаря и диалог печати в их эквиваленты React. Диалоговое окно будильника календаря и диалоговое окно печати все еще нуждаются в некоторой доработке логики состояния, но это не займет много времени. Вот несколько скриншотов этих диалогов.

Создавая эквиваленты реакции, я обнаружил, что XUL сильно зависит от атрибутов и их значений. HTML не работает с атрибутами и их значениями так, как это делает XUL. HTML позволяет минимизировать атрибуты, а с React есть некоторые другие трудности, связанные с атрибутами. React автоматически игнорирует все атрибуты HTML не по умолчанию, поэтому, чтобы добавить эти атрибуты, я должен добавить их явно, используя метод setAttribute для элемента, когда он смонтирован. Вот короткий фрагмент кода, который показывает, как я добавляю пользовательские атрибуты HTML и обновляю их в React.

class CalendarAlarmWidget extends React.Component {
 componentDidMount() {
  this.addAttributes(this.props);
 }
 componentWillReceiveProps(nextProps) {
  // need to call removeAttributes first 
  // so that previous render attributes are removed
  this.removeAttributes();
  this.addAttributes(nextProps);
 }
 addAttributes(props) {
  // add attributes here
 }
 removeAttributes() {
  // remove attributes here
 }
}

XUL также имеет элемент диалога, который используется вместо окна для диалоговых окон. Я также сделал его реактивным эквивалентом, который имеет почти все атрибуты и функциональные возможности диалогового элемента XUL. Так как XUL имеет немного другую технику расположения элементов по сравнению с HTML, я опустил некоторые атрибуты, специфичные для макета. С мощью современного CSS довольно легко создать макет, поэтому вместо того, чтобы управлять макетом с помощью атрибутов, я больше полагаюсь на CSS, чтобы делать эти вещи. Некоторые методы, такие как centerWindowOnScreen и moveToAlertPosition, зависят от родительской оболочки XUL, поэтому я также отказался от них для эквивалента React.

В XUL есть некоторые элементы, HTML-эквиваленты которых недоступны, а для некоторых XUL-элементов HTML-эквиваленты не имеют такой же структуры, поэтому их внешний вид значительно отличается. Прекрасным примером может служить menulist, HTML-эквивалент которого — select. В отличие от menulist, прямым дочерним элементом которого является menupopup, который включает в себя все элементы меню, элемент select непосредственно включает в себя все параметры. поэтому пользовательский интерфейс select нельзя сделать точно таким же, как у menulist. Элементы option также нельзя настраивать, в отличие от menuitem, а также не поддерживаются стили. Хотя полезно иметь компоненты React, которые ведут себя аналогично своим аналогам XUL, в конце концов останется только HTML. Поэтому неизбежно, что некоторые функции, бесполезные для новых компонентов, будут удалены.

Я сделал несколько пользовательских элементов React, чтобы обеспечить все функции, которые предоставляют существующие диалоговые окна, хотя я все еще использую HTML-элемент select в некоторых местах вместо пользовательского элемента списка меню, потому что использую javascript и дополнительный CSS только для того, чтобы сделать элемент, похожий на аналог XUL, того не стоит.

Поскольку каждая платформа имеет свой особый внешний вид, естественно, существуют различия в правилах CSS. Я организовал файлы таким образом, чтобы было легко написать правила, общие для всех платформ, но также добавить различия для каждой ОС. Многие различия пользовательского интерфейса обрабатываются автоматически с помощью правил -moz-appearance, которые предписывают платформе Mozilla использовать стили ОС для отображения элементов. Веб-приложение автоматически определит вашу ОС, чтобы вы могли увидеть, как диалог будет выглядеть на разных платформах.

Я подумал, что было бы здорово получить быстрые предложения и отзывы о пользовательском интерфейсе диалогов от сообщества, поэтому я добавил раздел комментариев на каждую страницу диалога. Я буду добавлять в веб-приложение больше интересных функций, которые, возможно, помогут в достижении прогресса в этом проекте.

Благодаря BrowserStack за предоставление бесплатных планов OSS, теперь я могу быстро проверить, как мои диалоги выглядят на Windows и Mac.

Спасибо Юлии (разработчику Devtools в Mozilla) за то, что она нашла время для обсуждения реализации диалога в ответ, я надеюсь, что в будущем будет больше обсуждений в ответ :)

Не стесняйтесь проверять диалоги в веб-приложении и комментировать, если у вас есть какие-либо вопросы.

Ознакомьтесь с другими блогами из серии проектов Convert XUL to HTML

Часть 1: Первые шаги — преобразование XUL в HTML

Часть 2: есть на что посмотреть — конвертировать XUL в HTML

Часть 3. Простое стало легким — преобразование XUL в HTML