Este es mi componente. Estoy usando la función de flecha en línea para cambiar la ruta onClick
de div, pero sé que no es una buena manera en términos de rendimiento.
1. Función de flecha en línea
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={() => this.changeRoute("page1")}>1</div>
<div onClick={() => this.changeRoute("page2")}>2</div>
</>
)
}
2. Si uso el enlace de constructor, ¿cómo puedo pasar accesorios?
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. Si elimino la función de flecha, entonces la función que se llama en el render en sí
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute("page1")}>1</div>
<div onClick={this.changeRoute("page2")}>2</div>
</>
)
}
4. Si uso el enlace en línea, entonces tampoco es mejor con el rendimiento
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>
</>
)
}
Entonces, ¿cómo puedo proceder con la mejor manera de pasar parámetros?
javascript
reactjs
Caballero oscuro
fuente
fuente
Respuestas:
Puede usar la función de flecha para definir su
changeRoute
controlador.Esto se conoce como
Class field syntax
. Más información aquí en documentos oficiales de reacción.Entonces puede usar esta función directamente así:
No tiene que preocuparse por el enlace. Las funciones de flecha heredan las de sus padres
this
.fuente
executing on the go
. Mi respuesta es en respuesta a eso. Estoy tratando de decirle que su controlador de clics no lo haráexecute on the go
si define el controlador como lo he publicado.Puede agregar datos a su div:
Luego puede recuperar esos datos en su controlador onClick:
fuente
# 1 está bien.
# 2 también está 'bien', pero necesita pasar accesorios, entonces la función de renderizado se verá exactamente como # 1 . Llamarás a la
bind
función 'd, porque la reemplazaste en el constructor.# 3 está mal, ya que la función se llama durante el render.
Y con respecto al n. ° 4, de reaccion docs
Esto causa una penalización de rendimiento cuando su función se usa en sus componentes secundarios y hará que los componentes secundarios se vuelvan a representar (no es en su caso). Entonces no deberías hacer el # 4 .
fuente
La mejor manera actualmente es envolver su controlador de eventos en
useCallback
gancho, ya que evitará que se cree su función de controlador cada vez que se llame render.Para obtener más información, consulte: use los documentos de Callback
fuente