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.js
archivo:
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
connect
o marterial-ui'swithStyles
?connect
owithStyles
? Debe envolver todos los HOC conforwardRef
y 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.
innerRef
se usa comúnmente en muchas bibliotecas.fuente
beautifulInputElement
es 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-components
y se llamainnerRef
allí.fuente
innerRef
es 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
.innerRef
favor 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
withForwardingRef
uso:
fuente