【问题标题】:ReactComponent vs ReactComponentElement in scalajs-reactscalajs-react 中的 ReactComponent vs ReactComponentElement
【发布时间】:2016-10-15 02:48:22
【问题描述】:
我正在尝试写一些额外的scalajs-react documentation,但我很困惑。
上面写着here:
ReactElement 是 ReactDOMElement 或 React 组件。
但上面写着here:
type ReactElement = ReactComponentElement | ReactDOMElement;
哪一个是真的?
如何解释这种矛盾?
ReactComponent 和 ReactComponentElement 怎么可能一样?
我很困惑。有人可以解开我的困惑吗?
【问题讨论】:
标签:
reactjs
scalajs-react
【解决方案1】:
也许我过于简化了,但源代码表明 ReactElement 是一个 javascript 对象,具有 ReactNode 和 key 和 ref 属性的属性。我不会在 vDom / scaladoc cmets 中投入那么多库存。它们的存在是为了向用户而不是编译器提供提示。它试图说“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 界面可能会很混乱。