当前位置:  开发笔记 > 前端 > 正文

如何使用redux在首次渲染期间指示异步操作的"加载"状态

如何解决《如何使用redux在首次渲染期间指示异步操作的"加载"状态》经验,为你挑选了1个好方法。

假设我有一个如下所示的redux模块:

import fetch from 'isomorphic-fetch';

// CONSTANTS
const LOAD = 'LOAD';
const LOAD_SUCCESS = 'LOAD_SUCCESS';

// REDUCER
const initialState = { loading: false, data: [] };

export default function reducer(state = initialState, action) {
  switch (action.type) {
    case LOAD: return { ...state, loading: true };
    case LOAD_SUCCESS: return { ...state, loading: false, data: action.data };
    default: return state;
  }
}

// ACTION CREATORS
function requestLocations() {
  return { type: LOAD };
}

function receiveLocations(json) {
  return { type: LOAD_SUCCESS, data: json };
}

export function fetchLocations() {
  return function (dispatch) {
    dispatch(requestLocations());

    return fetch('http://myurl')
      .then(response => response.json())
      .then(json => dispatch(receiveLocations(json)));
  };
}

loading如果我在componentWillMount中进行异步调用,我就会在第一次渲染时遇到状态.想象一下,我的组件看起来像这样(简化为简洁):

export default class LocationContainer extends React.Component {
  componentWillMount() {
    fetchLocations(); // already bound and injected via connect.
  }

  render() {
    const { loading, data } = this.props; // injected via connect from reducer above.
    if (loading) {
      return ;
    } else {
      return ;
    }
  }
}

我遇到的问题是,在第一次渲染时LocationContainer,loading是假的,data还没有被提取.在componentWillMount,LOAD操作被触发,loading并且设置为true 的道具更改排队等待在后续渲染中发生.与此同时,在我第一次渲染时,LocationExplorer会在我真正想要的时候渲染,Spinner因为loading它仍然是假的.我想知道如何处理这个问题而不设置firstRender = true状态变量hack.



1> dreyescat..:

一个选项可能是loading使用您的data初始状态扩展您的条件:

const initialState = { loading: false, data: [] };

如果您loading和您data的空白,则意味着您处于等待新数据到来的确切状态:

if (loading && data.length === 0) {
  return ;
} else {

此外,我通常把我的异步调用componentDidMount而不是componentWillMount.


将调用移动到`componentDidMount`意味着该操作甚至会在稍后触发,从而为数据创建更长的等待时间.
这是我目前正在做的关于检查长度或集合上的!= null.有一点我不喜欢这个,如果服务器响应后数据恰好是空的会发生什么?在这种情况下,我不想要微调器 - 也许是创建新事物的消息.希望有一种更简单的方法可以做到这一点,但遗憾的是似乎没有更好的方法.
推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有