Este é o meu componente. Estou usando a função de seta embutida para alterar a rota onClick
da div, mas sei que não é uma boa maneira em termos de desempenho
1. Função de seta embutida
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={() => this.changeRoute("page1")}>1</div>
<div onClick={() => this.changeRoute("page2")}>2</div>
</>
)
}
2. Se eu uso a ligação de construtor, como posso transmitir adereços?
constructor() {
super(props)
this.changeRoute = this.changeRoute.bind(this)
}
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute}>1</div>
<div onClick={this.changeRoute}>2</div>
</>
)
}
3. Se eu remover a função de seta, a função que está sendo chamada na própria renderização
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute("page1")}>1</div>
<div onClick={this.changeRoute("page2")}>2</div>
</>
)
}
4. Se eu usar a ligação embutida, também não será o melhor desempenho
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute.bind(this, "page1")}>1</div>
<div onClick={this.changeRoute.bind(this, "page2")}>2</div>
</>
)
}
Então, como posso proceder com a melhor maneira de passar parâmetros?
javascript
reactjs
Cavaleiro das Trevas
fonte
fonte
Respostas:
Você pode usar a função de seta para definir seu
changeRoute
manipulador.Isso é conhecido como
Class field syntax
. Mais sobre isso aqui nos documentos oficiais de reação.Então você pode usar esta função diretamente da seguinte maneira:
Você não precisa se preocupar com a ligação. As funções de seta herdam as de seus pais
this
.fonte
executing on the go
. Minha resposta é em resposta a isso. Estou tentando lhe dizer que seu manipulador de cliques não o faráexecute on the go
se você definir o manipulador como eu publiquei.Você pode adicionar dados à sua div:
Em seguida, você pode recuperar esses dados em seu manipulador onClick:
fonte
# 1 está bem.
# 2 também é 'bom', mas você precisa passar adereços, então a função de renderização será exatamente igual a # 1 . Você estará chamando a
bind
função 'd, porque a substituiu no construtor.# 3 está errado, pois a função é chamada durante a renderização.
E em relação ao item 4, de reagir documentos
Isso causa uma penalidade no desempenho quando sua função é usada em seus componentes filhos e fará com que os componentes filhos sejam renderizados novamente (não é o seu caso). Então você não deve fazer o # 4 .
fonte
Atualmente, a melhor maneira é envolver o manipulador de eventos no
useCallback
gancho, pois isso impedirá que a função do manipulador seja criada toda vez que a renderização for chamada.Para obter mais informações, verifique - useCallback docs
fonte