Llame a múltiples funciones en Click ReactJS


116

Lo sé en vainilla js, podemos hacer

onclick="f1();f2()"

¿Cuál sería el equivalente para hacer dos llamadas de función onClick en ReactJS?

Sé que llamar a una función es así:

onClick={f1}

Muy simple: pase una función que llame a las dos funciones, tal como lo haría con ele.onclick = ...o addEventListener.
Felix Kling

En caso de que su primera función sea setState y necesite asegurarse de que esto suceda / tenga en cuenta antes de que se ejecute la segunda función, encontrará esta publicación bastante útil: medium.com/better-programming/…
Nasia Makrygianni

Respuestas:


217

Envuelva sus dos + llamadas a funciones en otra función / método. Aquí hay un par de variantes de esa idea:

1) Método separado

var Test = React.createClass({
   onClick: function(event){
      func1();
      func2();
   },
   render: function(){
      return (
         <a href="#" onClick={this.onClick}>Test Link</a>
      );
   }
});

o con clases ES6:

class Test extends React.Component {
   onClick(event) {
      func1();
      func2();
   }
   render() {
      return (
         <a href="#" onClick={this.onClick}>Test Link</a>
      );
   }
}

2) en línea

<a href="#" onClick={function(event){ func1(); func2()}}>Test Link</a>

o equivalente a ES6:

<a href="#" onClick={() => { func1(); func2();}}>Test Link</a>

5
O menos óptimo:onclick={function() { f1(); f2(); }}
Felix Kling

47
O en ES6onclick={()=>{ f1(); f2() }}
Alejandro Silva

2
O en cjsx:onClick={ () => f1(); f2() }
Vadorequest

2
¿Qué pasa si el primero es asincrónico? Quiero que el segundo se ejecute solo después de que el primero se complete con éxito
Ratnabh kumar rai

1
@Ratnabhkumarrai, esa es otra preocupación que no está relacionada con React. Se trata de async en JS y Promisesprobablemente sea la respuesta que estaba buscando.
Emile Bergeron

11

Tal vez pueda usar la función de flecha (ES6 +) o la declaración de función antigua simple.

Tipo de declaración de función normal ( no ES6 + ):

<link href="#" onClick={function(event){ func1(event); func2();}}>Trigger here</link>

Función anónima o tipo de función de flecha ( ES6 + )

<link href="#" onClick={(event) => { func1(event); func2();}}>Trigger here</link>

El segundo es el camino más corto que conozco. ¡Espero que te ayude!


6

Al llamar a múltiples funciones en onClick para cualquier elemento, puede crear una función contenedora, algo como esto.

wrapperFunction = () => {
    //do something
    function 1();
    //do something
    function 2();
    //do something
    function 3();
}

Estas funciones pueden definirse como un método en la clase principal y luego llamarse desde la función contenedora.

Es posible que tenga el elemento principal que causará el onChange de esta manera,

<a href='#' onClick={this.wrapperFunction}>Some Link</a>

0

esto onclick={()=>{ f1(); f2() }}me ayudó mucho si quiero dos funciones diferentes al mismo tiempo. Pero ahora quiero crear una grabadora de audio con un solo botón. Entonces, si hago clic primero, quiero ejecutar StartFunction f1()y si hago clic nuevamente, quiero ejecutar StopFunction f2().

¿Cómo se dan cuenta de esto, chicos?


¿Qué tal una función con generador? Puede decidir con una variable que cambia dentro de una condición que tiene una función después de ella, luego llama a la función que desea con rendimiento
Nikolas Freitas Mr Nik

const play = () => { console.log("played"); } const pause = () => { console.log("paused"); } function* audioSwitcher() { let paused = true; while (true) { if(paused) { play(); } else { pause(); } yield paused = !paused; } }
Nikolas Freitas Mr Nik

0

Puede usar anidado.

Hay una función de remolque, una es openTab()y otra es closeMobileMenue(), primero llamamos openTab()y llamamos a otra función dentro closeMobileMenue().

function openTab() {
    window.open('https://play.google.com/store/apps/details?id=com.drishya');
    closeMobileMenue()   //After open new tab, Nav Menue will close.  
}

onClick={openTab}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.