その背後にはさまざまな理由がありますが、JSX の要素にカスタム属性を単純に追加するにはどうすればよいのでしょうか?
11 に答える
編集:React 16を反映するように更新
カスタム属性は、React 16 でネイティブにサポートされています。これは、要素にカスタム属性を追加することが、次のrender
ように関数に追加するのと同じくらい簡単であることを意味します。
render() {
return (
<div custom-attribute="some-value" />
);
}
詳細:
https://reactjs.org/blog/2017/09/26/react-v16.0.html#support-for-custom-dom-attributes
https://facebook.github.io/react/blog/ 2017/09/08/dom-attributes-in-react-16.html
以前の回答 (React 15 以前)
カスタム属性は現在サポートされていません。詳細については、この未解決の問題を参照してください: https://github.com/facebook/react/issues/140
回避策として、で次のようなことを行うことができますcomponentDidMount
。
componentDidMount: function() {
var element = ReactDOM.findDOMNode(this.refs.test);
element.setAttribute('custom-attribute', 'some value');
}
実際の例については、https://jsfiddle.net/peterjmag/kysymow0/を参照してください。(このコメントでのシラニドの提案に触発されました。)
ES6スプレッド演算子を使用して属性を追加できます。
let myAttr = {'data-attr': 'value'}
そしてレンダリングメソッドで:
<MyComponent {...myAttr} />
「is」属性を使用して、要素の React 属性ホワイトリストを無効にすることができます。
ここで私のアンサーを参照してください: Stackoverflow
反応でSVGを使用しようとしたときに、この問題に何度も遭遇しました。
私はかなり汚い修正を使用してしまいましたが、このオプションが存在することを知っておくと役に立ちます。以下では、vector-effect
SVG 要素での属性の使用を許可します。
import SVGDOMPropertyConfig from 'react/lib/SVGDOMPropertyConfig.js';
import DOMProperty from 'react/lib/DOMProperty.js';
SVGDOMPropertyConfig.Properties.vectorEffect = DOMProperty.injection.MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.DOMAttributeNames.vectorEffect = 'vector-effect';
反応の使用を開始する前にこれが含まれている/インポートされている限り、機能するはずです。
使用している React のバージョンによっては、このようなものを使用する必要がある場合があります。Facebook が近い将来に文字列参照を廃止することを考えていることは知っています。
var Hello = React.createClass({
componentDidMount: function() {
ReactDOM.findDOMNode(this.test).setAttribute('custom-attribute', 'some value');
},
render: function() {
return <div>
<span ref={(ref) => this.test = ref}>Element with a custom attribute</span>
</div>;
}
});
React.render(<Hello />, document.getElementById('container'));
これを行うことを正確に妨げているものに応じて、現在の実装を変更する必要のない別のオプションがあります。プロジェクトのルートにあるまたはファイル (どちらかは不明) を使用して、プロジェクトのReactを拡張できるはずです。次のようになります。.ts
.d.ts
declare module 'react' {
interface HTMLAttributes<T> extends React.DOMAttributes<T> {
'custom-attribute'?: string; // or 'some-value' | 'another-value'
}
}
別の可能性は次のとおりです。
declare namespace JSX {
interface IntrinsicElements {
[elemName: string]: any;
}
}
でラップする必要があるかもしれませんdeclare global {
。私はまだ最終的な解決策にたどり着いていません。