No se puede acceder a la instancia de React (esto) dentro del controlador de eventos [duplicado]

220
user3696212 2015-04-12 02:41.

Estoy escribiendo un componente simple en ES6 (con BabelJS) y las funciones this.setStateno funcionan.

Los errores típicos incluyen algo como

No se puede leer la propiedad 'setState' de undefined

o

this.setState no es una función

¿Sabes por qué? Aquí está el código:

import React from 'react'

class SomeClass extends React.Component {
  constructor(props) {
    super(props)
    this.state = {inputContent: 'startValue'}
  }

  sendContent(e) {
    console.log('sending input content '+React.findDOMNode(React.refs.someref).value)
  }

  changeContent(e) {
    this.setState({inputContent: e.target.value})
  } 

  render() {
    return (
      <div>
        <h4>The input form is here:</h4>
        Title: 
        <input type="text" ref="someref" value={this.inputContent} 
          onChange={this.changeContent} /> 
        <button onClick={this.sendContent}>Submit</button>
      </div>
    )
  }
}

export default SomeClass

19 answers

253
Alexandre Kirszenberg 2015-04-12 03:09.

this.changeContentdebe estar vinculado a la instancia del componente a través de this.changeContent.bind(this)antes de pasar como onChangeprop, de lo contrario, la thisvariable en el cuerpo de la función no se referirá a la instancia del componente sino a window. Ver Función :: vincular .

Cuando se usa en React.createClasslugar de las clases ES6, cada método que no sea del ciclo de vida definido en un componente se vincula automáticamente a la instancia del componente. Consulte Autoencuadernación .

Tenga en cuenta que vincular una función crea una nueva función. Puede vincularlo directamente en el render, lo que significa que se creará una nueva función cada vez que el componente se renderice, o vincularlo en su constructor, que solo se activará una vez.

constructor() {
  this.changeContent = this.changeContent.bind(this);
}

vs

render() {
  return <input onChange={this.changeContent.bind(this)} />;
}

Las referencias se establecen en la instancia del componente y no en React.refs: debe cambiar React.refs.somerefa this.refs.someref. También deberá vincular el sendContentmétodo a la instancia del componente para que se thisrefiera a él.

104
Kyeotic 2015-12-03 08:15.

Morhaus tiene razón, pero esto se puede resolver sin bind.

Puede utilizar una función de flecha junto con la propuesta de propiedades de clase :

class SomeClass extends React.Component {
  changeContent = (e) => {
    this.setState({inputContent: e.target.value})
  } 

  render() {
    return <input type="text" onChange={this.changeContent} />;
  }
}

Debido a que la función de flecha se declara en el alcance del constructor, y debido a que las funciones de flecha mantienen thisdesde su alcance de declaración, todo funciona. La desventaja aquí es que estas no serán funciones en el prototipo, todas serán recreadas con cada componente. Sin embargo, esto no es una gran desventaja ya que bindresulta en lo mismo.

56
Kaloyan Kosev 2016-12-22 12:11.

Este problema es una de las primeras cosas que la mayoría de nosotros experimentamos al pasar de la React.createClass()sintaxis de definición de componentes a la forma de extensión de la clase ES6 React.Component.

Es causada por las thisdiferencias de contexto en React.createClass()contraextends React.Component .

El uso React.createClass()vinculará automáticamente el thiscontexto (valores) correctamente, pero ese no es el caso cuando se usan las clases de ES6. Al hacerlo de la manera ES6 (extendiendo React.Component) el thiscontexto es nullpor defecto. Las propiedades de la clase no se vinculan automáticamente a la instancia de la clase React (componente).


Enfoques para resolver este problema

