redux thunk fetch api action 和 reducer

redux thunk fetch api action and reducer

所以决定使用 redux-thunk 并且我在我的操作和 reducer 中编写函数时遇到问题。实际上函数看起来像这样:

  async getData() {
    if (this.props.amount === isNaN) {
      return;
    } else {
      try {
        await fetch(
          `https://api.exchangeratesapi.io/latest?base=${this.props.base}`,
        )
          .then(res => res.json())
          .then(data => {
            const date = data.date;
            const result = (data.rates[this.props.convertTo] * this.props.amount).toFixed(4);
            this.setState({
              result,
              date,
            });
          }, 3000);
      } catch (e) {
        console.log('error', e);
      }
    }
  }

而且我已经有了动作类型

export const FETCH_DATA_BEGIN = 'FETCH_DATA_BEGIN';
export const FETCH_DATA_SUCCESS = 'FETCH_DATA_SUCCESS';
export const FETCH_DATA_FAIL = 'FETCH_DATA_FAIL';

和这样的行为

export const fetchDataBegin = () => {
  return {
    type: actionTypes.FETCH_DATA_BEGIN,
  };
};

export const fetchDataSuccess = data => {
  return {
    type: actionTypes.FETCH_DATA_SUCCESS,
    data: data,
  };
};

export const fetchDataFail = error => {
  return {
    type: actionTypes.FETCH_DATA_FAIL,
    error: error,
  };
};

然后是对我来说最困难的部分,我不知道如何从函数 async getData() 中获得相同的结果。我的行动中已经有了这个:

export async function fetchData() {
  return async dispatch => {
    return await fetch(`https://api.exchangeratesapi.io/latest?base=${this.props.base}`)
        .then(res => res.json())
        .then(data => {
         // <------------------- WHAT NEXT?
  }
};
export function fetchData() {
  return dispatch => {
    fetch(`https://api.exchangeratesapi.io/latest?base=${this.props.base}`)
        .then(res => res.json())
        .then(data => dispatch(fetchDataSuccess(data)), e => dispatch(fetchDataFail(e)))
  }
};

现在这段代码:

const date = data.date;
const result = (data.rates[this.props.convertTo] * this.props.amount).toFixed(4);
this.setState({
  result,
  date,
});

进入你的减速机

if(action.type === FETCH_DATA_SUCCESS) {
  const date = action.data.date;
  const rates = action.data.rates;
  return { ...state, rates, date };
}

现在您可以在组件中使用 redux 状态并在那里进行其余计算(需要 this.props)。

现在要发送 fetchData 操作,您需要在您的 react-redux 连接组件中执行 this.props.dispatch(fetchData())

编辑

下面是如何在组件中使用状态。

我假设您已经创建了 redux 商店。类似于:

const store = createStore(rootReducer,applyMiddleware(thunk));

现在,您可以使用 react-redux 库的 connect 函数将 redux 状态连接到您的组件。

function mapStateToProps(state, ownProps) {
  return { 
    date: state.date,
    result: (state.rates[ownProps.convertTo] * ownProps.amount).toFixed(4);
  }
}

function mapDispatchToProps(dispatch) {
  return {
    fetchData: () => dispatch(fetchData())
  }
}

export default connect(mapStateToProps,mapDispatchToProps)(YourComponent)

您现在可以在您的 DOM 中使用这个高阶组件并将适当的道具传递给它:

import ConnectedComponent from "./pathTo/ConnectedComponent";
...
return <View><ConnectedComponent convertTo={...} amount={...} /></View>;

而且,在 YourComponent 中,您现在还可以阅读 this.props.datethis.props.result 并在任何需要的地方使用它们。

你可能想看看 selectors 在未来记忆状态并降低 redux 的性能成本。