class PlayerControls extends React.Component {
constructor(props) {
super(props)
this.state = {
loopActive: false,
shuffleActive: false,
}
}
render() {
var shuffleClassName = this.state.toggleActive ? "player-control-icon active" : "player-control-icon"
return (
<div className="player-controls">
<FontAwesome
className="player-control-icon"
name='refresh'
onClick={this.onToggleLoop}
spin={this.state.loopActive}
/>
<FontAwesome
className={shuffleClassName}
name='random'
onClick={this.onToggleShuffle}
/>
</div>
);
}
onToggleLoop(event) {
// "this is undefined??" <--- here
this.setState({loopActive: !this.state.loopActive})
this.props.onToggleLoop()
}
Quiero actualizar el loopActive
estado en alternar, pero el this
objeto no está definido en el controlador. De acuerdo con el tutorial doc, this
debería referirme al componente. ¿Me estoy perdiendo de algo?
javascript
reactjs
this
Maximus S
fuente
fuente
() => this.onToggleLoop
después de mover la función onToggleLoop a su clase de reacción, también funcionará.this
no está definido en primer lugar? Sé quethis
en Javascript depende de cómo se llama la función, pero ¿qué está pasando aquí?Hay un par de maneras.
Una es agregar
this.onToggleLoop = this.onToggleLoop.bind(this);
el constructor.Otro son las funciones de flecha
onToggleLoop = (event) => {...}
.Y luego está
onClick={this.onToggleLoop.bind(this)}
.fuente
onClick
devolverá una nueva función de cada representación y por lo tanto se ve como un nuevo valor ha sido aprobada por la hélice, de jugar conshouldComponentUpdate
en elPureComponent
s.Escribe tu función de esta manera:
Funciones Fat Arrow
fuente
ReferenceError: fields are not currently supported
.Me encontré con un enlace similar en una función de render y terminé pasando el contexto de
this
la siguiente manera:También he usado:
fuente
Debe notar que
this
depende de cómo se invoque la función, es decir: cuando se llama a una función como método de un objeto,this
se establece en el objeto al que se llama el método.this
es accesible en el contexto JSX como su objeto componente, por lo que puede llamar al método deseado en línea comothis
método.Si solo pasa referencia a la función / método, parece que reaccionar lo invocará como función independiente.
fuente
onClick={this.onToggleLoop}
siempre que en su clase de componente haya definido un campo (propiedad)onToggleLoop = () => /*body using 'this'*/
Si está utilizando babel, puede vincular 'esto' con el operador de vinculación ES7 https://babeljs.io/docs/en/babel-plugin-transform-function-bind#auto-self-binding
fuente
Si llama a su método creado en los métodos del ciclo de vida como componentDidMount ... entonces solo puede usar la función
this.onToggleLoop = this.onToogleLoop.bind(this)
y la flecha de grasaonToggleLoop = (event) => {...}
.El enfoque normal de la declaración de una función en el constructor no funcionará porque los métodos del ciclo de vida se llaman anteriormente.
fuente
en mi caso esta fue la solución = () => {}
fuente
En mi caso, para un componente sin estado que recibió la referencia con forwardRef, tuve que hacer lo que se dice aquí https://itnext.io/reusing-the-ref-from-forwardref-with-react-hooks-4ce9df693dd
A partir de esto (onClick no tiene acceso al equivalente de 'this')
A esto (funciona)
fuente