es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

React: Pasando funciones de enfoque a componentes secundarios utilizando refs.

En el constructor de mi componente padre (basado en clase), agrego una referencia para un campo de entrada utilizando:

this.usernameRef = React.createRef();

Esto funciona bien en el componente padre. Por ejemplo, lo siguiente funciona correctamente:

const username = this.usernameRef.current.value; // esto funciona

Estoy pasando la llamada .focus() a la referencia en un componente hijo de la siguiente manera:

<childcomponent onclick="{()" ==""> this.usernameRef.current.focus()}
/>

En mi componente hijo, se llama con un evento onClick:

<a href="#" onclick="{onClick}"></a>

Mientras la aplicación se está ejecutando, cuando hago clic en ese enlace, obtengo el siguiente error:

e.usernameRef.current.focus no es una función

¿Debería estar haciendo esto de manera diferente?

Por lo que vale, el componente hijo está basado en una función.

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar en el contexto en el que se está llamando la función onClick. Dado que el componente hijo es basado en una función, no tiene un contexto de this como lo tendría un componente basado en una clase, por lo que no puede acceder a la propiedad this.usernameRef.

    Una solución podría ser pasar la propia referencia como prop al componente hijo en lugar de la función onClick. Por ejemplo:

    En el componente padre:

    <childcomponent inputref="{this.usernameRef}"></childcomponent>
    

    En el componente hijo:

    <a href="#" onclick="{()" ==""> props.inputRef.current.focus()} />
    

    De esta forma, el componente hijo puede acceder directamente a la referencia sin necesidad de utilizar la función onClick como intermediario.

    Alternativamente, se podría enlazar el contexto de this a la función onClick utilizando bind(this). Por ejemplo:

    En el componente padre:

    <childcomponent onclick="{this.handleClick.bind(this)}"></childcomponent>
    

    Y en la función handleClick:

    handleClick() {
      this.usernameRef.current.focus();
    }
    

    De esta forma, la función siempre se llamará con el contexto de this correcto, y el componente hijo aún puede activarla a través de la prop onClick.

Comments are closed.