Conozco un total de 4 enfoques generales.

  1. Vincula tus funciones en el constructor de clases . Considerado por muchos como un enfoque de mejores prácticas que evita tocar JSX en absoluto y no crea una nueva función en cada repetición de componente.

    class SomeClass extends React.Component {
      constructor(props) {
        super(props);
        this.handleClick = this.handleClick.bind(this);
      }
      handleClick() {
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={this.handleClick}></button>
        );
      }
    }
    
  2. Vincula tus funciones en línea . Todavía puede encontrar este enfoque utilizado aquí y allá en algunos tutoriales / artículos / etc., por lo que es importante que lo sepa. Es el mismo concepto que el # 1, pero tenga en cuenta que vincular una función crea una nueva función por cada re-renderización.

    class SomeClass extends React.Component {
      handleClick() {
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={this.handleClick.bind(this)}></button>
        );
      }
    }
    
  3. Utilice una función de flecha gruesa . Hasta que funciona la flecha, cada nueva función define su propio thisvalor. Sin embargo, la función de flecha no crea su propio thiscontexto, por lo que thistiene el significado original de la instancia del componente React. Por tanto, podemos:

    class SomeClass extends React.Component {
      handleClick() {
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={ () => this.handleClick() }></button>
        );
      }
    }
    

    o

    class SomeClass extends React.Component {
      handleClick = () => {
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={this.handleClick}></button>
        );
      }
    }
    
  4. Utilice la biblioteca de funciones de utilidad para vincular automáticamente sus funciones . Existen algunas bibliotecas de utilidades que automáticamente hacen el trabajo por usted. Éstos son algunos de los más populares, solo por mencionar algunos:

    • Autobind Decorator es un paquete de NPM que vincula métodos de una clase a la instancia correcta de this, incluso cuando los métodos están separados. El paquete usa @autobindmétodos before para enlazar thiscon la referencia correcta al contexto del componente.

      import autobind from 'autobind-decorator';
      
      class SomeClass extends React.Component {
        @autobind
        handleClick() {
          console.log(this); // the React Component instance
        }
        render() {
          return (
            <button onClick={this.handleClick}></button>
          );
        }
      }
      

      Autobind Decorator es lo suficientemente inteligente como para permitirnos vincular todos los métodos dentro de una clase de componente a la vez, al igual que el enfoque n. ° 1.

    • Class Autobind es otro paquete de NPM que se usa ampliamente para resolver este problema de vinculación. A diferencia de Autobind Decorator, no usa el patrón del decorador, sino que en realidad solo usa una función dentro de su constructor que vincula automáticamente los métodos del Componente a la referencia correcta de this.

      import autobind from 'class-autobind';
      
      class SomeClass extends React.Component {
        constructor() {
          autobind(this);
          // or if you want to bind only only select functions:
          // autobind(this, 'handleClick');
        }
        handleClick() {
          console.log(this); // the React Component instance
        }
        render() {
          return (
            <button onClick={this.handleClick}></button>
          );
        }
      }
      

      PD: Otra biblioteca muy similar es React Autobind .


Recomendación

Si yo fuera usted, me quedaría con el enfoque n. ° 1. Sin embargo, tan pronto como obtenga una tonelada de enlaces en el constructor de su clase, le recomendaría que explore una de las bibliotecas auxiliares mencionadas en el enfoque n. ° 4.


Otro

No está relacionado con el problema que tiene, pero no debe abusar de los rechazos .

Su primera inclinación puede ser utilizar referencias para "hacer que las cosas sucedan" en su aplicación. Si este es el caso, tómese un momento y piense de manera más crítica acerca de dónde debería pertenecer el estado en la jerarquía de componentes.

Para propósitos similares, al igual que el que necesita, utilizar un componente controlado es la forma preferida. Le sugiero que considere usar su Componentestate . Por lo tanto, sólo tiene que acceder al valor de la siguiente manera: this.state.inputContent.

8
Andrew Li 2018-08-09 20:01.

Aunque las respuestas anteriores han proporcionado una descripción general básica de las soluciones (es decir, vinculación, funciones de flecha, decoradores que hacen esto por usted), todavía tengo que encontrar una respuesta que realmente explique por qué es necesario, que en mi opinión es la raíz de confusión, y conduce a pasos innecesarios como volver a unirse y seguir ciegamente lo que hacen los demás.

this es dinámico

Para comprender esta situación específica, una breve introducción a cómo thisfunciona. La clave aquí es que thises un enlace en tiempo de ejecución y depende del contexto de ejecución actual. Por lo tanto, la razón por la que se lo conoce comúnmente como "contexto", es decir, proporcionar información sobre el contexto de ejecución actual, y la razón por la que necesita vincular es porque pierde "contexto". Pero permítanme ilustrar el problema con un fragmento:

