Se você estiver usando o React 16.3+, a maneira sugerida de criar referências é usar React.createRef()
.
class TestApp extends React.Component<AppProps, AppState> {
private stepInput: React.RefObject<HTMLInputElement>;
constructor(props) {
super(props);
this.stepInput = React.createRef();
}
render() {
return <input type="text" ref={this.stepInput} />;
}
}
Quando o componente é montado, a propriedade ref
do atributo current
será atribuída ao componente / elemento DOM referenciado e atribuída de volta null
quando ele desmontar. Por exemplo, você pode acessá-lo usandothis.stepInput.current
.
Para RefObject
saber mais , consulte a resposta de @ apieceofbart ou o PR createRef()
foi adicionado.
Se você estiver usando uma versão anterior do React (<16.3) ou precisar de um controle mais refinado sobre quando as refs estão definidas e desabilitadas, você pode usar "refs de retorno de chamada" .
class TestApp extends React.Component<AppProps, AppState> {
private stepInput: HTMLInputElement;
constructor(props) {
super(props);
this.stepInput = null;
this.setStepInputRef = element => {
this.stepInput = element;
};
}
render() {
return <input type="text" ref={this.setStepInputRef} />
}
}
Quando o componente é montado, o React chama o ref
retorno de chamada com o elemento DOM e o chama null
quando desmonta. Por exemplo, você pode acessá-lo simplesmente usandothis.stepInput
.
Ao definir o ref
retorno de chamada como um método vinculado na classe, em oposição a uma função embutida (como em uma versão anterior desta resposta), você pode evitar que o retorno de chamada seja chamado duas vezes durante as atualizações.
Não costumava ser uma API onde o ref
atributo foi uma string (ver resposta de Akshar Patel ), mas devido a algumas questões , refs cordas são fortemente desencorajados e eventualmente será removido.
Editado em 22 de maio de 2018 para adicionar a nova maneira de fazer refs no React 16.3. Obrigado @apieceofbart por apontar que havia uma nova maneira.
refs
atributo class serão descontinuados nas próximas versões do React.Uma maneira (que eu tenho feito ) é configurar manualmente:
então você pode até encerrar isso em uma função getter mais agradável (por exemplo, aqui ):
fonte
any
não é obrigatório aqui. A maioria dos exemplos que vejo são úteisHTMLInputElement
. Apenas afirme o óbvio, mas se sua referência estiver em um componente React (ou sejaPeoplePicker
), você poderá usar esse componente como o tipo para obter digitações.Desde o React 16.3, a maneira de adicionar refs é usar React.createRef como Jeff Bowen apontou em sua resposta. No entanto, você pode aproveitar o Typescript para digitar melhor sua referência.
No seu exemplo, você está usando ref no elemento de entrada. Então, da maneira que eu faria, é:
Ao fazer isso quando você quiser fazer uso dessa referência, você terá acesso a todos os métodos de entrada:
Você também pode usá-lo em componentes personalizados:
e, em seguida, tenha, por exemplo, acesso a adereços:
fonte
EDIT: Esta não é mais a maneira correta de usar refs com o Typecript. Veja a resposta de Jeff Bowen e vote-a para aumentar sua visibilidade.
Encontrou a resposta para o problema. Use refs como abaixo dentro da classe.
Obrigado @basarat por apontar na direção certa.
fonte
Property 'stepInput' does not exist on type '{ [key: string]: Component<any, any> | Element; }'
, ao tentar acessarthis.refs.stepInput
.refs
objeto tinha apenas a[key: string]
entrada.React.createRef
(componentes de classe)Nota: Omitindo a antiga API herdada de referências de string aqui ...
Refs somente leitura para nós DOM: Referências mutáveis para valores armazenados arbitrários:React.useRef
(Ganchos / componentes de função)Nota: Não inicialize
useRef
comnull
neste caso. Seria orenderCountRef
tiporeadonly
(veja o exemplo ). Se você precisar fornecernull
como valor inicial, faça o seguinte:Refs de retorno de chamada (trabalho para ambos)
Amostra para parque infantil
fonte
useRef() as MutableRefObject<HTMLInputElement>
euseRef<HTMLInputElement>(null)
?current
propriedade deMutableRefObject<HTMLInputElement>
pode ser modificada, ao passo queuseRef<HTMLInputElement>(null)
cria umRefObject
tipocurrent
marcado com comoreadonly
. O primeiro pode ser usado, se você precisar alterar os nós DOM atuais em refs, por exemplo, em combinação com uma biblioteca externa. Ele também pode ser escrita semas
:useRef<HTMLInputElement | null>(null)
. O último é uma escolha melhor para nós DOM gerenciados pelo React, conforme usado na maioria dos casos. O React armazena os nós nas próprias referências e você não deseja mexer na alteração desses valores.Se você estiver usando
React.FC
, adicione aHTMLDivElement
interface:E use-o da seguinte maneira:
fonte
Para usar o estilo de retorno de chamada ( https://facebook.github.io/react/docs/refs-and-the-dom.html ) conforme recomendado na documentação do React, você pode adicionar uma definição para uma propriedade na classe:
fonte
Na falta de um exemplo completo, aqui está meu pequeno script de teste para obter informações do usuário ao trabalhar com o React e o TypeScript. Baseado parcialmente nos outros comentários e neste link https://medium.com/@basarat/strongly-typed-refs-for-react-typescript-9a07419f807#.cdrghertm
}
fonte
Para usuário datilografado, nenhum construtor é necessário.
...
...
fonte
Na definição do tipo React
Para que você possa acessar o elemento refs como segue
sem redefinição do índice refs.
Como o @manakor mencionou, você pode obter erros como
se você redefinir refs (depende do IDE e da versão ts usada)
fonte
Apenas para adicionar uma abordagem diferente - você pode simplesmente converter sua referência, algo como:
fonte
Eu sempre faço isso, nesse caso, para pegar um juiz
let input: HTMLInputElement = ReactDOM.findDOMNode<HTMLInputElement>(this.refs.input);
fonte
Se você não encaminhar sua
ref
, na interface Props você precisará usar oRefObject<CmpType>
tipo deimport React, { RefObject } from 'react';
fonte
Para aqueles que procuram como fazê-lo quando você tem uma matriz de elementos:
fonte
colocá-los em um objeto
fonte