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()
}
Desejo atualizar o loopActive
estado ao alternar, mas o this
objeto não está definido no manipulador. De acordo com o documento do tutorial, this
devo me referir ao componente. Estou esquecendo de algo?
javascript
reactjs
this
Maximus S
fonte
fonte
() => this.onToggleLoop
depois de mover a função onToggleLoop para sua classe de reação, ela também funcionará.this
definido em primeiro lugar? Eu sei que othis
Javascript depende de como a função é chamada, mas o que está acontecendo aqui?Existem algumas maneiras.
Uma é adicionar
this.onToggleLoop = this.onToggleLoop.bind(this);
no construtor.Outra são as funções de seta
onToggleLoop = (event) => {...}
.E então existe
onClick={this.onToggleLoop.bind(this)}
.fonte
onClick
retornará uma nova função a cada render e, assim, parece que um novo valor foi passado para o prop, mexer comshouldComponentUpdate
noPureComponent
s.Escreva sua função desta maneira:
Funções de seta gorda
fonte
ReferenceError: fields are not currently supported
.Corri para uma ligação semelhante em uma função de renderização e acabei passando o contexto da
this
da seguinte maneira:Eu também usei:
fonte
Você deve observar que
this
depende de como a função é chamada, ou seja: quando uma função é chamada como método de um objeto, seuthis
é definida como o objeto em que o método é chamado.this
está acessível no contexto JSX como seu objeto componente, para que você possa chamar o método desejado embutido comothis
método.Se você apenas passar uma referência à função / método, parece que o react o chamará como função independente.
fonte
onClick={this.onToggleLoop}
desde que, em sua classe componente que tenha definido um campo (propriedade)onToggleLoop = () => /*body using 'this'*/
Se você estiver usando babel, vincule 'this' usando o operador de ligação ES7 https://babeljs.io/docs/en/babel-plugin-transform-function-bind#auto-self-binding
fonte
Se você chamar seu método criado nos métodos de ciclo de vida como componentDidMount ..., poderá usar apenas a função
this.onToggleLoop = this.onToogleLoop.bind(this)
e a seta de gorduraonToggleLoop = (event) => {...}
.A abordagem normal da declaração de uma função no construtor não funcionará porque os métodos do ciclo de vida são chamados anteriormente.
fonte
no meu caso, essa foi a solução = () => {}
fonte
No meu caso, para um componente sem estado que recebeu o ref com o forwardRef, tive que fazer o que foi dito aqui https://itnext.io/reusing-the-ref-from-forwardref-with-react-hooks-4ce9df693dd
A partir disso (onClick não tem acesso ao equivalente a 'this')
Para isso (funciona)
fonte