const foobar = {
  bar: function () {
    return this.foo;
  },
  foo: 3,
};
console.log(foobar.bar()); // 3, all is good!

En este ejemplo, obtenemos 3, como se esperaba. Pero tome este ejemplo:

const barFunc = foobar.bar;
console.log(barFunc()); // Uh oh, undefined!

Puede ser inesperado descubrir que se registra sin definir: ¿adónde se fue 3? La respuesta está en el "contexto" o en cómo se ejecuta una función. Compare cómo llamamos a las funciones:

// Example 1
foobar.bar();
// Example 2
const barFunc = foobar.bar;
barFunc();

Note la diferencia. En el primer ejemplo, estamos especificando exactamente dónde se ubica el barmétodo 1 , en el foobarobjeto:

foobar.bar();
^^^^^^

Pero en el segundo, almacenamos el método en una nueva variable y usamos esa variable para llamar al método, sin indicar explícitamente dónde existe realmente el método, perdiendo así contexto :

barFunc(); // Which object is this function coming from?

Y ahí radica el problema, cuando almacena un método en una variable, se pierde la información original sobre dónde se encuentra ese método (el contexto en el que se está ejecutando el método). Sin esta información, en tiempo de ejecución, no hay forma de que el intérprete de JavaScript vincule lo correcto; thissin un contexto específico, thisno funciona como se esperaba 2 .

Relacionado con React

Aquí hay un ejemplo de un componente de React (abreviado por brevedad) que sufre el thisproblema:

handleClick() {
  this.setState(({ clicks }) => ({ // setState is async, use callback to access previous state
    clicks: clicks + 1, // increase by 1
  }));
}

render() {
  return (
    <button onClick={this.handleClick}>{this.state.clicks}</button>
  );
}

Pero, ¿por qué y cómo se relaciona la sección anterior con esto? Esto se debe a que padecen una abstracción del mismo problema. Si echa un vistazo a cómo React maneja los controladores de eventos :

// Edited to fit answer, React performs other checks internally
// props is the current React component's props, registrationName is the name of the event handle prop, i.e "onClick"
let listener = props[registrationName];
// Later, listener is called

Entonces, cuando lo haga onClick={this.handleClick}, el método this.handleClickfinalmente se asignará a la variable listener3 . Pero ahora ve que surge el problema: desde que asignamos this.handleClicka listener, ¡ya no especificamos exactamente de dónde handleClickviene! Desde el punto de vista de React, listeneres solo una función, no adjunta a ningún objeto (o en este caso, la instancia del componente React). Hemos perdido contexto y, por lo tanto, el intérprete no puede inferir un thisvalor para usar dentro handleClick .

Por que funciona la encuadernación

Quizás se pregunte, si el intérprete decide el thisvalor en tiempo de ejecución, ¿por qué puedo vincular el controlador para que funcione ? Esto se debe a que puede utilizar Function#bindpara garantizar el thisvalor en tiempo de ejecución. Esto se hace estableciendo una thispropiedad de enlace interno en una función, lo que le permite no inferir this:

this.handleClick = this.handleClick.bind(this);

Cuando se ejecuta esta línea, presumiblemente en el constructor, se captura la corrientethis (la instancia del componente React) y se establece como un thisenlace interno de una función completamente nueva, devuelta desde Function#bind. Esto asegura que cuando thisse calcule en tiempo de ejecución, el intérprete no intentará inferir nada, sino que utilizará el thisvalor proporcionado que le dio.

Por que funcionan las propiedades de la función de flecha

Las propiedades de la clase de función Arrow actualmente funcionan a través de Babel según la transpilación:

handleClick = () => { /* Can use this just fine here */ }

Se convierte en:

constructor() {
  super();
  this.handleClick = () => {}
}

Y esto funciona debido al hecho de que las funciones de flecha no vinculan su propio this, sino que toman el thisde su alcance adjunto. En este caso, el constructor's this, que apunta a la instancia del componente React, lo que le da la correcta this. 4


1 Utilizo "método" para referirme a una función que se supone que está vinculada a un objeto, y "función" para aquellas que no.

