Eu estou recebendo o seguinte erro
TypeError não capturado: Não é possível ler a propriedade 'setState' de undefined
mesmo após a ligação delta no construtor.
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count : 1
};
this.delta.bind(this);
}
delta() {
this.setState({
count : this.state.count++
});
}
render() {
return (
<div>
<h1>{this.state.count}</h1>
<button onClick={this.delta}>+</button>
</div>
);
}
}
javascript
reactjs
Dangling_pointer
fonte
fonte
Respostas:
Isso ocorre porque
this.delta
não está vinculadothis
.Para ligar o conjunto
this.delta = this.delta.bind(this)
no construtor:Atualmente, você está chamando bind. Mas bind retorna uma função vinculada. Você precisa definir a função para seu valor vinculado.
fonte
this
ligação lexical adequada e nem sequer expuserem uma sintaxe para vincular seu contexto diretamente à sua definição !?delta
comodelta = () => { return this.setState({ count: this.state.count++ }); };
o código também funcionaria. Explicado aqui: hackernoon.com/…No ES7 + (ES2016), você pode usar o operador de sintaxe de ligação da função experimental
::
para ligar. É um açúcar sintático e fará o mesmo que a resposta de Davin Tryon.Você pode reescrever
this.delta = this.delta.bind(this);
parathis.delta = ::this.delta;
Para o ES6 + (ES2015), você também pode usar a função de seta do ES6 + (
=>
) para poder usá-lothis
.Por quê ? No documento Mozilla:
fonte
Há uma diferença de contexto entre a classe ES5 e ES6. Portanto, haverá uma pequena diferença entre as implementações também.
Aqui está a versão do ES5:
e aqui está a versão ES6:
Apenas tome cuidado, além da diferença de sintaxe na implementação da classe, há uma diferença na ligação do manipulador de eventos.
Na versão ES5, é
Na versão ES6, é:
fonte
Ao usar o código ES6 no React, use sempre as funções de seta, porque este contexto é vinculado automaticamente a ele
Usa isto:
ao invés de:
fonte
this.setState({videos});
Você não precisa vincular nada, basta usar as funções de seta assim:
fonte
Você também pode usar:
Ou:
Se você está passando alguns params ..
fonte
Você precisa vincular isso ao construtor e lembre-se de que as alterações no construtor precisam reiniciar o servidor. Ou então, você terminará com o mesmo erro.
fonte
Você precisa vincular seus métodos com 'this' (objeto padrão). Portanto, seja qual for a sua função, basta vincular isso ao construtor.
fonte
Este erro pode ser resolvido por vários métodos -
Se você estiver usando a sintaxe do ES5 , conforme a Documentação do React js, será necessário usar o método de ligação .
Algo assim para o exemplo acima:
this.delta = this.delta.bind(this)
Se você estiver usando a sintaxe ES6 , não precisará usar o método bind , poderá fazê-lo com algo como isto:
delta=()=>{ this.setState({ count : this.state.count++ }); }
fonte
Existem duas soluções para esse problema:
A primeira solução é adicionar um construtor ao seu componente e vincular sua função como abaixo:
Então faça o seguinte:
Em vez disso:
A segunda solução é usar uma função de seta:
Na verdade, a função de seta NÃO vincula a si própria
this
. As funções de seta lexicamentebind
seu contexto, portanto,this
na verdade, se refere ao contexto de origem .Para mais informações sobre a função de ligação:
Função de ligação Noções básicas sobre JavaScript Bind ()
Para mais informações sobre a função de seta:
Javascript ES6 - Funções de seta e Lexical
this
fonte
você deve vincular um novo evento a essa palavra - chave, como mencionei abaixo ...
fonte
Adicionando
vai resolver o problema. esse erro ocorre quando tentamos chamar a função da classe ES6, portanto, precisamos vincular o método
fonte
A função de seta poderia facilitar sua vida para evitar vincular essa palavra - chave. Igual a:
fonte
Embora essa pergunta já tenha uma solução, eu só quero compartilhar a minha para que fique clara, espero que possa ajudar:
fonte
fonte
Apenas mude sua instrução bind do que você precisa => this.delta = this.delta.bind (this);
fonte
2. Marque a opção (this) se estiver executando o setState em alguma função (por exemplo, handleChange), verifique se a função está vinculada a esta ou à função deve ser a função de seta.
## 3 maneiras de vincular isso à função abaixo ##
fonte
se você estiver usando a sintaxe ES5, precisará vinculá-lo corretamente
e se você estiver usando ES6 e acima, você pode usar a seta função, então você não precisa usar bind () que
fonte