javascript - Hvordan få tilgang til egendefinerte attributter fra hendelsesobjektet i React?
React kan gjengi tilpassede attributter som beskrevet på http://facebook.github.io/react/docs/jsx-gotchas.html:
Hvis du vil bruke et tilpasset attributt, bør du prefiksere det med data-.
<div data-custom-attribute="foo" />
Og det er gode nyheter, bortsett fra at jeg ikke finner en måte å få tilgang til det fra hendelsesobjektet, f.eks.:
render: function() {
...
<a data-tag={i} style={showStyle} onClick={this.removeTag}></a>
...
removeTag: function(event) {
this.setState({inputVal: event.target????});
},
Elementet og data--egenskapen gjengis fint i HTML. Standardegenskaper som style kan aksesseres som event.target.style uten problemer. I stedet for event.target prøvde jeg:
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"]
ingen av disse fungerte.
Svar #1
event.target gir deg den native DOM-node, da må du bruke de vanlige DOM-APIene for å få tilgang til attributter. Her er dokumentasjon om hvordan du gjør det: Bruke dataattributter.
Du kan bruke enten event.target.dataset.tag eller event.target.getAttribute('data-tag'); begge fungerer.
Svar #2
For å hjelpe deg med å oppnå ønsket resultat på kanskje en annen måte enn du ba om:
render: function() {
...
<a data-tag={i} style={showStyle} onClick={this.removeTag.bind(null, i)}></a>
...
},
removeTag: function(i) {
// do whatever
},
Legg merke til bind(). Fordi dette er all javascript, kan du gjøre nyttige ting som det. Vi trenger ikke lenger å knytte data til DOM-noder for å holde styr på dem.
Etter min mening er dette mye renere enn å stole på DOM-hendelser.
Oppdatering april 2017: Nå for tiden ville jeg skrevet onClick={() => this.removeTag(i)} i stedet for .bind
Svar #3
Her er den beste måten jeg har funnet på:
var attribute = event.target.attributes.getNamedItem('data-tag').value;
Disse attributtene lagres i en "NamedNodeMap", som du enkelt kan få tilgang til med metoden getNamedItem.
Svar #4
Eller du kan bruke en closure :
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
}
Svar #5
// 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>
Svar #6
<div className='btn' onClick={(e) =>
console.log(e.currentTarget.attributes['tag'].value)}
tag='bold'>
<i className='fa fa-bold' />
</div>
så e.currentTarget.attributes['tag'].value fungerer for meg