2 En el segundo fragmento, se registra undefined en lugar de 3 porque se establece de forma thispredeterminada en el contexto de ejecución global ( windowcuando no está en modo estricto, o de lo contrario undefined) cuando no se puede determinar mediante un contexto específico. Y en el ejemplo window.foono existe por lo que cede indefinido.

3 Si desciende por la madriguera de cómo se ejecutan los eventos en la cola de eventos, invokeGuardedCallbackse llama al oyente.

4 En realidad, es mucho más complicado . React internamente intenta usarlo Function#applyen oyentes para su propio uso, pero esto no funciona con las funciones de flecha ya que simplemente no se vinculan this. Eso significa que, cuando thisse evalúa realmente la función dentro de la flecha, thisse resuelve cada entorno léxico de cada contexto de ejecución del código actual del módulo. El contexto de ejecución que finalmente se resuelve para tener un thisenlace es el constructor, que thisapunta a la instancia actual del componente React, lo que le permite funcionar.

2
Liju Kuriakose 2017-09-13 23:43.

Puede abordar esto de tres maneras

1.Enlace la función de evento en el propio constructor de la siguiente manera

import React from 'react'

class SomeClass extends React.Component {
  constructor(props) {
    super(props)
    this.state = {inputContent: 'startValue'}
    this.changeContent = this.changeContent.bind(this);
  }

  sendContent(e) {
    console.log('sending input content '+React.findDOMNode(React.refs.someref).value)
  }

  changeContent(e) {
    this.setState({inputContent: e.target.value})
  } 

  render() {
    return (
      <div>
        <h4>The input form is here:</h4>
        Title: 
        <input type="text" ref="someref" value={this.inputContent} 
          onChange={this.changeContent} /> 
        <button onClick={this.sendContent}>Submit</button>
      </div>
    )
  }
}

export default SomeClass

2.Enlazar cuando se llame

import React from 'react'

class SomeClass extends React.Component {
  constructor(props) {
    super(props)
    this.state = {inputContent: 'startValue'}
  }

  sendContent(e) {
    console.log('sending input content '+React.findDOMNode(React.refs.someref).value)
  }

  changeContent(e) {
    this.setState({inputContent: e.target.value})
  } 

  render() {
    return (
      <div>
        <h4>The input form is here:</h4>
        Title: 
        <input type="text" ref="someref" value={this.inputContent} 
          onChange={this.changeContent} /> 
        <button onClick={this.sendContent.bind(this)}>Submit</button>
      </div>
    )
  }
}

export default SomeClass

3 mediante el uso de funciones de flecha

import React from 'react'

class SomeClass extends React.Component {
  constructor(props) {
    super(props)
    this.state = {inputContent: 'startValue'}
  }

  sendContent(e) {
    console.log('sending input content '+React.findDOMNode(React.refs.someref).value)
  }

  changeContent(e) {
    this.setState({inputContent: e.target.value})
  } 

  render() {
    return (
      <div>
        <h4>The input form is here:</h4>
        Title: 
        <input type="text" ref="someref" value={this.inputContent} 
          onChange={this.changeContent} /> 
        <button onClick={()=>this.sendContent()}>Submit</button>
      </div>
    )
  }
}

export default SomeClass
1
Liju Kuriakose 2017-08-21 23:27.

Necesitamos vincular la función de evento con el componente en el constructor de la siguiente manera,

import React from 'react'

class SomeClass extends React.Component {
  constructor(props) {
    super(props)
    this.state = {inputContent: 'startValue'}
    this.changeContent = this.changeContent.bind(this);
  }

  sendContent(e) {
    console.log('sending input content '+React.findDOMNode(React.refs.someref).value)
  }

  changeContent(e) {
    this.setState({inputContent: e.target.value})
  } 

  render() {
    return (
      <div>
        <h4>The input form is here:</h4>
        Title: 
        <input type="text" ref="someref" value={this.inputContent} 
          onChange={this.changeContent} /> 
        <button onClick={this.sendContent}>Submit</button>
      </div>
    )
  }
}

export default SomeClass

Gracias

1
Ivan Mjartan 2017-12-15 03:25.

