【问题标题】:ReactComponent vs ReactComponentElement in scalajs-reactscalajs-react 中的 ReactComponent vs ReactComponentElement
【发布时间】:2016-10-15 02:48:22
【问题描述】:

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

上面写着here

ReactElementReactDOMElement 或 React 组件。

但上面写着here:

type ReactElement = ReactComponentElement | ReactDOMElement;

哪一个是真的?

如何解释这种矛盾?

ReactComponentReactComponentElement 怎么可能一样?

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

【问题讨论】:

    标签: reactjs scalajs-react


    【解决方案1】:

    也许我过于简化了,但源代码表明 ReactElement 是一个 javascript 对象,具有 ReactNode 和 keyref 属性的属性。我不会在 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 界面可能会很混乱。

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 2017-02-04
      • 2017-02-02
      • 2017-06-02
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 2015-10-08
      • 2015-03-21
      相关资源
      最近更新 更多