Как установить атрибут DOM (то есть стиль), используя Reason/Bucklescript?

Как бы я написал следующий JavaScript:

var element = document.querySelector('.element')
element.style.color = 'red'

в Причину?

Пока что у меня есть:

[@@@bs.config {no_export: no_export}];

external document : Dom.document = "document" [@@bs.val];

external query_selector : Dom.document => string => Dom.element = "querySelector" [@@bs.send];

let element = query_selector document ".element";

И это прекрасно компилируется.

Но как бы я мог установить атрибут (т.е. style) на element?

2 ответа

Решение

Итак, во-первых, это уже доступно в bs-webapi. Но если вы хотите воссоздать (и упростить) его, вот как:

external document : Dom.document = "document" [@@bs.val];
external querySelector : string => option Dom.element = "" [@@bs.send.pipe: Dom.document] [@@bs.return null_to_opt];
external style : Dom.element => Dom.cssStyleDeclaration = "" [@@bs.get];
external setColor : Dom.cssStyleDeclaration => string => unit = "color" [@@bs.set];

let () =
    switch (document |> querySelector ".element") {
      | Some element => setColor (style element) "red";
      | None => ()
    };

Вы также можете выбросить безопасность типов из окна и просто сделать это так:

external document : Js.t {..} = "document" [@@bs.val];

let () = {
  let element = document##querySelector ".element";
  element##style##color #= "red"
};

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

Один из способов сделать это:

[@@@bs.config {no_export: no_export}];

external document : Dom.document = "document" [@@bs.val];

external query_selector : Dom.document => string => Dom.element = "querySelector" [@@bs.send];

external set_attribute : Dom.element => string => string => unit = "setAttribute" [@@bs.send];

let element = query_selector document ".element";

set_attribute element "style" "color: red";

Однако я не уверен, что есть лучший способ.

Заметки:

[@@@bs.config {no_export: no_export}]; не позволяет Bucklescript экспортировать модули ES6.

Модуль Dom предоставляет несколько типов.

Неотвеченные вопросы:

  • Как я могу использовать преимущество типа attr модуля Dom вместо использования строки?
  • Как воспользоваться преимуществами типа cssStyleDeclaration модуля Dom вместо использования строки?
Другие вопросы по тегам