Quiero leer las propiedades del valor del evento onClick. Pero cuando hago clic en él, veo algo así en la consola:
SyntheticMouseEvent {dispatchConfig: Object, dispatchMarker: ".1.1.0.2.0.0:1", nativeEvent: MouseEvent, type: "click", target
Mi código funciona correctamente Cuando ejecuto puedo ver {column}
pero no puedo obtenerlo en el evento onClick.
Mi código:
var HeaderRows = React.createClass({
handleSort: function(value) {
console.log(value);
},
render: function () {
var that = this;
return(
<tr>
{this.props.defaultColumns.map(function (column) {
return (
<th value={column} onClick={that.handleSort} >{column}</th>
);
})}
{this.props.externalColumns.map(function (column) {
// Multi dimension array - 0 is column name
var externalColumnName = column[0];
return ( <th>{externalColumnName}</th>);
})}
</tr>
);
}
});
¿Cómo puedo pasar un valor al onClick
evento en React js?
javascript
reactjs
usuario1924375
fuente
fuente
Respuestas:
Camino fácil
Use una función de flecha:
Esto creará una nueva función que llama
handleSort
con los parámetros correctos.Mejor manera
Extraerlo en un subcomponente. El problema con el uso de una función de flecha en la llamada de render es que creará una nueva función cada vez, lo que termina causando re-renderizaciones innecesarias.
Si crea un subcomponente, puede pasar el controlador y usar accesorios como argumentos, que luego se volverán a representar solo cuando los accesorios cambien (porque la referencia del controlador ahora nunca cambia):
Subcomponente
Componente principal
Old Easy Way (ES5)
Use
.bind
para pasar el parámetro que desee:fuente
<a>
etiqueta donde necesita pasar el evento, para usarpreventDefault()
bind
.Aquí hay buenas respuestas, y estoy de acuerdo con @Austin Greco (la segunda opción con componentes separados).
Hay otra forma que me gusta, curry .
Lo que puede hacer es crear una función que acepte un parámetro (su parámetro) y devuelva otra función que acepte otro parámetro (el evento de clic en este caso). entonces eres libre de hacer lo que quieras.
ES5:
ES6:
Y lo usarás de esta manera:
Aquí hay un ejemplo completo de tal uso:
Mostrar fragmento de código
Tenga en cuenta que este enfoque no resuelve la creación de una nueva instancia en cada render.
Me gusta este enfoque sobre los otros controladores en línea ya que este es más conciso y legible en mi opinión.
Editar:
como se sugiere en los comentarios a continuación, puede almacenar en caché / memorizar el resultado de la función.
Aquí hay una implementación ingenua:
Mostrar fragmento de código
fuente
handleChange = param => cache[param] || (e => { // the function body })
Hoy en día, con ES6, creo que podríamos usar una respuesta actualizada.
Básicamente, (para cualquiera que no sepa) ya
onClick
que espera que se le pase una función,bind
funciona porque crea una copia de una función. En su lugar, podemos pasar una expresión de función de flecha que simplemente invoca la función que queremos y conservathis
. Nunca debería necesitar vincular elrender
método en React, pero si por alguna razón está perdiendothis
en uno de sus métodos componentes:fuente
render()
porque React lo llama. En todo caso, necesitabind
los controladores de eventos, y solo cuando no esté usando flechas.props
asuper()
othis.props
será indefinido durante el constructor que puede prestarse a confusión.foo = () => {...}
y luego hacer referencia en renderizar<button onClick={this.foo}...
la única razón para incluir una función de flecha si usa babel de esta manera, IMO, es si desea capturar alguna variable que solo existe en el alcance del método render () (los eventos solo se pueden pasar y no se aplican).[[h / t a @ E.Sundin por vincular esto en un comentario]
La respuesta principal (funciones anónimas o enlace) funcionará, pero no es la más eficaz, ya que crea una copia del controlador de eventos para cada instancia generada por la
map()
función.Esta es una explicación de la forma óptima de hacerlo desde ESLint-plugin-react :
fuente
this.state
, puede intercambiarlo con seguridad con un SFC.Este es mi enfoque, no estoy seguro de lo malo que es, por favor comente
En el elemento cliqueable
y entonces
fuente
encodeURIComponent(JSON.stringify(myObj))
, a continuación, analizarlo,JSON.parse(decodeURIComponent(myObj))
. Para las funciones, estoy bastante seguro de que esto no funcionará sin eval o new Function (), que deben evitarse. Por estas razones, no uso atributos de datos para pasar datos en React / JS.Este ejemplo puede ser un poco diferente al suyo. pero puedo asegurarle que esta es la mejor solución que puede tener para este problema. He buscado durante días una solución que no tenga problemas de rendimiento. y finalmente se me ocurrió esta.
ACTUALIZAR
en caso de que desee tratar con objetos que se supone que son los parámetros. puede usar
JSON.stringify(object)
para convertirlo en cadena y agregarlo al conjunto de datos.fuente
fuente
Una opción más que no involucra
.bind
o ES6 es usar un componente hijo con un controlador para llamar al controlador principal con los accesorios necesarios. Aquí hay un ejemplo (y un enlace al ejemplo de trabajo está abajo)La idea básica es que el componente padre pase la
onClick
función a un componente hijo. El componente secundario llama a laonClick
función y puede acceder a todo lo que se leprops
pase (y alevent
), lo que le permite usar cualquierevent
valor u otros accesorios dentro de laonClick
función del padre .Aquí hay una demostración de CodePen que muestra este método en acción.
fuente
Hacer un intento alternativo para responder la pregunta de OP, incluidas las llamadas e.preventDefault ():
Enlace representado ( ES6 )
Función componente
fuente
Me doy cuenta de que esto es bastante tarde para la fiesta, pero creo que una solución mucho más simple podría satisfacer muchos casos de uso:
Supongo que también podrías usar un
data-
atributo.Sencillo, semántico.
fuente
Simplemente cree una función como esta
y llámalo en el lugar que necesites
<Icon onClick = {() => {methodName (theParamsYouwantToPass); }} />
fuente
Simplemente puede hacerlo si está utilizando
ES6
.fuente
La implementación muestra el recuento total de un objeto pasando el recuento como parámetro de los componentes principales a los subcomponentes como se describe a continuación.
Aquí está MainComponent.js
Y aqui esta
SubComp.js
Intente implementar lo anterior y obtendrá un escenario exacto de cómo funcionan los parámetros de paso en reactjs en cualquier método DOM.
fuente
Escribí un componente contenedor que se puede reutilizar para este propósito que se basa en las respuestas aceptadas aquí. Sin embargo, si todo lo que necesita hacer es pasar una cadena, simplemente agregue un atributo de datos y léalo desde e.target.dataset (como han sugerido algunos otros). Por defecto, mi contenedor se unirá a cualquier accesorio que sea una función y comience con 'on' y automáticamente pasará el accesorio de datos al llamador después de todos los demás argumentos de evento. Aunque no lo he probado para el rendimiento, le dará la oportunidad de evitar crear la clase usted mismo, y se puede usar así:
o para componentes y funciones
o si lo prefieres
declarar que fuera de su contenedor (cerca de sus importaciones)
Aquí está el uso en un contenedor:
Aquí está el código del contenedor 'withData.js:
fuente
Tengo más de 3 sugerencias para esto en JSX onClick Events:
En realidad, no necesitamos usar la función .bind () o Arrow en nuestro código. Puedes usarlo fácilmente en tu código.
También puede mover el evento onClick de th (o ul) a tr (o li) para mejorar el rendimiento. Básicamente tendrá un número n de "Oyentes de eventos" para su elemento n li.
// Y puedes acceder
item.id
en elonItemClick
método como se muestra a continuación:Estoy de acuerdo con el enfoque mencionado anteriormente para crear un componente React separado para ListItem y List. Este código de marca se ve bien, sin embargo, si tiene 1000 de li, se crearán 1000 oyentes de eventos. Asegúrate de no tener mucho oyente de eventos.
fuente
He agregado código para pasar el valor del evento onclick al método de dos maneras. 1) usando el método de enlace 2. usando el método de flecha (=>). ver los métodos handleort1 y handleort
fuente
A continuación se muestra el ejemplo que pasa valor en el evento onClick.
Usé la sintaxis es6. recuerde que la función de flecha de componente de clase no se vincula automáticamente, por lo que se vincula explícitamente en el constructor.
fuente
Supongo que tendrás que vincular el método a la instancia de clase de React. Es más seguro usar un constructor para unir todos los métodos en React. En su caso, cuando pasa el parámetro al método, el primer parámetro se utiliza para vincular el contexto 'this' del método, por lo que no puede acceder al valor dentro del método.
fuente
fuente
Hay una manera muy fácil.
fuente
fuente
Saliendo de la nada a esta pregunta, pero creo
.bind
que funcionará. Encuentra el código de muestra a continuación.fuente
Usando la función de flecha:
Debe instalar la etapa 2:
npm install babel-preset-stage-2:
fuente
Hay 3 formas de manejar esto: -
Enlace el método en constructor como: -
Use la función de flecha mientras la crea como: -
La tercera forma es esta: -
fuente
Puedes usar tu código así:
Aquí e es para objeto de evento, si desea utilizar métodos de evento como
preventDefault()
en su función de control o desea obtener un valor de destino o un nombre comoe.target.name
.fuente
Encontré la solución de pasar el parámetro como atributo de una etiqueta bastante razonable.
Sin embargo tiene limitaciones:
Es por eso que se me ocurrió esta biblioteca: react-event-param
Eso:
Ejemplo de uso:
fuente
Hubo muchas consideraciones de rendimiento, todo en el vacío.
El problema con estos controladores es que debe curry para incorporar el argumento que no puede nombrar en los accesorios.
Esto significa que el componente necesita un controlador para cada elemento en el que se puede hacer clic. Acordemos que para algunos botones esto no es un problema, ¿verdad?
El problema surge cuando maneja datos tabulares con docenas de columnas y miles de filas. Ahí notas el impacto de crear tantos manejadores.
El hecho es que solo necesito uno.
Configuré el controlador en el nivel de la tabla (o UL u OL ...), y cuando ocurre el clic, puedo decir cuál fue la celda en la que se hizo clic utilizando los datos disponibles desde siempre en el objeto de evento:
Utilizo los campos de nombre de etiqueta para verificar que el clic se haya producido en un elemento válido, por ejemplo, ignore los clics en otros pies de página.
El rowIndex y cellIndex dan la ubicación exacta de la celda en la que se hizo clic.
El contenido de texto es el texto de la celda en la que se hizo clic.
De esta manera, no necesito pasar los datos de la celda al controlador, puede autoservicio.
Si necesitaba más datos, datos que no se mostrarán, puedo usar el atributo del conjunto de datos o elementos ocultos.
Con un poco de navegación DOM simple, todo está a la mano.
Esto se ha usado en HTML desde siempre, ya que las PC eran mucho más fáciles de empantanar.
fuente
Hay dos formas de pasar parámetros en controladores de eventos, algunas son las siguientes.
Puede usar una función de flecha para ajustar un controlador de eventos y pasar parámetros:
el ejemplo anterior es equivalente a llamar
.bind
o puede llamar explícitamente a bind.Además de estos dos enfoques, también puede pasar argumentos a una función que se define como una función de curry.
fuente
Use un cierre , da como resultado una solución limpia:
<th onClick={this.handleSort(column)} >{column}</th>
La función handleSort devolverá una función que ya tiene la columna de valor establecida.
La función anónima se llamará con el valor correcto cuando el usuario haga clic en el th.
Ejemplo: https://stackblitz.com/edit/react-pass-parameters-example
fuente
Se requiere un cambio simple:
Utilizar
<th value={column} onClick={that.handleSort} >{column}</th>
en vez de
<th value={column} onClick={that.handleSort} >{column}</th>
fuente