【问题标题】:Dynamically load images before render在渲染之前动态加载图像
【发布时间】:2018-01-27 05:07:57
【问题描述】:

我浏览了很多问题,但找不到正确答案。假设我有一个images 文件夹,我想在其中显示一个特定的图像。我不知道要显示的图像的名称,它是由 RESTful API 以及我正在显示的对象的许多其他详细信息返回的。

我考虑了一些替代方案:

  • 无论如何加载所有图像,然后只渲染我需要的图像。我在几个地方找到了这个,但我认为它很重,不是吗?
  • 使用 webpackrequire 即时需要的文件。

这里的第二个选项似乎是最好的。但是,当我这样做时:

componentDidMount() {
    axios.get('http://url.to/my/RESTful/api')
       .then(res => {
           this.setState(res.data);
       });
}
render() {
    var pic = require(`../images/${this.state.picture}`)
    return (<img src={pic} alt="some name" />)
);

React 抱怨它无法加载 undefined,因为它在 axios 调用完成之前开始渲染。因此,另一种选择是在调用完成时显示加载程序,或者通常阻止渲染。但我的问题是:这里的最佳做法是什么?我应该在每个加载动态数据的页面上都有一个加载器吗?我想我错过了一些东西,这就是我伸出援手的原因。你通常是怎么做的?非常感谢。

【问题讨论】:

    标签: reactjs webpack axios


    【解决方案1】:

    尝试以下方法:

    class ImageLoader extends Component {
        constructor() {
            super();
    
            this.data = {
                data: null
            };
        }
    
        componentDidMount() {
            axios.get("http://url.to/my/RESTful/api").then(res => {
                this.setState({ data: res.data });
            });
        }
    
        render() {
            return this.state.data
                ? <img
                      src={require(`../images/${this.state.data.picture}`)}
                      alt="some name"
                  />
                : null;
        }
    }
    

    【讨论】:

    • 非常感谢。这是可行的,因为在加载之前我们不会渲染任何东西。那么我的问题是:创建图像加载器是最佳实践吗?特别是,RESTful API URL 不是静态的,它取决于我正在加载的对象类型。您是否建议单独提供图像并使用您建议的通用图像加载器?
    • 我当然会建议单独提供图像,因为这将有助于使您的应用程序长期可扩展,并且考虑到未来是一个很好的设计原则。您当然可以通过将 URL 作为 axios.get(this.props.url) 之类的 prop 传递来使上述代码通用。不知道这是否有帮助,哈哈。
    • 这真的帮助我理解我应该如何思考,是的!并感谢您的建议。我想我会像你建议的那样创建一个图像加载器,但可能只传递图像名称,如果它未定义,它不会返回任何内容。这现在应该可以工作,并且将来我将依赖 CDN 时可以轻松升级。
    • 听起来像个计划!很高兴我能帮助你。快乐的编码broseph =]
    猜你喜欢
    • 2020-08-03
    • 2019-01-03
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多