Redux从api获取数据

时间:2016-10-19 10:34:00

标签: react-native redux react-redux

我正在尝试使用Redux从api中获取一些数据。我的代码如下所示:

动作:

// Import libraries
import axios from 'axios';

// Import types
import {
  GET_ALL_PICKS
} from './types';

export const getAllPicks = ({ token }) => {
  const getPicks = (dispatch) => {
    axios({
      method: 'get',
      url: 'http://myapi/',
      headers: {
        Authorization: `Bearer ${token}`
      }
    })
    .then((response) => {
      console.log(response.data); // First log here returns data just fine
      dispatch({
        type: GET_ALL_PICKS,
        payload: response.data
      });
    })
    .catch((error) => {
      console.log(error);
    });
  };

  return getPicks;
};

减速机:

// Import types
import {
  GET_ALL_PICKS
} from '../actions/types';

// Set Initial State
const INITIAL_STATE = {
  allPicks: {},
  loading: false,
  error: ''
};

// Make pick reducers
export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case GET_ALL_PICKS:
      return { ...state, allPicks: action.payload }; // Logging action.payload here returns data just fine
    default:
      return state;
  }
};

组件:

// Import Libraries
import React, { Component } from 'react';
import { Text } from 'react-native';
import { connect } from 'react-redux';
import {
  getAllPicks
} from '../actions/picks';

// Make Component
class HomeScreen extends Component {
  // Fetch Data
  componentWillMount() {
    const { token } = this.props;

    this.props.getAllPicks({ token });
  }

  // Test response
  componentDidMount() {
    console.log(this.props.allPicks); // This log returns empty object, why?!
  }

  render() {
    return (
      <Text>Test</Text>
    );
  }
}

const mapStateToProps = ({ auth, picks }) => {
  const { token } = auth;
  const { allPicks } = picks;

  return {
    token,
    allPicks
  };
};

export default connect(mapStateToProps, { getAllPicks })(HomeScreen);

当我运行应用程序时,我会看到操作console.log中的数据,如果我在reducer中运行console.log(action.payload)我看到数据就好了,但在组件中我看到一个空数组,这表明我和#39;我没有正确连接我的减速机中的数据?这是日志的屏幕截图:

enter image description here

我在谷歌搜索后也在我的reducer中试过这个:

  return Object.assign({}, state, {
    allPicks: action.payload
  });

但我又得到了同样的结果。谁能向我解释我做错了什么?

1 个答案:

答案 0 :(得分:3)

您正在混淆组件生命周期和API生命周期。

在实践中,发生了什么:

  • componentWillMount
  • getAllPicks
  • componentDidMount(此时,API没有返回,选择为空)
  • [...等待API返回]
  • 然后API返回数据,但为时已晚

您需要做的是检查您的选择&#34; render()函数中的状态,每次状态更改时都会更新(在API返回时会发生),这要归功于connect()函数。

您还可以使用componentWillUpdate检查选择是否正确更新,而不是componentDidMount,这与正在更新的道具无关。