Интересно, можно ли было бы использовать ленивые, Suspense, createRef и forwardRef функции React 16 вместе, чтобы прикрепить ссылку на динамически импортируемый компонент. Кто-нибудь знает возможно ли это. Я попытался последовать примеру (https://github.com/facebook/react/pull/13446/commits/4295ad8e216e0747a22eac3eed73c66b153270d4#diff-e7eafbb41b012aba463f5a2f8fc00f65R1614),, однако, похоже, он не работает с динамически импортированными компонентами.
Мне удалось получить аналогичное желаемое поведение, установив пользовательский реквизит в родительском компоненте, передав его дочернему компоненту, а затем установив ссылку на этот реквизит в дочерней функции рендеринга (пример ниже). Моя единственная проблема с этим подходом состоит в том, что он может быть не самым чистым решением, и может быть трудно поддерживать согласованность реализации в большой команде. Это также облегчит попытки размещения ссылки на фактический компонент.
// Работаем (Нежелательная реализация)
// Parent.js
const LazyClass = lazy(() => { return import('./Child') };
class Parent extends React.Component {
this.childRef = React.createRef();
render() {
return (
<Suspense fallback={<div>Loading</div>}>
<Child forwardRef={this.childRef} />
</Suspense>
);
}
}
// Child.js
class Child extends React.Component {
render() {
return (<div>I am the Child!</div>);
}
}
export default React.forwardRef(({forwardRef, ...props}/*, ref*/) =>
<Child {...props} ref={forwardRef} />
);
/////////////////////////////////////////////// ///////
// Желаемая реализация с React.forwardRef ()
// Parent.js
const LazyClass = lazy(() => { return import('./Child') };
class Parent extends React.Component {
this.childRef = React.createRef();
render() {
return (
<Suspense fallback={<div>Loading</div>}>
<Child ref={this.childRef} />
</Suspense>
);
}
}
// Child.js
class Child extends React.Component {
render() {
return (<div>I am the child</div>);
}
}
export default React.forwardRef((props, ref) =>
<Child { ...props } ref={ref} />
);
Установка ссылки непосредственно на Lazily загруженный компонент всегда возвращает ноль. Было бы хорошо, если бы он возвращал значение из React.createRef ().