react practicas organizar mejores eventos entre entender ejemplos comunicacion componentes como javascript facebook reactjs

javascript - practicas - ¿Cómo acceder a los atributos personalizados del objeto de evento en React?



react comunicacion entre componentes (11)

React puede mostrar atributos personalizados como se describe en http://facebook.github.io/react/docs/jsx-gotchas.html :

Si desea usar un atributo personalizado, debe agregarle un prefijo con datos-.

<div data-custom-attribute="foo" />

Y esa es una gran noticia, excepto que no puedo encontrar una forma de acceder a ella desde el objeto del evento, por ejemplo:

render: function() { ... <a data-tag={i} style={showStyle} onClick={this.removeTag}></a> ... removeTag: function(event) { this.setState({inputVal: event.target????}); },

El elemento y la propiedad de data- procesan en html fine. Se puede acceder a propiedades estándar como el style como event.target.style fine. En lugar de event.target , probé:

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"]

ninguno de estos funcionó.



En React no necesita los datos html, use una función return a otra función; así es muy simple enviar params personalizados y puedes acceder a los datos personalizados y al evento.

render: function() { ... <a style={showStyle} onClick={this.removeTag(i)}></a> ... removeTag: (i) => (event) => { this.setState({inputVal: i}); },


Esta es la mejor manera que encontré:

var attribute = event.target.attributes.getNamedItem(''data-tag'').value;

Esos atributos se almacenan en un "NamedNodeMap", al que se puede acceder fácilmente con el método getNamedItem.


Esto también funciona:

var attribute = $ (event.target.attributes [''data-tag'']). val ();


No sé acerca de React, pero en el caso general puede pasar atributos personalizados como este:

1) definir dentro de una etiqueta html un nuevo atributo con prefijo de datos

data-mydatafield = "asdasdasdaad"

2) obtener de javascript con

e.target.attributes.getNamedItem("data-mydatafield").value


O puede usar un cierre:

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 }


Para ayudarlo a obtener el resultado deseado de una manera diferente a como lo hizo:

render: function() { ... <a data-tag={i} style={showStyle} onClick={this.removeTag.bind(null, i)}></a> ... }, removeTag: function(i) { // do whatever },

Observe el bind() . Como esto es todo javascript, puedes hacer cosas prácticas como esa. Ya no es necesario adjuntar datos a los nodos DOM con el fin de realizar un seguimiento de ellos.

IMO esto es mucho más limpio que confiar en los eventos DOM.

Actualización de abril de 2017: en estos días escribiría onClick={() => this.removeTag(i)} lugar de .bind


Si alguien está intentando usar event.target en React y encuentra un valor nulo, es porque SyntheticEvent ha reemplazado el event.target. SyntheticEvent ahora contiene ''currentTarget'', como en event.currentTarget.getAttribute (''data-username'').

https://facebook.github.io/react/docs/events.html

Parece que React hace esto para que funcione en más navegadores. Puede acceder a las propiedades antiguas a través de un atributo nativeEvent.


<div className=''btn'' onClick={(e) => console.log(e.currentTarget.attributes[''tag''].value)} tag=''bold''><i className=''fa fa-bold'' /></div>

entonces e.currentTarget.attributes[''tag''].value funciona para mí



// 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>