Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

190
Views
¿Cómo transferir "esto" de un componente a otros?

Tengo un componente (Component1) al que quiero llamar una función de otro (en este caso, la aplicación principal). Mi pregunta es por qué la función onClickMe no puede acceder a this desde el componente de la App .

 class Component1 extends React.Component { render() { return ( <div> <h5>sub Component 1 </h5> <button onClick={() => this.props.data[0].action("foo")}> Click Me! </button> </div> ); } } class App extends React.Component { constructor(props) { super(props); this.state = { clicked: false }; this.onClickMe = this.onClickMe.bind(this); } data = [{ name: "Giordano", action: this.onClickMe }]; onClickMe(value) { /// I can get the correct value here console.log(value); /// THIS IS THE PROBLEM. /// "this" here refers to the object `data` not App /// so there is no 'setState' function on this this.setState({ clicked: true }); } render() { return ( <div> <h1>Main page</h1> <Component1 data={this.data} /> </div> ); } }

el ejemplo de código: https://codesandbox.io/s/react-playground-forked-99kumd?file=/index.js

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Explicaré por qué sucede esto y agregaré algunos comentarios, pero primero, aquí está el código que funciona como espera:

 import React from "react"; import ReactDOM from "react-dom"; class Component1 extends React.Component { render() { return ( <div> <h5>sub Component 1 </h5> <button onClick={() => this.props.onClick("foo")}>Click Me!</button> </div> ); } } class App extends React.Component { constructor(props) { super(props); this.state = { clicked: false }; } // This syntax lets you get rid of .bind in constructor and just binds the method for you onClickMe = (value) => { console.log(this); console.log(value); this.setState({ clicked: true }); }; render() { return ( <div> <h1>Main page</h1> {/* It is better to pass props one by one, this way you can see what exactly you are passing */} <Component1 name="Giordano" onClick={this.onClickMe} /> </div> ); } } ReactDOM.render(<App />, document.getElementById("container"));

Estaba usando "datos" como un campo de instancia de clase pública ; en pocas palabras, su línea de asignación de "datos" se ejecutó antes del cuerpo del constructor, por lo que la función onClickMe aún no estaba vinculada cuando la asignó a la acción dentro del objeto de datos.

Otras cosas no son esenciales, son solo comentarios.

Puede declarar onClickMe como función de flecha, que es una sintaxis de campo de clase especial que le permite deshacerse de .bind

No necesita "datos" en absoluto; simplemente puede pasar los accesorios directamente al componente secundario. De esa manera no tendrías el problema de perder "esto" en primer lugar :)

about 4 years ago · Juan Pablo Isaza Report

0

Mueva la declaración data = [{ name: "Giordano", action: this.onClickMe }] , dentro del constructor, de esa manera, this se referirá al componente de la App , así:

 import React from "react"; import ReactDOM from "react-dom"; class Component1 extends React.Component { render() { console.log(this.props); return ( <div> <h5>sub Component 1 </h5> <button onClick={() => this.props.data[0].action("foo")}> Click Me! </button> </div> ); } } class App extends React.Component { constructor(props) { super(props); this.state = { clicked: false }; this.onClickMe = this.onClickMe.bind(this); this.data = [{ name: "Giordano", action: this.onClickMe }]; } // data = [{ name: "Giordano", action: this.onClickMe }]; onClickMe(value) { /// I can get the correct value here console.log("This ", this); /// THIS IS THE PROBLEM. /// "this" here refers to the object `data` not App /// so there is no 'setState' function on this this.setState({ clicked: true }); } render() { console.log(this.state.clicked); return ( <div> <h1>Main page</h1> <Component1 data={this.data} /> </div> ); } } ReactDOM.render(<App />, document.getElementById("container"));

Aquí está el enlace del parque infantil.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!