Quantcast
Channel: ¿Cómo pasar a una funcion de evento varios parametros en un componente React? - Stack Overflow en español
Viewing all articles
Browse latest Browse all 6

Respuesta de David Martín en ¿Cómo pasar a una funcion de evento varios parametros en un componente React?

$
0
0

Si pones "this.funcion(this, num)" estas activando esa función al hacer el render del componente y en el onKeyDown no estas metiendo la función sino el return de la función, por eso no te lo reconoce.

<input type="text" onKeyDown={this.funcion(this, num)}/>

Para poder activar la función con el onKeyDown y poder pasarle un contenido de la variable diferente en "num" envolvemos en una función (closure) "this.funcion".

Te muestro algunas maneras de como hacerlo:

Ejemplo con arrow function:

class Input extends React.Component {    state = {};    constructor(props) {        super(props);        // Esto te sobra si utilizas arrow         //this.funcion= this.funcion.bind(this);    }    funcion(evt , num) {        console.log("Num: ",num);        console.log("Codigo de tecla: ",evt.keyCode);    }    render() {        return <input type="text" onKeyDown={(e) => {this.funcion(e, Math.random())}}/>    }}ReactDOM.render(<Input />,    document.getElementById('componente'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script><div id="componente"></div>

Si lo haces sin arrow function tienes que bindearle el contexto (this):

class Input extends React.Component {state = {};constructor(props) {    super(props);  //Esto te sobra si bindeas el conxtexto directamente.   // this.funcion= this.funcion.bind(this)}funcion(evt, num) {    console.log("Num: ",num);    console.log("Codigo de tecla: ",evt.keyCode);}render() {    return <input type="text" onKeyDown={(function (e) {this.funcion(e, Math.random())}).bind(this)}/>}}ReactDOM.render(<Input />,    document.getElementById('componente'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script><div id="componente"></div>

Con bind, ojo tienes que cambiar el orden de los parámetros de la función, también he añadido un input para cambiar la variable num guardada en el estado del componente:

class Input extends React.Component {    state = {        num: 0    };    constructor(props) {        super(props);    }    funcion(num, evt) {        console.log("Num: ",num);        console.log("Codigo de tecla: ",evt.keyCode);    }    cambiarNum(e){        this.setState({num: e.target.value });    }    render() {        return (<div><input type="text" placeholder="num" value={this.state.num} onChange={this.cambiarNum.bind(this)}/><input type="text" onKeyDown={this.funcion.bind(this, this.state.num)}/></div>        )    }}ReactDOM.render(<Input />,    document.getElementById('componente'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script><div id="componente"></div>

Ya que estoy os dejo el ejemplo de @noodle71 en JSX:

class Input extends React.Component {    state = {        num: 0    };    constructor(props) {        super(props);      this.cambiarNum = this.cambiarNum.bind(this);    }    funcion(evt,num) {        console.log("Num: ",num);        console.log("Codigo de tecla: ",evt.keyCode);    }    funcionEventHandler(num) {        return (evt) => {            this.funcion(evt, num);        }    }    cambiarNum(e){        this.setState({num: e.target.value });    }    render() {        return (<div><input type="text" placeholder="num" value={this.state.num} onChange={this.cambiarNum}/><input type="text" onKeyDown={this.funcionEventHandler(this.state.num)}/></div>        )    }}ReactDOM.render(<Input />,    document.getElementById('componente'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script><div id="componente"></div>

Viewing all articles
Browse latest Browse all 6

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>