Mi recomendación es utilizar funciones de flecha como propiedades.

class SomeClass extends React.Component {
  handleClick = () => {
    console.log(this); // the React Component instance
  }
  render() {
    return (
      <button onClick={this.handleClick}></button>
    );
  }
}

y no utilice las funciones de flecha como

class SomeClass extends React.Component {
      handleClick(){
        console.log(this); // the React Component instance
      }
      render() {
        return (
          <button onClick={()=>{this.handleClick}}></button>
        );
      }
    }

debido a que el segundo enfoque generará una nueva función en cada llamada de renderizado, de hecho, esto significa un nuevo puntero, una nueva versión de los accesorios, que si luego se preocupa por el rendimiento, puede usar React.PureComponent o en React.Component puede anular shouldComponentUpdate (nextProps, nextState) y cheque superficial cuando llegaron los accesorios

1
azmul hossain 2018-02-06 21:24.

Puedes resolver esto siguiendo estos pasos

Cambiar la función sendContent con

 sendContent(e) {
    console.log('sending input content '+this.refs.someref.value)
  }

Cambiar la función de renderizado con

<input type="text" ref="someref" value={this.state.inputContent} 
          onChange={(event)=>this.changeContent(event)} /> 
   <button onClick={(event)=>this.sendContent(event)}>Submit</button>
1
Mustkeem K 2018-07-09 21:05.

Tenemos que bindnuestra función con thispara obtener una instancia de la función en la clase. Como en el ejemplo

<button onClick={this.sendContent.bind(this)}>Submit</button>

De esta forma this.stateserá objeto válido.

1
coder 2019-11-23 14:48.

si alguien alguna vez llegará a esta respuesta, aquí hay una forma de vincular todas las funciones sin necesidad de vincularlas manualmente

en el constructor ():

for (let member of Object.getOwnPropertyNames(Object.getPrototypeOf(this))) {
    this[member] = this[member].bind(this)
}

o cree esta función en un archivo global.jsx

export function bindAllFunctions({ bindTo: dis }) {
for (let member of Object.getOwnPropertyNames(Object.getPrototypeOf(dis))) {
    dis[member] = dis[member].bind(dis)
    }
}

y en tu constructor () llámalo como:

bindAllFunctions({ bindTo: this })
0
Bassam Rubaye 2016-06-26 19:51.

Este problema ocurre porque this.changeContenty onClick={this.sendContent}no están vinculados a esto de la instancia del componente.

Hay otra solución (además de usar bind () en el constructor ()) para usar las funciones de flecha de ES6 que comparten el mismo alcance léxico del código circundante y mantienen esto , por lo que puede cambiar su código en render () a ser:

render() {
    return (

        <input type="text"
          onChange={ () => this.changeContent() } /> 

        <button onClick={ () => this.sendContent() }>Submit</button>

    )
  }
0
Florent Giraud 2017-04-13 23:36.

Hola, si no quieres preocuparte por vincularte tu llamada de función. Puede usar 'class-autobind' e importarlo así

import autobind from 'class-autobind';

