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 ref
del atributo current
se asignará al componente de referencia / elemento DOM y se asignará nuevamente null
cuando 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 ref
devolución de llamada con el elemento DOM y lo llamará null
cuando se desmonte. Entonces, por ejemplo, puede acceder simplemente usando this.stepInput
.
Al definir la ref
devolució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 ref
atributo 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.
refs
atributo 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
any
no 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
.refs
objeto 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
useRef
connull
en este caso. Haría elrenderCountRef
tiporeadonly
(ver ejemplo ). Si necesita proporcionarnull
como valor inicial, haga esto:Referencia de devolución de llamada (trabajo para ambos)
Muestra del patio
fuente
useRef() as MutableRefObject<HTMLInputElement>
yuseRef<HTMLInputElement>(null)
?current
propiedad deMutableRefObject<HTMLInputElement>
se puede modificar, mientras queuseRef<HTMLInputElement>(null)
crea unRefObject
tipocurrent
marcado 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 laHTMLDivElement
interfaz: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