Можно сделать что-то подобное, используя ReasonReact.cloneElement
, как намекнул Амирали. Идея состоит в том, чтобы разделить свойства вашего компонента и свойства кнопки HTML на два отдельных параметра для вашего компонента, отрендерить кнопку и затем клонировать ее, одновременно добавляя дополнительные свойства кнопки.
Это На странице показан компонент, который инкапсулирует эту функциональность клонирования и внедрения:
module Spread = {
[@react.component]
let make = (~props, ~children) =>
ReasonReact.cloneElement(children, ~props, [||]);
};
Теперь вы можете использовать этот Spread
компонент для своего SuperButton
компонента:
module SuperButton = {
[@react.component]
let make = (~foo, ~htmlButtonProps) =>
<Spread props=htmlButtonProps>
<button> (foo ? "YES" : "NO")->React.string </button>
</Spread>;
};
Свойство htmlButtonProps
будет содержать обычные HTML свойства кнопки, а отдельно foo
- это свойство c вашего компонента. Компонент можно использовать следующим образом:
<SuperButton foo=true htmlButtonProps={"autofocus": true} />
Небольшое примечание по уборке: вам фактически не нужно определять модули с помощью ключевого слова module
. При желании вы можете поместить их в отдельные файлы с именами Spread.re
и SuperButton.re
. Файлы Reason автоматически становятся модулями.