Soy nuevo en ReactJS, lo siento si esto suena mal. Tengo un componente que crea varias filas de tabla de acuerdo con los datos recibidos.
Cada celda dentro de la columna tiene una casilla de verificación de radio. Por lo tanto, el usuario puede seleccionar uno site_name
y uno address
de las filas existentes. La selección se mostrará en el pie de página. Y ahí es donde estoy atrapado.
var SearchResult = React.createClass({
render: function(){
var resultRows = this.props.data.map(function(result){
return (
<tbody>
<tr>
<td><input type="radio" name="site_name" value={result.SITE_NAME}>{result.SITE_NAME}</input></td>
<td><input type="radio" name="address" value={result.ADDRESS}>{result.ADDRESS}</input></td>
</tr>
</tbody>
);
});
return (
<table className="table">
<thead>
<tr>
<th>Name</th>
<th>Address</th>
</tr>
</thead>
{resultRows}
<tfoot>
<tr>
<td>chosen site name ???? </td>
<td>chosen address ????? </td>
</tr>
</tfoot>
</table>
);
}
});
En jQuery podría hacer algo como $("input[name=site_name]:checked").val()
obtener la selección de un tipo de casilla de verificación de radio e insertarlo en la primera celda de pie de página.
Pero seguramente debe haber una forma de Reactjs, que me estoy perdiendo por completo. Muchas gracias
input
Los elementos no tienen contenido. Entonces<input>content</input>
no tiene sentido y es inválido. Usted puede querer<label><input />content</label>
.Respuestas:
Cualquier cambio en el renderizado se debe cambiar a través de
state
oprops
( react doc ).Así que aquí registro el evento de la entrada, y luego cambio el
state
, que luego activará el render para mostrar en el pie de página.jsbin
fuente
}, this);
justo debajo de</tbody>
. ¿Qué es y para qué sirve? Noté sin eso que el código falla.this
es el contexto pasado a lamap
función . Fue la edición de @FakeRainBrigand, ¡buena captura! Sin ella, su funciónthis
en el mapa se referirá awindow
, que no tiene idea de quéstate
se tratathis
truco es innecesario si usa una flecha ES6 en lugar de una función normal. Por ejemplo:var resultRows = this.props.data.map((result) => { ... });
solo lo menciono porque los Reactores usualmente ya usan alguna forma de transpilación (para JSX), por lo que ES6 generalmente está al alcance de la mano.onInputChange (e) {this.setState({ [e.target.name]: e.target.value }); }
Aquí hay una forma más sencilla de implementar botones de radio en react js.
Editado
Puede usar la función de flecha en lugar de la encuadernación. Reemplace el código anterior como
<div onChange={event => this.setGender(event)}>
Para un uso de valor predeterminado
defaultChecked
, como estefuente
.bind(this)
que creará una nueva función cada vez. Esto significa que cuando reaccione las comprobaciones para ver si algo ha cambiado en el DOM virtual, este componente siempre será diferente y siempre necesitará una nueva representación.name
accesorio. Ambos están envueltos en un div que tiene elonChange
controlador como se describe en esta respuesta. Hago clic en la primera radio, se dispara un evento. Hago clic en la segunda radio, se dispara un evento. La tercera vez y en adelante, sin embargo, no se dispara ningún evento. ¿Por qué?Según lo que dicen los documentos de React :
Por ejemplo:
Enlace al ejemplo: https://codesandbox.io/s/6l6v9p0qkr
Al principio, ninguno de los botones de radio está seleccionado, por lo que
this.state
es un objeto vacío, pero cada vez que se selecciona el botón de radiothis.state
obtiene una nueva propiedad con el nombre de la entrada y su valor. Entonces es más fácil verificar si el usuario seleccionó algún botón de radio como:EDITAR:
Con la versión 16.7-alpha de React hay una propuesta para algo llamado
hooks
que le permitirá hacer este tipo de cosas más fácilmente:En el siguiente ejemplo, hay dos grupos de botones de opción en un componente funcional. Aún así, tienen entradas controladas:
Ejemplo de trabajo: https://codesandbox.io/s/6l6v9p0qkr
fuente
Haga que el componente de radio sea un componente tonto y pase los accesorios a padre.
fuente
Solo una idea aquí: cuando se trata de entradas de radio en React, generalmente las represento de una manera diferente que se mencionó en las respuestas anteriores.
Si esto puede ayudar a cualquiera que necesite mostrar muchos botones de radio:
fuente
checked={ this.state.gender === value }
. Los componentes funcionales no tienenthis
.fuente
Al hacer clic en un botón de opción, se activará un evento que:
self.props.selectionChanged(...)
En el primer caso, el cambio de estado desencadenará una nueva representación y usted puede hacer
<td>chosen site name {this.state.chosenSiteName} </td>
en el segundo caso, la fuente de la devolución de llamada actualizará las cosas para garantizar que en el futuro, su instancia de SearchResult haya elegido SetSiteName y chosenAddress en sus accesorios.
fuente
Para construir sobre ChinKang dijo por su respuesta, tengo un enfoque más seco y en es6 para aquellos interesados:
excepto que este tendría un valor predeterminado marcado.
fuente
También me confundí en la radio, la implementación de la casilla de verificación. Lo que necesitamos es escuchar el evento de cambio de la radio y luego configurar el estado. He hecho un pequeño ejemplo de selección de género.
fuente
Bootstrap chicos, lo hacemos así:
fuente