React能够呈现自定义属性,如下所述 http://facebook.github.io/react/docs/jsx-gotchas.html:
如果要使用自定义属性,则应在其前面加上 数据 -
<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????});
},
元素和data-
属性在html中呈现。像style
这样的标准属性可以event.target.style
访问。
而不是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"]
这些都没有奏效。
答案 0 :(得分:217)
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')
;任何一个都有效。
答案 1 :(得分:149)
为了帮助您以与您提出的不同的方式获得理想的结果:
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月更新:这些天我会写onClick={() => this.removeTag(i)}
代替.bind
答案 2 :(得分:44)
这是我找到的最佳方式:
var attribute = event.target.attributes.getNamedItem('data-tag').value;
这些属性存储在“NamedNodeMap”中,您可以使用getNamedItem方法轻松访问它。
答案 3 :(得分:23)
或者您可以使用闭包:
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
}
答案 4 :(得分:12)
// 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>
答案 5 :(得分:7)
从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});
}
答案 6 :(得分:7)
<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
适合我
答案 7 :(得分:3)
您可以简单地使用 event.target.dataset 对象。这将为您提供具有所有数据属性的对象。
答案 8 :(得分:2)
我不了解React,但在一般情况下,您可以传递这样的自定义属性:
1)在html-tag中定义一个带有data- prefix
的新属性data-mydatafield = "asdasdasdaad"
2)从
获取javascripte.target.attributes.getNamedItem("data-mydatafield").value
答案 9 :(得分:2)
如果有人试图在React中使用event.target并找到一个空值,那是因为SyntheticEvent已经替换了event.target。 SyntheticEvent现在拥有&#39; currentTarget&#39;,例如在event.currentTarget.getAttribute(&#39; data-username&#39;)中。
https://facebook.github.io/react/docs/events.html
看起来React会这样做,以便它适用于更多浏览器。您可以通过nativeEvent属性访问旧属性。
答案 10 :(得分:2)
这一行代码为我解决了这个问题:
event.currentTarget.getAttribute('data-tag')
答案 11 :(得分:1)
您可以访问类似这样的数据属性
event.target.dataset.tag
答案 12 :(得分:0)
尝试而不是分配dom属性(这很慢),只需将您的值作为参数传递给实际创建处理程序的函数即可:
render: function() {
...
<a style={showStyle} onClick={this.removeTag(i)}></a>
...
removeTag = (customAttribute) => (event) => {
this.setState({inputVal: customAttribute});
}
答案 13 :(得分:0)
我认为建议绑定所有需要使用 this.setState 方法的方法,该方法在React.Component类中的构造函数内部定义构造函数应该像这样的情况
constructor() {
super()
//This binding removeTag is necessary to make `this` work in the callback
this.removeTag = this.removeTag.bind(this)
}
removeTag(event){
console.log(event.target)
//use Object destructuring to fetch all element values''
const {style, dataset} = event.target
console.log(style)
console.log(dataset.tag)
}
render() {
...
<a data-tag={i} style={showStyle} onClick={this.removeTag.bind(null, i)}></a>
...},
答案 14 :(得分:-1)
这也有效:
var attribute = $(event.target.attributes ['data-tag'])。val();
答案 15 :(得分:-1)
在React中你不需要html数据,使用函数返回另一个函数;像这样,它非常简单的发送自定义参数,您可以访问自定义数据和事件。
render: function() {
...
<a style={showStyle} onClick={this.removeTag(i)}></a>
...
removeTag: (i) => (event) => {
this.setState({inputVal: i});
},