TL; DR
Jeśli chcesz wpisać ref, który oczekuje tylko natywnych elementów DOM, takich jak a divlub an input, prawidłowa definicja jest następująca:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.instanceOf(Element) })
])
Odpowiedz na konkretny problem opisany w oryginalnym poście
W przykładzie pytania OP to nie typ rekwizytu ref musi być zadeklarowany, ale rzeczy wskazywane przez ref, które zostaną przekazane przy użyciu reduxu mapStateToProps. Typ rekwizytu dla elementu DOM to: myRefToBePutInReduxGlobalStore: PropTypes.instanceOf(Element)(jeśli jest to element DOM). Chociaż chciałbym:
- Zmień nazwę na
myElementToBePutInReduxGlobalStore(element nie jest odniesieniem)
- Unikaj przechowywania danych, których nie można serializować, w magazynie Redux
- Unikaj przekazywania elementów w rekwizytach, jak wyjaśnił inżynier React Seb Markbage
Długa odpowiedź na aktualne pytanie
P: Jaki jest poprawny typ ref w React?
Przykład użycia:
function FancyInput({ inputRef }) {
return (
<div className="fancy">
Fancy input
<input ref={inputRef} />
</div>
)
}
FancyInput.propTypes = {
inputRef: ???
}
function App(props) {
const inputRef = React.useRef()
useLayoutEffect(function focusWhenStuffChange() {
inputRef.current?.focus()
}, [props.stuff])
return <FancyInput inputRef={inputRef} />
}
Obecnie istnieją dwa rodzaje referencji:
- Obiekt, który wygląda tak:,
{ current: [something] }zwykle utworzony przez
React.createRef()pomocnika lub React.useRef()hook
- Funkcja zwrotna, która otrzyma
[something]jako argument (jak w przykładzie OP)
Uwaga: historycznie można było również użyć ref w postaci ciągu znaków, ale jest to uważane za starsze i zostanie usunięte z reakcji
Druga pozycja jest bardzo prosta i wymaga następującego typu prop: PropTypes.func.
Pierwsza opcja jest mniej oczywista, ponieważ możesz chcieć określić typ elementu wskazywanego przez ref.
Wiele dobrych odpowiedzi
ref może wskazywać na coś innego niż element DOM.
Jeśli chcesz być całkowicie elastyczny:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.any })
])
Powyższe wymusza tylko kształt obiektu referencyjnego z currentwłaściwością. Będzie działać przez cały czas dla każdego typu ref. W celu używania typu rekwizytu, który jest sposobem na wykrycie wszelkich niespójności podczas tworzenia , prawdopodobnie to wystarczy. Wydaje się bardzo mało prawdopodobne, aby obiekt posiadający kształt { current: [any] }i przekazany do refToForwardrekwizytu nie był rzeczywistym odniesieniem.
Jednak możesz chcieć zadeklarować, że twój komponent nie oczekuje żadnego rodzaju referencji, ale tylko określonego typu, biorąc pod uwagę, do czego potrzebuje tego ref.
Skonfigurowałem piaskownicę pokazującą kilka różnych sposobów deklarowania referencji, nawet niestandardowych, a następnie testowałem je z wieloma typami rekwizytów. Znajdziesz go tutaj .
Jeśli tylko oczekiwać wskazując ref do natywnego elementu wejściowego, nie każdy HTML Element:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.instanceOf(HTMLInputElement) })
])
Jeśli spodziewasz się tylko odniesienia wskazującego na komponent klasy React:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.instanceOf(Component) })
])
Jeśli spodziewasz się tylko odniesienia wskazującego na komponent funkcjonalny, używając useImperativeHandledo ujawnienia jakiejś metody publicznej:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.object })
])
Uwaga: powyższy typ właściwości jest interesujący, ponieważ obejmuje również komponenty reagujące i natywne elementy DOM, ponieważ wszystkie dziedziczą podstawowy kod javascript Object
Nie ma jednego dobrego sposobu na zadeklarowanie typu właściwości referencyjnej, zależy to od użycia. Jeśli Twoje odniesienie wskazuje na coś bardzo określonego, warto dodać określony typ rekwizytu. W przeciwnym razie wystarczy sprawdzić ogólny kształt.
Uwaga dotycząca renderowania po stronie serwera
Jeśli twój kod ma działać na serwerze, chyba że masz już polyfill środowiska DOM, Elementlub inny typ po stronie klienta będzie undefinedw NodeJS. Możesz użyć następującej podkładki, aby ją podeprzeć:
Element = typeof Element === 'undefined' ? function(){} : Element
Poniższe strony React Docs dają więcej informacji o tym, jak używać referencji, zarówno obiektu, jak i wywołań zwrotnych , a także jak używać useRefhook
Odpowiedź zaktualizowana dzięki @Rahul Sagore, @Ferenk Kamra, @svnm i @Kamuela Franco
refjest funkcją, której pierwszy argument jest odniesieniem do elementu DOM lub null. To funkcja .