Estoy tratando de usar React.forwardRef, pero me tropiezo con cómo hacer que funcione en un componente basado en clases (no HOC).
Los ejemplos de documentos usan elementos y componentes funcionales, incluso envolviendo clases en funciones para componentes de orden superior.
Entonces, comenzando con algo como esto en su ref.jsarchivo:
const TextInput = React.forwardRef(
(props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />)
);
y en su lugar definirlo como algo como esto:
class TextInput extends React.Component {
render() {
let { props, ref } = React.forwardRef((props, ref) => ({ props, ref }));
return <input type="text" placeholder="Hello World" ref={ref} />;
}
}
o
class TextInput extends React.Component {
render() {
return (
React.forwardRef((props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />))
);
}
}
solo funciona: /
Además, sé que sé, los árbitros no son la forma de reaccionar. Estoy tratando de usar una biblioteca de lienzo de terceros y me gustaría agregar algunas de sus herramientas en componentes separados, por lo que necesito detectores de eventos, por lo que necesito métodos de ciclo de vida. Puede que más adelante tome una ruta diferente, pero quiero probar esto.
¡Los doctores dicen que es posible!
El reenvío de referencias no se limita a los componentes DOM. También puede reenviar referencias a instancias de componentes de clase.
de la nota en esta sección.
Pero luego pasan a usar HOC en lugar de solo clases.
fuente

connecto marterial-ui'swithStyles?connectowithStyles? Debe envolver todos los HOC conforwardRefy usar internamente un accesorio "seguro" para pasar una referencia al componente más bajo de la cadena.Debe usar un nombre de accesorio diferente para reenviar la referencia a una clase.
innerRefse usa comúnmente en muchas bibliotecas.fuente
beautifulInputElementes más una función que un elemento de reacción, debería ser asíconst beautifulInputElement = <BeautifulInputForwardingRef ref={ref => ref && ref.focus()} />Básicamente, esta es solo una función HOC. Si desea usarlo con clase, puede hacerlo usted mismo y usar accesorios regulares.
Este patrón se usa, por ejemplo, en
styled-componentsy se llamainnerRefallí.fuente
innerRefes perder completamente el punto. El objetivo es la transparencia total: debería poder tratar a<FancyButton>como si fuera un elemento DOM regular, pero usando el enfoque de componentes con estilo, debo recordar que este componente usa un prop con nombre arbitrario para referencias en lugar de soloref.innerReffavor de pasar la referencia al niño que usaReact.forwardRef, que es lo que el OP está tratando de lograr.Esto se puede lograr con un componente de orden superior, si lo desea:
Y luego en su archivo de componente:
Hice el trabajo por adelantado con pruebas y publiqué un paquete para esto
react-with-forwarded-ref: https://www.npmjs.com/package/react-with-fordered-reffuente
En caso de que necesite reutilizar esto en muchos componentes diferentes, puede exportar esta capacidad a algo como
withForwardingRefuso:
fuente