我想知道是否可以同时使用 React 16 的惰性、Suspense、createRef 和 forwardRef 特性来附加对动态导入组件的引用。有谁知道这是否可能。我试图按照这个例子(https://github.com/facebook/react/pull/13446/commits/4295ad8e216e0747a22eac3eed73c66b153270d4#diff-e7eafbb41b012aba463f5a2f8fc00f65R1614),但它似乎不太适用于动态导入的组件。
通过在父组件中设置自定义道具,将其传递给子组件,然后在子组件的渲染函数中将 ref 设置为该道具,我已经能够获得类似的所需行为(下面的示例)。我对这种方法的唯一问题是它可能不是最干净的解决方案,并且可能难以在大型团队中保持实施的一致性。尝试将 ref 放置在实际组件上时,它也会变得更容易。
// 工作(不需要的实现) // 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() 实现所需的实现
//父.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} />
);
直接在延迟加载的组件上设置 ref 总是返回 null。如果它返回来自 React.createRef() 的值,那就太好了。