使用 React 和 Redux 进行异步图像加载

Posted

技术标签:

【中文标题】使用 React 和 Redux 进行异步图像加载【英文标题】:Async Image Load with React and Redux 【发布时间】:2017-03-14 02:46:33 【问题描述】:

我正在尝试使用<PostList /> 容器创建一个简单的消息墙,该容器显示<Post /> 组件的列表。

 posts.map(function (post: any) 
                return <Post key=post.postid post=post />;
            )

我将一个帖子传递给Post 组件,该组件有一个&lt;Avatar /&gt; 组件,该组件在其中显示用户profile_pic,否则它会显示一个微调器。

我的问题是如何让组件显示在屏幕上,并在加载图像后用检索到的图像替换微调器?

我目前有以下 Reducer 和 Actions:

用户缩减器:

export default function(state = INITIAL_STATE, action : any)
    switch(action.type)
        case FETCH_USER_LOADING:
            return Object.assign(, state, isLoading: true);
        case FETCH_USER_DONE:
            return Object.assign(, state, users: state.users.concat(action.payload));


    return state;

用户操作:

export function fetchUser(id: any) 
    return function (dispatch: any) 
        dispatch( type: FETCH_USER_LOADING );
        return axios.get(`$ROOT_URL/users/$id`, 
            headers:  token: localStorage.getItem('token') 
        )
            .then(function (response) 
                dispatch(type: FETCH_USER_DONE, payload: response.data);
                return response.data
            )
     

【问题讨论】:

【参考方案1】:

有很多方法可以做到。

其中之一是编写自己的组件,其中一个新加载的图像会提示在componentDidMount 中重绘。这是您可以在自己的项目中使用的惰性图像的完整源代码:

export default class LazyImage extends React.Component 
  constructor(props) 
    super(props);
    this.state = 
      loaded: false,
      error: false
    ;
  

  componentDidMount() 
    const img = new Image();
    img.onload = () => 
      this.setState(
        loaded: true
      );
    ;
    img.onerror = () => 
      this.setState(
        error: true
      );
    ;
    img.src = this.props.src;
  

  render() 
    if (this.state.error) 
      return <img
        className=this.props.className
        style=this.props.style
        src=this.props.unloadedSrc
        alt=this.props.alt />
     else if (!this.state.loaded) 
      return <img
        className=this.props.className
        style=this.props.style
        src=this.props.unloadedSrc
        alt=this.props.alt />
    
    return <img
      className=this.props.className
      style=this.props.style
      src=this.props.src
      alt=this.props.alt />
  

然后你会像这样使用它:

<LazyImage unloadedSrc=unloadedSrc src=src />

然后,您可以选择使用大量组件,只需通过谷歌搜索即可找到:

“图像加载反应” “反应图像延迟加载”

或任何类似的搜索词变体。我最喜欢的组件是react-imageloader

我希望这会有所帮助。

【讨论】:

【参考方案2】:

我创建了一个用于延迟加载图像的库。它的主要功能是提供图像的动态调整大小,但它也可以解决您的问题。

https://github.com/peterlazzarino/react-adaptive-image

这是一个可以用于延迟图像加载的示例,它将解析来自 imgur 的图像。在我的生产应用程序中,我的图像解析器指向图像服务器,但这完全可以自定义。您只需将 .header-image 类设置为具有高度和宽度。

import React from 'react';
import ReactDOM from 'react-dom';
import  initImages  from 'react-adaptive-image';
import AdaptiveImage from 'react-adaptive-image';

initImages(
    imageResolver: function(image)
        return `https://i.imgur.com/$image.fileName`
    
)

class App extends React.Component 
    render() 
      return (
        <AdaptiveImage backgroundImage className="header-image" fileName='U6zWkcZ.png' />
      );
    
  

ReactDOM.render(<App />, document.getElementById('react-root'));

【讨论】:

以上是关于使用 React 和 Redux 进行异步图像加载的主要内容,如果未能解决你的问题,请参考以下文章

[Redux/Mobx] 在React中你是怎么对异步方案进行选型的?

如何使用 thunk 在 react-redux 挂钩中进行异步调用?

使用 Promise 中间件为 React-Redux 应用程序添加加载指示器

React Redux - 动作必须是普通对象。使用自定义中间件进行异步操作

React - Native ' Redux 未捕获错误:操作必须是普通对象。按下按钮时使用自定义中间件进行异步操作

如何解决 react-redux 中的此错误“错误:操作必须是普通对象。使用自定义中间件进行异步操作。”