Próbuję użyć React.forwardRef, ale potykam się, jak sprawić, by działał w komponencie opartym na klasach (nie HOC).
Przykłady dokumentacji wykorzystują elementy i komponenty funkcjonalne, a nawet zawijają klasy w funkcje dla komponentów wyższego rzędu.
Tak więc, zaczynając coś jak to w swoim ref.js
pliku:
const TextInput = React.forwardRef(
(props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />)
);
i zamiast tego zdefiniować to jako coś takiego:
class TextInput extends React.Component {
render() {
let { props, ref } = React.forwardRef((props, ref) => ({ props, ref }));
return <input type="text" placeholder="Hello World" ref={ref} />;
}
}
lub
class TextInput extends React.Component {
render() {
return (
React.forwardRef((props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />))
);
}
}
działa tylko: /
Wiem też, że wiem, sędziowie nie reagują. Próbuję użyć biblioteki kanw innej firmy i chciałbym dodać niektóre z ich narzędzi w oddzielnych składnikach, więc potrzebuję detektorów zdarzeń, więc potrzebuję metod cyklu życia. Może później pójść inną drogą, ale chcę tego spróbować.
Doktorzy mówią, że to możliwe!
Przekazywanie referencji nie jest ograniczone do komponentów DOM. Możesz również przekazywać odwołania do instancji komponentów klasy.
Ale potem używają KWR zamiast zwykłych klas.
źródło
connect
lub marterial-uiwithStyles
?connect
lubwithStyles
? Powinieneś owinąć wszystkie HOCforwardRef
i wewnętrznie użyć „bezpiecznej” podpórki, aby przekazać odniesienie do najniższego komponentu w łańcuchu.Aby przekazać referencję do klasy, musisz użyć innej nazwy właściwości.
innerRef
jest powszechnie używany w wielu bibliotekach.źródło
beautifulInputElement
jest bardziej funkcją niż elementem React, powinno być takconst beautifulInputElement = <BeautifulInputForwardingRef ref={ref => ref && ref.focus()} />
Zasadniczo jest to tylko funkcja HOC. Jeśli chciałeś użyć go z klasą, możesz to zrobić samodzielnie i użyć zwykłych rekwizytów.
Ten wzorzec jest używany na przykład w programie
styled-components
i jestinnerRef
tam nazywany .źródło
innerRef
całkowicie mija się z celem. Celem jest całkowita przejrzystość: powinienem być w stanie traktować element<FancyButton>
tak, jakby był zwykłym elementem DOM, ale używając podejścia styled-components, muszę pamiętać, że ten komponent używa arbitralnie nazwanej właściwości referencyjnej zamiast po prosturef
.innerRef
rzecz przekazywania referencji dziecku używającegoReact.forwardRef
, co próbuje osiągnąć OP.Można to osiągnąć za pomocą komponentu wyższego rzędu, jeśli chcesz:
A następnie w pliku komponentu:
Wykonałem pracę z góry z testami i opublikowałem pakiet do tego
react-with-forwarded-ref
: https://www.npmjs.com/package/react-with-forwarded-refźródło
Jeśli musisz ponownie użyć tego w wielu różnych komponentach, możesz wyeksportować tę zdolność do czegoś podobnego
withForwardingRef
stosowanie:
źródło