等待来自API的数据在使用redux进行组件渲染之前加载并重构

时间:2018-06-10 18:50:01

标签: javascript reactjs redux recompose

Hello StackOverflow社区,

在相当长的一段时间里,我一直困扰着一个问题:如何在React中处理异步API调用以及redux并正确地重新组合。在StackOverflow上研究了很多案例,但主要找到了涉及组件状态的答案,以检查" isLoading"设置为true或false,并使用接收的数据呈现加载指示符或实际组件。我的问题在其他地方。在我的项目中,我使用重构来创建更高阶组件,它将使用重构分支来显示Spinner组件是否" isFetching"如果它是假的,则为true或component。

问题在于我正在举行" isFetching"在redux存储中标记,我想从那里使用标志,而不是从组件状态,因此其他组件将知道另一个组件正在获取数据。

我的" withLoader" HOC看起来如下:

const withLoader = branch(
  ({ isFetching }) => isFetching,
  renderComponent(Spinner)
)

这个HOC的实际使用情况如下:

const Component = ({ cover }) => (
  <div>
    <img src={cover.url} />
  </div>
)

const mapStateToProps = (state) => ({
  entity: entitySelector(state),
  isFetching: isFetchingSelector(state),
})

export default compose(
  connect(mapStateToProps, { fetchData }),
  lifecycle({
    componentDidMount() {
      const { fetchData, match: { params } } = this.props
      fetchData(params.id)
    }
  }),
  withLoader
)(Component)

根据分支机构文件,如果&#34;对&#34;没有提供,如果测试通过,将呈现包装的组件。

数据树已标准化,这意味着我的reducer导出了以下组合的reducers:

byId:

const byId = (state = {}, action) => {
  if (!action.payload) return state
  const { entities } = action.payload

  if (!entities || !entities.hasOwnProperty('entityName')) return state
  return merge(state, entities.entityName)
}

allIds:

const allIds = (state = [], action) => {

  switch (action.type) {
    case REQUEST_ENTITY_SUCCESS:
      return action.payload.result
    default:
      return state
  }

}

,最后一个是取费:

const isFetching = (state = false, action) => {
  switch (action.type) {
    case REQUEST_ENTITY:
      return true
    case REQUEST_ENTITY_SUCCESS:
    case REQUEST_ENTITY_FAILURE:
      return false
    default:
      return state
  }
}

到目前为止,我知道componentDidMount生命周期会在组件实际呈现后触发fetchData,因此会抛出错误,因为cover是未定义的。就像我说的:主要是在web中我可以找到涉及组件状态的解决方案,但是如果我的&#34; isFetching&#34;我在这种情况下看不到使用组件状态的任何意义。指标存储在redux商店中。

我的问题是如何正确地制作我的&#34; withLoader&#34; HOC功能使用isreetching from redux state而不使用组件内部状态?

对于有点冗长的问题感到抱歉,但我想把所有内容都清楚,并用实际代码覆盖。

0 个答案:

没有答案