class test extends Component {
  constructor(props){
  super(props);
  autobind(this);
}

No escriba autobind antes de la super llamada porque no funcionará

0
ZEE 2017-07-06 23:00.

En caso de que desee mantener el enlace en la sintaxis del constructor, puede usar el operador de enlace de propuesta y transformar su código como sigue:

constructor() {
  this.changeContent = ::this.changeContent;
}

En lugar de :

constructor() {
  this.changeContent = this.changeContent.bind(this);
}

mucho más simple, sin necesidad de bind(this)o fatArrow.

0
jack.lin 2018-01-11 03:30.

este problema ocurre después de react15.0, cuyo controlador de eventos no se vinculó automáticamente al componente. por lo que debe vincular esto al componente manualmente siempre que se llame al controlador de eventos.


hay varios métodos para resolver el problema. pero necesita saber qué método es mejor y por qué? En general, recomendamos vincular sus funciones en el constructor de clases o usar una función de flecha.

// method 1: use a arrow function
    class ComponentA extends React.Component {
      eventHandler = () => {
        console.log(this)
      }
      render() {
        return ( 
        <ChildComponent onClick={this.eventHandler} /> 
        );
      }

// method 2: Bind your functions in the class constructor.
    class ComponentA extends React.Component {
      constructor(props) {
        super(props);
        this.eventHandler = this.eventHandler.bind(this);
      }
      render() {
        return ( 
        <ChildComponent onClick={this.eventHandler} /> 
        );
      }

estos dos métodos no crearán una nueva función cuando el componente se procese cada vez. por lo que nuestro ChildComponent no se volverá a reproducir debido al cambio de accesorios de la nueva función, o puede producir el problema de rendimiento.

0
Niraj Raskoti 2018-08-14 18:57.

Está utilizando ES6, por lo que las funciones no se vincularán a "este" contexto automáticamente. Tienes que vincular manualmente la función al contexto.

constructor(props) {
  super(props);
  this.changeContent = this.changeContent.bind(this);
}
0
Hemadri Dasari 2018-08-18 15:28.

Sus funciones deben vincularse para jugar con el estado o los accesorios en los controladores de eventos

En ES5, vincule las funciones de su controlador de eventos solo en el constructor, pero no lo haga directamente en el render. Si enlaza directamente en el render, crea una nueva función cada vez que su componente se renderiza y se vuelve a renderizar. Así que siempre deberías vincularlo en el constructor.

this.sendContent = this.sendContent.bind(this)

En ES6, use las funciones de flecha

Cuando usa las funciones de flecha, entonces no necesita hacer un enlace y también puede mantenerse alejado de los problemas relacionados con el alcance

sendContent = (event) => {

}
0
Ebe 2018-09-23 02:38.

Alexandre Kirszenberg tiene razón, pero otra cosa importante a la que debe prestar atención es dónde coloca la encuadernación. He estado atrapado en una situación durante días (probablemente porque soy un principiante), pero a diferencia de otros, sabía sobre bind (que ya había aplicado), así que no podía entender por qué seguía teniendo esos errores. Resulta que tenía el enlace en el orden incorrecto.

Otro es quizás el hecho de que estaba llamando a la función dentro de "this.state", que no era consciente del enlace porque estaba por encima de la línea de enlace,

A continuación se muestra lo que tenía (por cierto, esta es mi primera publicación, pero pensé que era muy importante, ya que no pude encontrar una solución en ningún otro lugar):

constructor(props){
    super(props);

       productArray=//some array

    this.state={ 
        // Create an Array  which will hold components to be displayed
        proListing:productArray.map(product=>{return(<ProRow dele={this.this.popRow()} prodName={product.name} prodPrice={product.price}/>)})
    }

    this.popRow=this.popRow.bind(this);//This was the Issue, This line //should be kept above "this.state"
0
khizer 2019-05-04 12:25.

Solución:

  1. Sin vinculación explícita, bindcon el nombre del método puede usar la sintaxis de funciones de flecha gruesa () => {} que mantiene el contexto de this.
import React from 'react'

class SomeClass extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      inputContent: 'startValue'
    }
  }

  sendContent = (e) => {
    console.log('sending input content ',this.state.inputContent);
  }

  changeContent = (e) => {
    this.setState({inputContent: e.target.value},()=>{
      console.log('STATE:',this.state);
    })
  } 

  render() {
    return (
      <div>
        <h4>The input form is here:</h4>
        Title: 
        <input type="text" value={this.state.inputContent} 
          onChange={this.changeContent} /> 
        <button onClick={this.sendContent}>Submit</button>
      </div>
    )
  }
}

export default SomeClass

Otras soluciones:

  1. Vincula tus funciones en el constructor de clases.

  2. Vincula tus funciones en las llaves de escape de la plantilla JSX {} {this.methodName.bind (this)}

0
Eric Tan 2019-06-28 15:22.

bind(this)puede solucionar este problema, y ​​hoy en día podemos usar otras 2 formas de lograrlo si no le gusta usar bind.

1) Como de la forma tradicional, podemos usar bind(this)en el constructor, de modo que cuando usamos la función como devolución de llamada JSX, el contexto de thises la clase misma.

class App1 extends React.Component {
  constructor(props) {
    super(props);
    // If we comment out the following line,
    // we will get run time error said `this` is undefined.
    this.changeColor = this.changeColor.bind(this);
  }

