Si está usando React 16.3+, la forma sugerida de crear referencias es usando 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} />;
}
}
Cuando el componente se monta, la propiedad refdel atributo currentse asignará al componente de referencia / elemento DOM y se asignará nuevamente nullcuando se desmonte. Entonces, por ejemplo, puede acceder usando this.stepInput.current.
Para obtener más información RefObject, consulte la respuesta de @ apieceofbart o se agregó el PR createRef() .
Si está utilizando una versión anterior de React (<16.3) o necesita un control más detallado sobre cuándo las referencias están configuradas y no, puede usar "referencias de devolución de llamada" .
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} />
}
}
Cuando se monta el componente, React llamará a la refdevolución de llamada con el elemento DOM y lo llamará nullcuando se desmonte. Entonces, por ejemplo, puede acceder simplemente usando this.stepInput.
Al definir la refdevolución de llamada como un método enlazado en la clase en lugar de una función en línea (como en una versión anterior de esta respuesta), puede evitar que la devolución de llamada se llame dos veces durante las actualizaciones.
No solía ser una API donde el refatributo era una cadena (véase la respuesta de Akshar Patel ), pero debido a algunos problemas , árbitros de cuerdas son totalmente desaconsejada y eventualmente serán eliminados.
Editado el 22 de mayo de 2018 para agregar la nueva forma de hacer referencias en React 16.3. Gracias @apieceofbart por señalar que había una nueva forma.
refsatributo de clase quedarán obsoletos en las próximas versiones de React.Una forma (que he estado haciendo ) es configurarlo manualmente:
entonces incluso puede envolver esto en una función getter más agradable (por ejemplo, aquí ):
fuente
anyno es obligatorio aquí. La mayoría de los ejemplos que veo usoHTMLInputElement. Solo indicando lo obvio, pero si su referencia está en un componente Reaccionar (es decirPeoplePicker), puede usar ese componente como el tipo para obtener tipings.Desde React 16.3, la forma de agregar referencias es usar React.createRef como Jeff Bowen señaló en su respuesta. Sin embargo, puede aprovechar Typecript para escribir mejor su referencia.
En su ejemplo, está utilizando ref en el elemento de entrada. Así que lo harían es:
Al hacer esto cuando desea hacer uso de esa referencia, tiene acceso a todos los métodos de entrada:
También puede usarlo en componentes personalizados:
y luego tener, por ejemplo, acceso a accesorios:
fuente
EDITAR: Esta ya no es la forma correcta de usar referencias con Typecript. Mira la respuesta de Jeff Bowen y vota para aumentar su visibilidad.
Encontré la respuesta al problema. Use referencias como se muestra a continuación dentro de la clase.
Gracias @basarat por apuntar en la dirección correcta.
fuente
Property 'stepInput' does not exist on type '{ [key: string]: Component<any, any> | Element; }', cuando intento accederthis.refs.stepInput.refsobjeto solo tenía la[key: string]entrada.React.createRef(componentes de clase)Nota: Omitiendo la antigua API heredada de String Refs aquí ...
Referencia de solo lectura para nodos DOM: Referencias mutables para valores arbitrarios almacenados:React.useRef(Ganchos / componentes de función)Nota: No inicialice
useRefconnullen este caso. Haría elrenderCountReftiporeadonly(ver ejemplo ). Si necesita proporcionarnullcomo valor inicial, haga esto:Referencia de devolución de llamada (trabajo para ambos)
Muestra del patio
fuente
useRef() as MutableRefObject<HTMLInputElement>yuseRef<HTMLInputElement>(null)?currentpropiedad deMutableRefObject<HTMLInputElement>se puede modificar, mientras queuseRef<HTMLInputElement>(null)crea unRefObjecttipocurrentmarcado conreadonly. Se puede usar el primero, si necesita cambiar los nodos DOM actuales en las referencias, por ejemplo, en combinación con una biblioteca externa. También se puede escribir sinas:useRef<HTMLInputElement | null>(null). Esta última es una mejor opción para los nodos DOM gestionados por React, como se usa en la mayoría de los casos. React almacena los nodos en las referencias mismas y no querrás buscar cambios en estos valores.Si está utilizando
React.FC, agregue laHTMLDivElementinterfaz:Y úsalo de la siguiente manera:
fuente
Para usar el estilo de devolución de llamada ( https://facebook.github.io/react/docs/refs-and-the-dom.html ) como se recomienda en la documentación de React, puede agregar una definición para una propiedad en la clase:
fuente
A falta de un ejemplo completo, aquí está mi pequeño script de prueba para obtener la entrada del usuario cuando trabaja con React y TypeScript. Basado parcialmente en los otros comentarios y este enlace https://medium.com/@basarat/strongly-typed-refs-for-react-typescript-9a07419f807#.cdrghertm
}
fuente
Para el usuario mecanografiado no se requiere constructor.
...
...
fuente
De la definición de tipo React
Para que pueda acceder a su elemento de referencia de la siguiente manera
sin redefinir el índice de referencia.
Como @manakor mencionó, puede obtener un error como
si redefine las referencias (depende del IDE y la versión de TS que use)
fuente
Solo para agregar un enfoque diferente: simplemente puede emitir su referencia, algo como:
fuente
Siempre hago esto, en ese caso para tomar una referencia
let input: HTMLInputElement = ReactDOM.findDOMNode<HTMLInputElement>(this.refs.input);fuente
Si no quiere reenviar su
ref, en la interfaz de Props necesita usar elRefObject<CmpType>tipo deimport React, { RefObject } from 'react';fuente
Para aquellos que buscan cómo hacerlo cuando tienes una variedad de elementos:
fuente
ponerlos en un objeto
fuente