私が開発しているサイトは、Microdataを利用しています(schema.orgを使用)。 Reactを使用してビューをレンダリングするように開発をシフトしているため、ReactはHTML仕様の属性のみをレンダリングしますが、Microdataはカスタムを指定します。 itemscope
などの属性。
私はReactに比較的慣れておらず、まだコアを完全に理解する機会がないので、私の質問は、react.jsの機能を拡張して許可するための最良の方法は何でしょうか。 Microdataなどの定義済みのカスタム属性の場合
属性/小道具パーサーを拡張する方法はありますか、それとも渡されたすべての小道具をチェックしてDOM要素を直接変更するミックスインの仕事ですか?
(うまくいけば、解決策が明確になったときに、すべての人がこれをサポートできるように、拡張機能をまとめることができます。)
componentDidMount
でそれを行うことができるはずです:
...
componentDidMount: function() {
if (this.props.itemtype) {
this.getDOMNode().setAttribute('itemscope', true)
this.getDOMNode().setAttribute('itemtype', this.props.itemtype)
}
if (this.props.itemprop) {
this.getDOMNode().setAttribute('itemprop', this.props.itemprop)
}
}
...
Microdata属性のチェック全体を、便利なミックスインにラップすることができます。 このアプローチの問題は、組み込みのReactコンポーネント(。更新:React.DOM
によって作成されたコンポーネント)では機能しないことです。React.DOM
を詳しく見ると、これが思い浮かびます http://plnkr.co/edit/UjXSveVHdj8T3xnyhmKb?p=preview 。基本的に、組み込みコンポーネントをミックスインを使用してカスタムコンポーネントにラップします。コンポーネントはReactの組み込みDOMコンポーネントに基づいて構築されているため、コンポーネントにミックスインを含める必要がなくても機能します。
実際の解決策は、ReactのDefaultDOMPropertyConfig
の代わりにカスタム構成を挿入することですが、ドロップイン方式でそれを行う方法を見つけることができません(DOMProperty
はモジュールシステムによって隠されています) 。
「is」属性を使用することもできます。 Reactの属性ホワイトリストを無効にし、すべての属性を許可します。ただし、class
とclassName
の代わりにfor
を記述する必要があります。 htmlFor
を使用する場合は、is
の代わりに。
<div is my-custom-attribute="here" class="instead-of-className"></div>
更新React 16のカスタム属性が可能になりました
反応で16のカスタム属性が可能になりました
これらの非標準プロパティがReactに追加されたようです
itemProp: MUST_USE_ATTRIBUTE, // Microdata: http://schema.org/docs/gs.html
itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, // Microdata: http://schema.org/docs/gs.html
itemType: MUST_USE_ATTRIBUTE, // Microdata: http://schema.org/docs/gs.html
プロパティの中央に大文字があることに注意してください。
<div itemProp="whatever..." itemScope itemType="http://schema.org/Offer">
結果として、適切な小文字の属性が生成されます。
まだ答えを探している人のために: https://facebook.github.io/react/docs/tags-and-attributes.html
例:
<div itemScope itemType="http://schema.org/Article"></div>
これまでのところ、私が見つけた最良の方法は、 いくつかのAmp相互運用コード からリンクされている コメント 主題に関するreactのバグトラッカースレッドに基づいています。 React(15.5.4)とTypeScriptの新しいバージョンで動作するように少し変更しました。
通常のES6の場合、attributeNameの型注釈を削除するだけです。 DOMPropertyはreactのindex.d.tsで公開されていないため、TSではrequireを使用する必要がありましたが、通常のES6ではインポートを使用できます。
// tslint:disable-next-line:no-var-requires
const DOMProperty = require("react-dom/lib/DOMProperty");
if (typeof DOMProperty.properties.zz === "undefined") {
DOMProperty.injection.injectDOMPropertyConfig({
Properties: { zz: DOMProperty.MUST_USE_ATTRIBUTE },
isCustomAttribute: (attributeName: string) => attributeName.startsWith("zz-")
});
}
これで、zz-で始まる任意の属性を使用できます。
<div zz-context="foo" />
通常、このようにreactの内部部分を使用するのは悪い考えですが、他のどの方法よりも優れていると思います。これは、データなどの既存のオープンエンド属性と同じように機能し、JSXはTSでもタイプセーフです。とにかく、reactの次のメジャーバージョンはホワイトリストを廃止する予定なので、このシムを完全に削除する前に変更が必要ないことを願っています。