【问题标题】:Async api fetch with redux thunk使用 redux thunk 获取异步 api
【发布时间】:2020-10-28 20:34:21
【问题描述】:

我无法从 api 获取用户列表。我认为问题可能出在我的 mapDispatchToProps 函数中,但我不确定。其他一切对我来说似乎都很好。我是 redux 的新手,我有点难以理解它,所以感谢任何帮助

理想情况下,用户列表会在组件安装后立即显示。我在没有 redux 商店的情况下做了同样的事情,它工作得很好,我只是不确定如何集成 redux

动作

export const startLoading = () => {
    return {
        type: START_LOADING
    }
}
export const updateUserData = payload => {
    return {
        type: UPDATE_USER_DATA,
        payload
    }
}
export const updateUserError = payload => {
    return {
        type: UPDATE_USER_ERROR,
        payload: payload
    }
}

export function fetchUsers() {
    return dispatch => {
        dispatch(startLoading());
        fetch('https://jsonplaceholder.typicode.com/users')
            .then(res => res.json())
            .then(data => {
                data = data.filter(user => user.id < 4);
                data.forEach(user => {
                    user.isGoldClient = false;
                    user.salary = '4000';
                    user.photo = userThumbnail;
                })
                .then(data => {
                    dispatch(updateUserData(data));
                }).catch(error => {
                    dispatch(updateUserError(error));
                })
            });
    };
};

减速器

const initialState = {
    loading: false,
    users: [],
    error: null
};

export function userReducer(state=initialState, action){
    switch(action.type){
        case START_LOADING:
            return {
                ...state,
                loading: true
            }
        case UPDATE_USER_DATA:
            return {
                ...state,
                loading: false,
                users: action.payload,
                error: null
            }
        case UPDATE_USER_ERROR:
            return {
                ...state,
                error: action.payload,
                loading: false,
                users: []
            };
        default:
            return state;
    };
};

组件

class Home extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
        users: [],
        usersAreDisplayed: true
        };
    }
    componentDidMount() {
        fetchUsers();
    }
     
    render(){
        return (
             <UserList users={this.state.users} /> 
        )
    }
}

function mapStateToProps(state){
    return { users: state.users }
}

function mapDispatchToProps(dispatch){
    return {
        fetchUsers: payload => dispatch(updateUserData(payload)),
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(Home);

【问题讨论】:

    标签: javascript reactjs asynchronous redux redux-thunk


    【解决方案1】:

    您正在将 redux 状态映射到组件的 props

    所以你应该从组件的props而不是state加载用户:

        render(){
            return (
                 <UserList users={this.props.users} /> 
            )
        }
    

    【讨论】:

    • 这段代码除了调用fetchUsers: payload =&gt; dispatch(updateUserData(payload)),,应该是fetchUsers:() =&gt; dispatch(fetchUsers()),
    • 谢谢,我都编辑了,但屏幕上仍然没有任何显示
    【解决方案2】:
    1. 看起来您根本没有调用实际的 fetchUsers

    像这样更改组件代码

    function mapStateToProps(state){
      return { users: state.users }
    }
    
    // remove this function
    // function mapDispatchToProps(dispatch){
    //   return {
    //       fetchUsers: payload => dispatch(updateUserData(payload)),
    //   }
    // }
    
    export default connect(mapStateToProps, {fetchUsers})(Home); //<---- destructure it here. Also import the function (action)
    

    1a。 fetchUsers 函数需要使用this.props访问

        componentDidMount() {
            this.props.fetchUsers();
        }
    
    1. forEach 之后有一个额外的then 块。 删除它。
    export function fetchUsers() {
      return (dispatch) => {
        dispatch(startLoading());
        fetch("https://jsonplaceholder.typicode.com/users")
          .then((res) => res.json())
          .then((data) => {
            data = data.filter((user) => user.id < 4);
            data.forEach((user) => {
              user.isGoldClient = false;
              user.salary = "4000";
              user.photo = userThumbnail;
            });
            dispatch(updateUserData(data)); // <------ no extra .then is required
          })
          .catch((error) => {
            dispatch(updateUserError(error));
          });
      };
    }
    
    1. &lt;UserList users={this.state.users} /&gt; 也必须是 &lt;UserList users={this.props.users} /&gt; @Nsevens 已经提到过

    【讨论】:

    • 这终于奏效了。我花了几天时间盯着这段代码。太感谢了!!有一个伟大的!
    猜你喜欢
    • 2021-06-15
    • 2018-01-31
    • 2021-04-29
    • 2016-09-19
    • 2017-03-03
    • 2018-01-10
    • 1970-01-01
    • 2021-12-11
    • 2021-06-16
    相关资源
    最近更新 更多