Estou tentando usar React.forwardRef, mas estou tropeçando em como fazê-lo funcionar em um componente baseado em classe (não HOC).
Os exemplos de documentos usam elementos e componentes funcionais, até mesmo agrupando classes em funções para componentes de ordem superior.
Então, começando com algo parecido com isso em seu ref.js
arquivo:
const TextInput = React.forwardRef(
(props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />)
);
e, em vez disso, defini-lo como algo assim:
class TextInput extends React.Component {
render() {
let { props, ref } = React.forwardRef((props, ref) => ({ props, ref }));
return <input type="text" placeholder="Hello World" ref={ref} />;
}
}
ou
class TextInput extends React.Component {
render() {
return (
React.forwardRef((props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />))
);
}
}
só trabalhando: /
Além disso, eu sei, eu sei, os árbitros não são a maneira de reagir. Estou tentando usar uma biblioteca de telas de terceiros e gostaria de adicionar algumas de suas ferramentas em componentes separados, portanto, preciso de ouvintes de eventos, portanto, preciso de métodos de ciclo de vida. Pode haver um caminho diferente mais tarde, mas quero tentar isso.
Os documentos dizem que é possível!
O encaminhamento de referência não se limita a componentes DOM. Você pode encaminhar refs para instâncias de componentes de classe também.
Mas então eles passam a usar HOCs em vez de apenas classes.
fonte
connect
ou o marterial-uiwithStyles
?connect
ouwithStyles
? Você deve envolver todos os HOCs comforwardRef
e usar internamente o suporte "seguro" para passar um ref para o componente mais baixo da cadeia.Você precisa usar um nome de prop diferente para encaminhar o ref para uma classe.
innerRef
é comumente usado em muitas bibliotecas.fonte
beautifulInputElement
é mais uma função do que um Elemento deconst beautifulInputElement = <BeautifulInputForwardingRef ref={ref => ref && ref.focus()} />
Basicamente, esta é apenas uma função HOC. Se você quiser usá-lo com a aula, pode fazer isso sozinho e usar acessórios regulares.
Este padrão é usado por exemplo em
styled-components
e é chamadoinnerRef
lá.fonte
innerRef
está completamente errado. O objetivo é a transparência total: devo ser capaz de tratar a<FancyButton>
como se fosse um elemento DOM regular, mas usando a abordagem de componentes estilizados, preciso lembrar que esse componente usa um prop nomeado arbitrariamente para refs em vez de apenasref
.innerRef
em favor de passar o ref para a criança usandoReact.forwardRef
, que é o que o OP está tentando realizar.Isso pode ser feito com um componente de ordem superior, se desejar:
E então em seu arquivo de componente:
Fiz o trabalho inicial com testes e publiquei um pacote para isso
react-with-forwarded-ref
: https://www.npmjs.com/package/react-with-forwarded-reffonte
Caso você precise reutilizar isso em muitos componentes diferentes, você pode exportar essa capacidade para algo como
withForwardingRef
uso:
fonte