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.

Problema de referencia con una biblioteca de interfaz de usuario externa en React Hook Form.

Estoy utilizando el componente ReactSelect, sin embargo, he creado un componente llamado Select y ReactSelect está dentro de él:

interface IProps extends ISelectProps {
    tabIndex: string;
    required: boolean;
    isClearable: boolean;
    isDisabled: boolean;
    placeholder: string;
    options: {
        label: string;
        value: string;
    }[];
}

const Select = ({ ...props }: IProps) => <ReactSelect {...props} />;

export default Select

El error es el siguiente:

Advertencia: Las funciones de componentes no pueden recibir referencias. Los intentos de acceder a esta referencia fallarán. ¿Quiere usar React.forwardRef()?

Revise el método de renderización de `Controller`.
    en Select

Aquí está el código:

<form onsubmit="{handleSubmit(onSubmit)}" novalidate="" autocomplete='off'>
    <div style="{{" display:="" 'flex',="" flexdirection:="" 'column',="" gap:="" '0.5rem'="" }}="">
        {API.map(({ id, order, htmlControl }) => (
            <controller key="{id}" name="{id}" control="{control}" render="{({" field,="" fieldstate:="" {="" error="" }="" })=""> (
                    <>
                        {htmlControl.type === 'PARAMETER_TYPE_SELECT' && (
                            <select {...field}="" isclearable="{true}" error="{!!error}" tabindex="{order.toString()}" required="{htmlControl.isRequired}" isdisabled="{htmlControl.isDisabled}" placeholder="{htmlControl.placeholder}" options="{htmlControl.options}"></select>
                        )}

                        {htmlControl.type !== 'PARAMETER_TYPE_SELECT' && (
                            <input required="{htmlControl.isRequired}" disabled="{htmlControl.isDisabled}" placeholder="{htmlControl.placeholder}">
                        )}

                )}
            />
        ))}
    </controller></div>

    <input type='submit'>
</form>

Estoy siguiendo exactamente la documentación oficial y no entiendo por qué no puede obtener la referencia.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el hecho de que estás tratando de pasar una ref a un componente de función (Select), lo cual no está permitido en React. Una solución potencial para esto es usar el método React.forwardRef() para envolver tu componente Select y permitir que acepte refs.

    Aquí tienes una versión actualizada de tu código que utiliza forwardRef():

    interface IProps extends ISelectProps {
      tabIndex: string;
      required: boolean;
      isClearable: boolean;
      isDisabled: boolean;
      placeholder: string;
      options: {
        label: string;
        value: string;
      }[];
    }
    
    const Select = React.forwardRef<htmldivelement, iprops="">(
      ({ ...props }, ref) => <reactselect {...props}="" ref="{ref}"></reactselect>
    );
    
    export default Select;
    

    Ten en cuenta que ahora estamos utilizando React.forwardRef() para envolver el componente Select y pasar la ref al componente subyacente ReactSelect.

    Además, en tu método de renderizado, asegúrate de pasar la ref al componente Controller de esta manera:

    <controller key="{id}" name="{id}" control="{control}" render="{({" field,="" fieldstate:="" {="" error="" }="" })=""> (
        <>
          {htmlControl.type === 'PARAMETER_TYPE_SELECT' && (
            <select {...field}="" isclearable="{true}" error="{!!error}" tabindex="{order.toString()}" required="{htmlControl.isRequired}" isdisabled="{htmlControl.isDisabled}" placeholder="{htmlControl.placeholder}" options="{htmlControl.options}" ref="{field.ref}" pasa="" la="" ref="" al="" componente="" select=""></select>
          )}
    
          ...
    
      )}
    />
    

    Esto debería resolver el problema y permitirte pasar refs a componentes de función en React.</htmldivelement,>

Comments are closed.