Reactは http://facebook.github.io/react/docs/jsx-gotchas.html で説明されているようにカスタム属性をレンダリングできます。
もしあなたがカスタム属性を使いたいのであれば、data-というプレフィックスをつけるべきです。
<div data-custom-attribute="foo" />
イベントオブジェクトからアクセスする方法が見つからないことを除けば、それは素晴らしいニュースです。
render: function() {
...
<a data-tag={i} style={showStyle} onClick={this.removeTag}></a>
...
removeTag: function(event) {
this.setState({inputVal: event.target????});
},
Elementとdata-
プロパティはhtmlでうまくレンダリングされます。 style
のような標準プロパティはevent.target.style
fineとしてアクセスできます。 event.target
の代わりに私が試した:
event.target.props.data.tag
event.target.props.data["tag"]
event.target.props["data-tag"]
event.target.data.tag
event.target.data["tag"]
event.target["data-tag"]
どれもうまくいきませんでした。
あなたがたぶんあなたが尋ねたより異なる方法であなたが望ましい結果を得るのを助けるために:
render: function() {
...
<a data-tag={i} style={showStyle} onClick={this.removeTag.bind(null, i)}></a>
...
},
removeTag: function(i) {
// do whatever
},
bind()
に注目してください。これはすべてjavascriptなので、あなたはそのような便利なことをすることができます。それらを追跡するためにDOMノードにデータを添付する必要はもうありません。
IMOこれはDOMイベントに頼るよりはるかにクリーンです。
更新2017年4月:最近では.bind
の代わりにonClick={() => this.removeTag(i)}
を書く
event.target
はあなたにネイティブDOMノードを与えます、そしてあなたは属性にアクセスするために通常のDOM APIを使う必要があります。これを行う方法についての文書は次のとおりです。
https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes#JavaScript_Access
event.target.dataset.tag
またはevent.target.getAttribute('data-tag')
のどちらかを実行できます。どちらでもうまくいきます。
これが私が見つけた最良の方法です:
var attribute = event.target.attributes.getNamedItem('data-tag').value;
これらの属性は "NamedNodeMap"に格納されています。これは、getNamedItemメソッドを使用して簡単にアクセスできます。
あるいはクロージャを使うこともできます。
render: function() {
...
<a data-tag={i} style={showStyle} onClick={this.removeTag(i)}></a>
...
},
removeTag: function (i) {
return function (e) {
// and you get both `i` and the event `e`
}.bind(this) //important to bind function
}
// Method inside the component
userClick(event){
let tag = event.currentTarget.dataset.tag;
console.log(tag); // should return Tagvalue
}
// when render element
<a data-tag="TagValue" onClick={this.userClick}>Click me</a>
<div className='btn' onClick={(e) =>
console.log(e.currentTarget.attributes['tag'].value)}
tag='bold'>
<i className='fa fa-bold' />
</div>
だからe.currentTarget.attributes['tag'].value
は私のために働く
React v16.1.1(2017)現在、これが公式の解決策です: https://reactjs.org/docs/handling-events.html#passing-arguments-to-event-handlers
TLDR:OPはすべきこと:
render: function() {
...
<a style={showStyle} onClick={(e) => this.removeTag(i, e)}></a>
...
removeTag: function(i, event) {
this.setState({inputVal: i});
}
私はReactについて知りませんが、一般的なケースではあなたはこのようなカスタム属性を渡すことができます:
1)html-tagの中にdata-prefixで新しい属性を定義する
data-mydatafield = "asdasdasdaad"
2)でJavaScriptから取得
e.target.attributes.getNamedItem("data-mydatafield").value
誰かがReactでevent.targetを使用しようとしていてnull値を見つけようとしているのであれば、それはSyntheticEventがevent.targetを置き換えたためです。 SyntheticEventは、event.currentTarget.getAttribute( 'data-username')のように、 'currentTarget'を保持します。
https://facebook.github.io/react/docs/events.html
Reactがこれを実行して他のブラウザでも機能するように見えます。 nativeEvent属性を介して古いプロパティにアクセスできます。
このようなデータ属性にアクセスできます
event.target.dataset.tag
(遅い)DOMプロパティを代入する代わりに、実際にあなたのハンドラを作成する関数にパラメータとしてあなたの値を渡すだけです:
render: function() {
...
<a style={showStyle} onClick={this.removeTag(i)}></a>
...
removeTag = (customAttribute) => (event) => {
this.setState({inputVal: customAttribute});
}
次の1行のコードで問題が解決しました。
event.currentTarget.getAttribute('data-tag')