1

いくつかの追加の scalajs-react ドキュメントを作成しようとしていますが、混乱しています。

それはここに言います:

AReactElementReactDOMElementまたは React コンポーネントです。

しかし、ここには次のように書かれています:

type ReactElement = ReactComponentElement | ReactDOMElement;

どれが本当ですか?

この矛盾をどのように説明できますか?

どうすれば同じReactComponentになることができますか?ReactComponentElement

私は混乱しています。誰かが私を混乱させてくれませんか?

4

1 に答える 1

2

単純化しすぎているのかもしれませんが、ソース コードは、ReactElement が ReactNode および プロパティのプロパティを持つ JavaScript オブジェクトであることを示していkeyますref。私は 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 に答える