javascript - parameter - Reaccionar controlador de eventos JS onClick
react onclick parameter (9)
El manejo de eventos con elementos React es muy similar al manejo de eventos en elementos DOM. Hay algunas diferencias sintácticas:
- Los eventos de reacción se nombran usando camelCase, en lugar de minúsculas.
- Con JSX, pasa una función como controlador de eventos, en lugar de una cadena.
Entonces, como se menciona en la documentación de React , son bastante similares al HTML normal cuando se trata de Manejo de eventos, pero los nombres de eventos en React usan camelcase, porque no son realmente HTML, son JavaScript, también, usted pasa la función mientras pasamos la llamada en formato de cadena para HTML, son diferentes, pero los conceptos son bastante similares ...
Mire el ejemplo a continuación, preste atención a la forma en que el evento se pasa a la función:
function ActionLink() {
function handleClick(e) {
e.preventDefault();
console.log(''The link was clicked.'');
}
return (
<a href="#" onClick={handleClick}>
Click me
</a>
);
}
yo tengo
var TestApp = React.createClass({
getComponent: function(){
console.log(this.props);
},
render: function(){
return(
<div>
<ul>
<li onClick={this.getComponent}>Component 1</li>
</ul>
</div>
);
}
});
React.renderComponent(<TestApp />, document.body);
Quiero colorear el fondo del elemento de la lista en el que se hizo clic. ¿Cómo puedo hacer esto en React?
Algo como
$(''li'').on(''click'', function(){
$(this).css({''background-color'': ''#ccc''});
});
¿Por qué no solo:
onItemClick: function (event) {
event.currentTarget.style.backgroundColor = ''#ccc'';
},
render: function() {
return (
<div>
<ul>
<li onClick={this.onItemClick}>Component 1</li>
</ul>
</div>
);
}
Y si desea ser más reactivo al respecto, es posible que desee establecer el elemento seleccionado como estado de su componente React que contiene, luego haga referencia a ese estado para determinar el color del elemento en el
render
:
onItemClick: function (event) {
this.setState({ selectedItem: event.currentTarget.dataset.id });
//where ''id'' = whatever suffix you give the data-* li attribute
},
render: function() {
return (
<div>
<ul>
<li onClick={this.onItemClick} data-id="1" className={this.state.selectedItem == 1 ? "on" : "off"}>Component 1</li>
<li onClick={this.onItemClick} data-id="2" className={this.state.selectedItem == 2 ? "on" : "off"}>Component 2</li>
<li onClick={this.onItemClick} data-id="3" className={this.state.selectedItem == 3 ? "on" : "off"}>Component 3</li>
</ul>
</div>
);
},
Por supuesto, querrás poner esos
<li>
s en un bucle, y necesitas hacer que los estilos
li.on
y
li.off
establezcan tu
background-color
.
Así es como define un controlador de eventos reaccionar onClick , que respondía al título de la pregunta ... usando la sintaxis es6
import React, { Component } from ''react'';
export default class Test extends Component {
handleClick(e) {
e.preventDefault()
console.log(e.target)
}
render() {
return (
<a href=''#'' onClick={e => this.handleClick(e)}>click me</a>
)
}
}
Dos formas en las que puedo pensar son
var TestApp = React.createClass({
getComponent: function(index) {
$(this.getDOMNode()).find(''li:nth-child('' + index + '')'').css({
''background-color'': ''#ccc''
});
},
render: function() {
return (
<div>
<ul>
<li onClick={this.getComponent.bind(this, 1)}>Component 1</li>
<li onClick={this.getComponent.bind(this, 2)}>Component 2</li>
<li onClick={this.getComponent.bind(this, 3)}>Component 3</li>
</ul>
</div>
);
}
});
React.renderComponent(<TestApp /> , document.getElementById(''soln1''));
Este es mi favorito personal.
var ListItem = React.createClass({
getInitialState: function() {
return {
isSelected: false
};
},
handleClick: function() {
this.setState({
isSelected: true
})
},
render: function() {
var isSelected = this.state.isSelected;
var style = {
''background-color'': ''''
};
if (isSelected) {
style = {
''background-color'': ''#ccc''
};
}
return (
<li onClick={this.handleClick} style={style}>{this.props.content}</li>
);
}
});
var TestApp2 = React.createClass({
getComponent: function(index) {
$(this.getDOMNode()).find(''li:nth-child('' + index + '')'').css({
''background-color'': ''#ccc''
});
},
render: function() {
return (
<div>
<ul>
<ListItem content="Component 1" />
<ListItem content="Component 2" />
<ListItem content="Component 3" />
</ul>
</div>
);
}
});
React.renderComponent(<TestApp2 /> , document.getElementById(''soln2''));
Aquí hay una DEMO
Espero que esto ayude.
Puede utilizar el método React.createClone. Cree su elemento, que cree un clon de él. Durante la creación del clon, puedes inyectar accesorios. Inyecte un onClick: método de apoyo como este
{ onClick : () => this.changeColor(originalElement, index) }
El método changeColor establecerá el estado con el duplicado, permitiéndole configurar el color en el proceso.
render()
{
return(
<ul>
{this.state.items.map((val, ind) => {
let item = <li key={ind}>{val}</li>;
let props = {
onClick: () => this.Click(item, ind),
key : ind,
ind
}
let clone = React.cloneElement(item, props, [val]);
return clone;
})}
</ul>
)
}
Si está utilizando ES6, aquí hay un código de ejemplo simple:
import React from ''wherever_react_is'';
class TestApp extends React.Component {
getComponent(event) {
console.log(''li item clicked!'');
event.currentTarget.style.backgroundColor = ''#ccc'';
}
render() {
return(
<div>
<ul>
<li onClick={this.getComponent.bind(this)}>Component 1</li>
</ul>
</div>
);
}
}
export default TestApp;
En los cuerpos de clase ES6, las funciones ya no requieren la palabra clave ''función'' y no necesitan estar separadas por comas. También puede usar la sintaxis => si lo desea.
Aquí hay un ejemplo con elementos creados dinámicamente:
import React from ''wherever_react_is'';
class TestApp extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [
{name: ''Name 1'', id: 123},
{name: ''Name 2'', id: 456}
]
}
}
getComponent(event) {
console.log(''li item clicked!'');
event.currentTarget.style.backgroundColor = ''#ccc'';
}
render() {
<div>
<ul>
{this.state.data.map(d => {
return(
<li key={d.id} onClick={this.getComponent.bind(this)}>{d.name}</li>
)}
)}
</ul>
</div>
);
}
}
export default TestApp;
Tenga en cuenta que cada elemento creado dinámicamente debe tener una ''clave'' de referencia única.
Además, si desea pasar el objeto de datos real (en lugar del evento) a su función onClick, deberá pasarlo a su enlace. Por ejemplo:
Nueva función onClick:
getComponent(object) {
console.log(object.name);
}
Pasando el objeto de datos:
{this.state.data.map(d => {
return(
<li key={d.id} onClick={this.getComponent.bind(this, d)}>{d.name}</li>
)}
)}
Utilice ECMA2015. Las funciones de flecha hacen que "esto" sea mucho más intuitivo.
import React from ''react'';
class TestApp extends React.Component {
getComponent(e, index) {
$(e.target).css({
''background-color'': ''#ccc''
});
}
render() {
return (
<div>
<ul>
<li onClick={(e) => this.getComponent(e, 1)}>Component 1</li>
<li onClick={(e) => this.getComponent(e, 2)}>Component 2</li>
<li onClick={(e) => this.getComponent(e, 3)}>Component 3</li>
</ul>
</div>
);
}
});
React.renderComponent(<TestApp /> , document.getElementById(''soln1''));`
import React from ''react'';
class MyComponent extends React.Component {
getComponent(event) {
event.target.style.backgroundColor = ''#ccc'';
// or you can write
//arguments[0].target.style.backgroundColor = ''#ccc'';
}
render() {
return(
<div>
<ul>
<li onClick={this.getComponent.bind(this)}>Component 1</li>
</ul>
</div>
);
}
}
export { MyComponent }; // use this to be possible in future imports with {} like: import {MyComponent} from ''./MyComponent''
export default MyComponent;
Por favor comente si vota negativamente. Este es un patrón de reacción no estándar (pero no tan raro) que no usa JSX, sino que pone todo en línea. Además, es Coffeescript.
La ''React-way'' para hacer esto sería con el propio estado del componente:
(
c = console.log.bind console
)
mock_items: [
{
name: ''item_a''
uid: shortid()
}
{
name: ''item_b''
uid: shortid()
}
{
name: ''item_c''
uid: shortid()
}
]
getInitialState: ->
lighted_item: null
render: ->
div null,
ul null,
for item, idx in @mock_items
uid = item.uid
li
key: uid
onClick: do (idx, uid) =>
(e) =>
# justf to illustrate these are bound in closure by the do lambda,
c idx
c uid
@setState
lighted_item: uid
style:
cursor: ''pointer''
background: do (uid) =>
c @state.lighted_item
c ''and uid'', uid
if @state.lighted_item is uid then ''magenta'' else ''chartreuse''
# background: ''chartreuse''
item.name
Este ejemplo funciona: lo probé localmente. Puede consultar este código de ejemplo exactamente en mi github . Originalmente, el entorno era solo local para mis propios fines de investigación y desarrollo de pizarra, pero lo publiqué en Github para esto. Puede que se escriba en algún momento, pero puede consultar el commit del 8 de septiembre de 2016 para ver esto.
En términos más generales, si desea ver cómo funciona este patrón CS / no-JSX para React, consulte algunos trabajos recientes here . Es posible que tenga tiempo para implementar completamente un POC para esta idea de aplicación, cuya pila incluye NodeJS, Primus, Redis y React.