1

我正在尝试编写一些额外的scalajs-react 文档,但我很困惑。

在这里说:

AReactElement是一个ReactDOMElement或一个 React 组件。

但它在这里说:

type ReactElement = ReactComponentElement | ReactDOMElement;

哪一个是真的?

如何解释这种矛盾?

怎么可能ReactComponentReactComponentElement一样?

我很困惑。有人可以解开我的困惑吗?

4

1 回答 1

2

也许我过于简化了,但源代码表明 ReactElement 是一个具有 ReactNode 和keyref属性的javascript对象。我不会在 vDom / scaladoc 评论中投入太多的股票。它们的存在是为了向用户而不是编译器提供提示。它试图说“ReactElement 是 ReactComponentElement 和 ReactDomElement 的共同基本特征”,你可以看到这确实是真的。

   /** ReactElement = ReactComponentElement | ReactDOMElement  */
@js.native
trait ReactElement extends Object with ReactNode {
  def key: UndefOr[String] = js.native
  def ref: UndefOr[String] = js.native
}

/** A React virtual DOM element, such as 'div', 'table', etc. */
@js.native
trait ReactDOMElement extends ReactElement {
  def `type`: String = js.native
  def props : Object = js.native
}

/** An instance of a React component. Prefer using the subtype ReactComponentU instead. */
@js.native
trait ReactComponentElement[Props]
  extends ReactElement
     with HasProps[Props]

这里的关键是 React 是一个相当动态的 JavaScript 框架,所以为了在它周围添加类型安全性,scala.js 最终会创建许多“相似但不相同”的子类型来处理各种底层状态。例如,ReactComponentU和朋友和ReactComponent/ ReactComponentElement

我认为为了比以前更成功地记录它(更多?),您可能必须记录 React 本身,然后使用类型系统对其进行记录——尝试严格按照 scala.js 来解释事情界面可能相当混乱。

于 2016-10-14T16:51:33.553 回答