在设计Reasonml React组件时如何扩展HTML属性接口?

我正在学习Reasonml,对此感到非常兴奋。我经常在打字稿反应代码中做的事情是:

type Props = React.HTMLProps<HTMLButtonElement> & { foo: boolean }
const SuperButton: React.FC<Props> = (props) => <button {/* stuff with props */ />

在这方面,我作为组件库提供者向用户传达了此按钮扩展了常规HTML按钮属性的信息。

如何在组件中表达和扩展普通的html组件属性?

我看到该原因明显不支持传播道具:https://github.com/reasonml/reason-react/blob/master/docs/props-spread.md

我确实看到了一种合成策略:How to compose props across component in reason-react bindings?,但不确定如何将其与普通的HTML元素组件结合起来。

有什么建议吗?谢谢!

iCMS 回答:在设计Reasonml React组件时如何扩展HTML属性接口?

正如Amirali暗示的那样,可以使用ReasonReact.cloneElement做类似的事情。想法是将组件的属性和HTML按钮的属性分为两个单独的参数,呈现按钮,然后克隆它,同时注入额外的按钮属性。

This page显示了封装此克隆并注入功能的组件:

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则是组件的特定道具。该组件可以这样使用:

<SuperButton foo=true htmlButtonProps={"autofocus": true} />

小的内务处理注释:实际上,您不需要使用module关键字来定义模块。如果需要,可以将它们放在分别称为Spread.reSuperButton.re的文件中。原因文件自动成为模块。

本文链接:https://www.f2er.com/1953996.html

大家都在问