Как сделать document.createElement в ReScript

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

Как мне вызывать такие функции, как document.createElement()?

Я попробовал Js.document, Dom.document, просмотрев эту страницу: https://rescript-lang.org/docs/manual/latest/api, но этот код выдает ошибку на игровой площадке:

Значение document не может быть найдено в Js
Значение document не может быть найдено в Dom


person vinay-deshmukh    schedule 20.05.2021    source источник


Ответы (3)


вы можете использовать bs-webapi

open Webapi.Dom
open Belt

document
->Document.asHtmlDocument
->Option.flatMap(document => document->HtmlDocument.body)
->Option.map(body => {
  let root = document->Document.createElement("div", _)
  root->Element.setId("app")
  root->Element.appendChild(body)
})
->ignore

person Arbaaz    schedule 25.05.2021

Поскольку повторный скрипт работает на React (JSX), а не на стандартном ECMA JavaScript, я не думаю, что вы можете использовать такие вызовы, как document.createElement.

Вместо этого вам следует создать элемент с помощью:

let element = <h1> {React.string("Hello World")} </h1>

Это трансформируется в следующее:

var element = React.createElement("h1", undefined, "Hello World");

Я изменил скрипт Playground по умолчанию:

module Button = {
  @react.component
  let make = (~count: int) => {
    let times = switch count {
    | 1 => "once"
    | 2 => "twice"
    | n => Belt.Int.toString(n) ++ " times"
    }
    let msg = "Click me " ++ times
    let element = <button> {React.string(msg)} </button>
    element
  }
}
person Mr. Polywhirl    schedule 20.05.2021
comment
React.createElement не эквивалентен document.createElement и даже не близок к нему. Как я уже упоминал, я пытаюсь использовать ReScript в JS, а не в проекте React. - person vinay-deshmukh; 21.05.2021

Для вызова функций JS вам необходимо использовать JS interop < / а>. В этом случае вы можете использовать ключевое слово external и атрибуты _2 _ / _ 3_, чтобы получить функцию ReScript, которая будет вызывать document.createElement при вызове:

@val @scope(("window", "document"))
external createElement: string => unit = "createElement"

createElement("div")

Это будет преобразовано в

window.document.createElement('div');

Для быстрого прототипирования вы также можете просто использовать external и напрямую взаимодействовать с такими объектами, как RS Objects:

@val external document: 'a = "document"

document["createElement"]("div")

Ознакомьтесь с шпаргалкой по взаимодействию и документы для external с более распространенными шаблонами.

person superhawk610    schedule 20.05.2021
comment
Я последовал приведенному выше совету по использованию external. Я правильно набрал возвращаемое значение createElement как Dom.element, но я не могу получить доступ к таким свойствам, как externalHTML, которые упоминаются в Mozilla. Вы можете сообщить мне, что я делаю не так? Кодекс . - person vinay-deshmukh; 21.05.2021
comment
ReScript предоставляет модуль Dom как общий набор непрозрачных типов для работы с низкоуровневыми библиотеками пользовательского интерфейса; как сказано в документах, они не предоставляют никаких фактических функциональность. Если вы хотите императивно взаимодействовать с DOM, вам нужно будет написать большую часть фактического кода на JS, а затем предоставить несколько точек входа для ReScript (это то, для чего нужны непрозрачные типы Dom, чтобы убедиться, что ваш код RS проходит ожидаемые типы значений). Как упоминалось в @ mr-polywhirl, путь наименьшего сопротивления - использовать существующую библиотеку, такую ​​как React. - person superhawk610; 21.05.2021
comment
@ vinay-deshmukh, вам нужно будет понять несколько различных концепций, прежде чем вы поймете, что вы здесь делаете неправильно. Stack Overflow - не лучшее место для такого обсуждения. Я настоятельно рекомендую задать этот вопрос на форуме ReScript, где люди могут провести расширенное обсуждение: forum.rescript-lang. org. Наконец, если вы просто хотите начать что-то использовать немедленно, попробуйте github.com/reasonml-community / bs-webapi-incubator - person Yawar; 22.05.2021