  changeColor(e) {
    e.currentTarget.style.backgroundColor = "#00FF00";
    console.log(this.props);
  }

  render() {
    return (
      <div>
        <button onClick={this.changeColor}> button</button>
      </div>
    );
  }
}

2) Si definimos la función como un atributo / campo de la clase con función de flecha, no necesitamos usar bind(this)más.

class App2 extends React.Component {
  changeColor = e => {
    e.currentTarget.style.backgroundColor = "#00FF00";
    console.log(this.props);
  };
  render() {
    return (
      <div>
        <button onClick={this.changeColor}> button 1</button>
      </div>
    );
  }
}

3) Si usamos la función de flecha como devolución de llamada JSX, no es necesario que usemos bind(this)tampoco. Y además, podemos pasar los parámetros. Se ve bien, ¿no? pero su inconveniente es la preocupación por el rendimiento, para obtener más detalles, consulte el documento ReactJS .

class App3 extends React.Component {
  changeColor(e, colorHex) {
    e.currentTarget.style.backgroundColor = colorHex;
    console.log(this.props);
  }
  render() {
    return (
      <div>
        <button onClick={e => this.changeColor(e, "#ff0000")}> button 1</button>
      </div>
    );
  }
}

Y he creado un Codepen para hacer una demostración de estos fragmentos de código, espero que ayude.

Related questions

MORE COOL STUFF

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

Estados Unidos podría evitarse el horror del nuevo gran horneado británico

Estados Unidos podría evitarse el horror del nuevo gran horneado británico

Si este tráiler de pesadilla de la temporada más reciente de Great British Bake Off te asustó y te hizo no volver a ver el programa, es posible que tengas suerte: PBS no ha decidido si se transmitirá o no la última temporada en los Estados Unidos. actualización, para aquellos que no siguen sin aliento este tipo de drama de nicho: el presentador Paul Hollywood y la hermosa carpa llena de batidoras de colores pastel y cuadros se trasladaron de la BBC al Canal 4; Mary Berry, Sue Perkins y Mel Giedroyc renunciaron.

Atún como Oh, Hello llega a Netflix

Atún como Oh, Hello llega a Netflix

Foto: Netflix Oh, Hello On Broadway (Netflix): Después de llegar a Broadway el año pasado, los dos locos del Upper West Side interpretados por John Mulaney y Nick Kroll finalmente llegaron a Netflix. El especial consta del espectáculo en el escenario, algunos momentos entre bastidores y un invitado muy especial de “Too Much Tuna”.

Actualice a un Sonicare por tan solo $ 30

Actualice a un Sonicare por tan solo $ 30

¿Quiere probar un cepillo de dientes Sonicare sin gastar mucho dinero en uno de sus modelos favoritos de gama alta? Puede comprar un kit de la Serie 2 o Serie 3 por tan solo $ 30 hoy en Amazon. Haga clic aquí para ver la lista completa de modelos elegibles y tenga en cuenta que se descontarán $ 10 adicionales en su carrito.

Ponle una tapa. En realidad, ponle una tapa a todo. Consigue 12 tapas de cocina elásticas de silicona por $14. [Exclusivo]

Ponle una tapa. En realidad, ponle una tapa a todo. Consigue 12 tapas de cocina elásticas de silicona por $14. [Exclusivo]

Tapas elásticas de silicona de Tomorrow's Kitchen, paquete de 12 | $14 | Amazonas | Código promocional 20OFFKINJALids son básicamente los calcetines de la cocina; siempre perdiéndose, dejando contenedores huérfanos que nunca podrán volver a cerrarse. Pero, ¿y si sus tapas pudieran estirarse y adaptarse a todos los recipientes, ollas, sartenes e incluso frutas en rodajas grandes que sobran? Nunca más tendrás que preocuparte por perder esa tapa tan específica.

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.

India me está pateando el culo

India me está pateando el culo

Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

¿Merrick Garland le ha fallado a Estados Unidos?

Es más de la mitad de la presidencia de Biden. ¿Qué está esperando Merrick Garland?

¿Merrick Garland le ha fallado a Estados Unidos?

Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.

Language