【问题标题】:React - Redux wait fetch result before render componentReact - Redux 在渲染组件之前等待获取结果
【发布时间】:2019-07-21 08:46:08
【问题描述】:

我有一些 react-redux 项目。 我有一些组件,我不想列出来自 api 的一些数据。 我只是在 componentDidMount 方法中从我的组件调度操作,该方法获取数据。

当我刷新页面时,我将 console.log 设置为我的 redux 状态。

组件渲染良好,但是当我查看控制台时,我的 console.log 显示我的状态为空,然后正常显示我的状态。在此过程中,我的组件给我一个错误,我不想显示我的数据页面未定义。

所以这是因为我理解的 fetch 方法异步工作,但是当我的 redux 状态将从 api 获取数据然后渲染组件时需要做什么?

这是我的操作:

export const FETCH_DATA_START = 'FETCH_DATA_START'
export const FETCH_DATA_SUCCESS = 'FETCH_DATA_SUCCESS'
export const FETCH_DATA_FAILED = 'FETCH_DATA_FAILED'

export const getData = () => {
    return (dispatch) => {
        dispatch({
            type: FETCH_DATA_START
        })
        fetch("http://api.com", {
                credentials: "include",
                method: "POST",
                headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                }
            })
            .then(res => res.json())
            .then((res) => {
                dispatch({
                    type: FETCH_DATA_SUCCESS,
                    payload: res
                })
            })
            .catch((err) => {
                console.log(err)
                dispatch({
                    type: FETCH_DATA_FAILED,
                    payload: 'error'
                })
            })
    }
}

这是我的 reducer:

import { FETCH_DATA_START, FETCH_DATA_SUCCESS, FETCH_DATA_FAILED } from 'store/actions/getData'

let initialState = []

export default (state = initialState, action) => {
    switch (action.type) {
        case FETCH_DATA_START:
            return [...state]
        case FETCH_DATA_SUCCESS:
            return [...state, ...action.payload]    
        case FETCH_DATA_FAILED: 
            return [state]
        default:
            return state
    }
}

在我的组件中:

import React, {Component} from 'react'
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux'
import {getData} from 'store/actions/getData'


class Ops extends Component {

    componentDidMount() {
        this.props.getData()
    }
    render() {
       console.log(this.props.dataOps)
       return(
           <div></div>
         )
    }
}


const mapStateToProps = state => ({dataOps: state.dataOps})

function mapDispatchToProps(dispatch) {
    return {
        getData: bindActionCreators(getData, dispatch)
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(Ops)

【问题讨论】:

  • 您也可以发布您的组件吗?你确定你的组件没有更新吗? reducer 和 fetch 看起来不错。您描述它的方式听起来像控制台日志和错误未定义是因为在异步调用完成之前触发了此脚本。
  • @Mkk 我明白了。是的,因为它是异步的,但是如何防止它呢?我用组件更新了我的问题

标签: javascript reactjs redux


【解决方案1】:

选项 1

使用前检查reducer状态

选项 2

 async componentDidMount(){
   //set loader true
   await this.props.getData;
   //set loader false
 }

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2021-11-21
    • 2022-12-03
    • 1970-01-01
    相关资源
    最近更新 更多