我正在尝试编写一些额外的scalajs-react 文档,但我很困惑。
它在这里说:
A
ReactElement是一个ReactDOMElement或一个 React 组件。
但它在这里说:
type ReactElement = ReactComponentElement | ReactDOMElement;
哪一个是真的?
如何解释这种矛盾?
怎么可能ReactComponent和ReactComponentElement一样?
我很困惑。有人可以解开我的困惑吗?
我正在尝试编写一些额外的scalajs-react 文档,但我很困惑。
它在这里说:
A
ReactElement是一个ReactDOMElement或一个 React 组件。
但它在这里说:
type ReactElement = ReactComponentElement | ReactDOMElement;
哪一个是真的?
如何解释这种矛盾?
怎么可能ReactComponent和ReactComponentElement一样?
我很困惑。有人可以解开我的困惑吗?
也许我过于简化了,但源代码表明 ReactElement 是一个具有 ReactNode 和key和ref属性的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 来解释事情界面可能相当混乱。