Depuis React 16.3 il est possible d'utiliser React.createRef()
pour accéder à un élément DOM. J'utilise également Flow in mon projet, mais le la documentation utilise toujours l'ancienne méthode .
Le code ci-dessous échoue malheureusement:
/* @flow */
import * as React from 'react';
export class TestComponent extends React.Component<{}> {
myRef: React.Ref<HTMLDivElement>
constructor(props: any) {
super(props)
this.myRef = React.createRef()
}
render() {
return (
<div ref={this.myRef} />
)
}
}
avec l'erreur suivante:
Cannot instantiate `Ref` because in type argument `ElementType`:
- Either a callable signature is missing in `HTMLDivElement` [1] but exists in
`React.StatelessFunctionalComponent` [2].
- Or `HTMLDivElement` [1] is incompatible with statics of `React.Component` [3].
Comment le taper correctement?
Examen de la définition du type de flux pour React.createRef () :
declare export function createRef<ElementType: React$ElementType>(
): {current: null | React$ElementRef<ElementType>};
J'ai pu faire quelque chose comme ça dans mon code
/* @flow */
import * as React from 'react';
export class TestComponent extends React.Component<{}> {
myRef: { current: null | HTMLDivElement }
constructor(props: any) {
super(props)
this.myRef = React.createRef()
}
render() {
return (
<div ref={this.myRef} />
)
}
}
Il y a un problème lié github .
Si ce n'est pas encore résolu, vous pouvez le taper vous-même:
type RefObject = {|
current: any,
|};
Voici comment il est tapé en interne dans réagir aux définitions de type de bibliothèque .
Si vous utilisez des "propriétés de classe", vous pouvez createRef()
de la manière suivante:
// @flow
import * as React from 'react';
export class TestComponent extends React.Component<{}> {
myRef = React.createRef<HTMLElement>();
render() {
return (
<div ref={this.myRef} />
)
}
}