React puede representar atributos personalizados como se describe en http://facebook.github.io/react/docs/jsx-gotchas.html :
Si desea utilizar un atributo personalizado, debe anteponerlo con datos-.
<div data-custom-attribute="foo" />
Y esa es una gran noticia, excepto que no puedo encontrar una manera de acceder 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 data-
propiedad se procesan en html bien. style
Se puede acceder a las propiedades estándar como event.target.style
bien. En lugar de event.target
lo intenté:
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ó.
javascript
facebook
reactjs
andriy_sof
fuente
fuente
aria-modal=true
, empuja los cambios (a falso) al almacén de atributos aria / datos , pero no se cambia nada más (como el contenido del componente o la clase o las variables allí) como resultado, ReactJs no actualizará aria / atributos de datos en esos componentes. He estado jugando todo el día para darme cuenta de eso.Respuestas:
Para ayudarlo a obtener el resultado deseado tal vez de una manera diferente a la que solicitó:
Note el
bind()
. Debido a que todo esto es javascript, puede hacer cosas útiles como esa. Ya no necesitamos adjuntar datos a los nodos DOM para realizar un seguimiento de ellos.En mi opinión, esto es mucho más limpio que confiar en eventos DOM.
Actualización de abril de 2017: en estos días escribiría en
onClick={() => this.removeTag(i)}
lugar de.bind
fuente
unshift
la matriz de argumentos de función . Si el "objeto de evento" estuviera en el índice0
, ahora estaría en el índice1
.removeTag: function(i, evt) {
event.target
le proporciona el nodo DOM nativo, luego debe usar las API DOM regulares para acceder a los atributos. Aquí hay documentos sobre cómo hacerlo: Uso de atributos de datos .Puedes hacer cualquiera
event.target.dataset.tag
oevent.target.getAttribute('data-tag')
; Cualquiera de los dos funciona.fuente
event.target.dataset
no está definido peroevent.target.getAttribute('data-tag')
funciona. Los otros navegadores están bien. GraciasshouldComponentUpdate
tendría el mismo problema a menos que ignorara por completo la función prop.event.currentTarget.getAttibute('data-tag')
Aquí está la mejor manera que encontré:
Esos atributos se almacenan en un "NamedNodeMap", al que puede acceder fácilmente con el método getNamedItem.
fuente
.value
para obtener el valor real.value
al final como sugirióO puede usar un cierre:
fuente
fuente
A partir de React v16.1.1 (2017), aquí está la solución oficial: https://reactjs.org/docs/handling-events.html#passing-arguments-to-event-handlers
TLDR: OP debe hacer:
fuente
i
es el atributo personalizado que OP quería pasar de alguna manera. Es una variable que está dentro del alcance cuandoa
se define el elemento.entonces
e.currentTarget.attributes['tag'].value
funciona para mifuente
Puede acceder a los atributos de datos de esta manera
fuente
Esta única línea de código resolvió el problema para mí:
fuente
No sé sobre 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
2) obtener de javascript con
fuente
Si alguien está tratando de usar event.target en React y encuentra un valor nulo, es porque un 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.
fuente
Intente en lugar de asignar propiedades dom (que es lenta) simplemente pase su valor como un parámetro para funcionar que realmente cree su controlador:
fuente
Simplemente puede usar el objeto event.target.dataset . Esto le dará el objeto con todos los atributos de datos.
fuente
En React no necesita los datos html, use una función para devolver otra función; así es muy simple enviar parámetros personalizados y puedes acceder a los datos personalizados y al evento.
fuente