使用webpack2中的System异步的组件,定义ref不生效

发布于 2022-09-04 12:27:57 字数 2041 浏览 9 评论 0

图片描述

类似这种方式,动态再render中设定ref是可以获取的,但是让lazilyLoad一封装ref就不生效了,可是其他的props是有的,不明白发生了什么..

没有用过这个组件的可以看下面LazilyLoad的组件.


import React from 'react';

/**
 * @function 支持异步加载的封装组件
 */
class LazilyLoad extends React.Component {

    constructor() {
        super(...arguments);
        this.state = {
            isLoaded: false,
        };
    }

    componentWillMount() {
        this.load(this.props);
    }

    componentDidMount() {
        this._isMounted = true;
    }

    componentWillReceiveProps(next) {
        if (next.modules === this.props.modules) return null;
        this.load(next);
    }

    componentWillUnmount() {
        this._isMounted = false;
    }

    load(props) {
        this.setState({
            isLoaded: false,
        });

        const {modules} = props;
        const keys = Object.keys(modules);

        Promise.all(keys.map((key) => modules[key]()))
            .then((values) => (keys.reduce((agg, key, index) => {
                agg[key] = values[index];
                return agg;
            }, {})))
            .then((result) => {
                if (!this._isMounted) return null;
                this.setState({modules: result, isLoaded: true});
            });
    }

    render() {
        if (!this.state.isLoaded) return null;
        console.log(this.props);
        // console.log(this.state.modules);
        return React.Children.only(this.props.children(this.state.modules));
    }
}

LazilyLoad.propTypes = {
    children: React.PropTypes.func.isRequired,
};

export const LazilyLoadFactory = (Component, modules) => {
    return (props) => (
    <LazilyLoad modules={modules}>
        {(mods) => <Component {...mods} {...props} />}
    </LazilyLoad>
    );
};

export const importLazy = (promise) => (
    promise.then((result) => result.default)
);

export default LazilyLoad;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

辞取 2022-09-11 12:27:57

你的这种情况因为被第三方的插件包裹了,所以你回去的ref是第三方的,并不是你所想要的,所以这个方法不可取。
你的这个类似于redux中connect你的组件,类似于下面的这个

const mapStateToProps= (state)=>{
  const {hrSetting:{organizations,employeesLookup}}= state;
  return {
      organizations,
      employeesLookup
  };
}

export default connect(mapStateToProps)(ListOfTable);

此时你的组件就被Connect包裹了,所以你获取不到你想要的ref了

图片描述

国粹 2022-09-11 12:27:57

ref='asd'这种写法官方不建议使用了,你可以试试ref={r => this.asd = r}能不能得到正确的引用?其他代码看了一下好像没什么问题。实在不行,可以包装一层试下,比如:

({LoadedLate}) => {
    return <div ref={r => this.asd = r}><LoadedLate uuid={SliderId} /></div>
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文