React / Redux如何传递参数来修改API

时间:2018-07-27 19:58:39

标签: javascript reactjs react-native redux react-redux

过去两天我一直在使用Redux,我对它有所了解,但是遇到了一个问题,该问题使我的进步停了下来。

我有一个具有可互换参数的API。

例如api.example.com/data/{date}/..api.example.com/more-data/{regId}/..

我的<Picker />选择了一个值,该值应位于调用API并提供所选数据的URL的后面,在我的情况下为regionId

问题在于更改参数而不会导致错误或Api调用出现CORS问题。我还希望能够将regionId设置为具有initialState,以便可以从URL中的参数开始请求。

ReqService.js(仅用于异步api调用)

class ReqService {
    async getRequest(url) {
        try {
            let response = await (await fetch(url));
            let responseJson = await response.json();
            return responseJson;
        } catch (error) {
            console.error('Error: ', error);
        }
    }
}
export default new ReqService()

actions.js

import ReqService from '../ReqService';

export const IS_FETCHING = 'IS_FETCHING';
export const DATA_FETCHED = 'DATA_FETCHED';
export const ERROR_FETCHING_DATA = 'ERROR_FETCHING_DATA';

const BASE_URL = 'https://api.example.com/';
const DATE_TODAY = new Date().toISOString();

export const getTheData = (regionId) => { 
  // The regionId is the param i want to pass to the url
  const url = `${BASE_URL}/${DATE_TODAY}/${regionId}`;
  const request = ReqService.getRequest(url);

  return dispatch => {
    dispatch({ type: IS_FETCHING });
    request
      .then((data ) => {
        dispatch({ type: DATA_FETCHED, payload: data });
      })
      .catch(error => {
        dispatch({ type: ERROR_FETCHING_DATA, payload: error });
      });
  };
};

reducer.js

import { IS_FETCHING, DATA_FETCHED, ERROR_FETCHING_DATA } from '../Actions/actions';

const initialState = {
  data: [],
  fetching: false,
  fetched: false,
  error: null
};

export const myReducer = (state = initialState, action) => {
  console.log(action);
  switch (action.type) {
    case IS_FETCHING:
      return { ...state, fetching: true };
    case DATA_FETCHED:
      console.log('The Data Fetched ', action.payload);
      return {
        ...state,
        fetched: true,
        fetching: false,
        data: action.payload.data
      };
    case ERROR_FETCHING_DATA:
      return { ...state, fetching: false, error: action.payload.error };
    default:
      return state;
  }
};

参数在此处更改的组件:

import React, { Component } from 'react'
import {View, Text, Picker} from 'react-native'
import { connect } from '../../node_modules/react-redux';
import { getTheData } from './Actions/actions';
import { bindActionCreators } from "redux";

class FrontPage extends Component {
  constructor(props){
    super(props);
    this.state = {
      regionId:0
    };
  }

  changeRegion = (regId) => {
    this.props.getTheData(regId);
  }

  componentDidMount() {}

  render() {
    return (
      <View>
        <Text>Front Page</Text>
        <Picker selectedValue={this.props.regionId}
                    onValueChange={itemValue => this.changeRegion(itemValue)}>
                    <Picker.Item label="One" value='1' />
                    <Picker.Item label="Two" value='2' />
                </Picker>
      </View>
    )
  }
}

const mapStateToProps = state => {
  return {
    data: state.data,
    fetching: state.fetching,
    error: state.error
  };
};

const mapDispatchToProps = (dispatch) => {
  return bindActionCreators({ getTheData }, dispatch);
};

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

我不知道自己是否做得正确,我查看了不同的示例并实施了正确的方法。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

从您共享的内容来看,它看起来像是React和Redux的良好实现。

如果您希望Picker组件最初具有选定的值,则将状态设置为应有的状态。在您的情况下,请在FrontPage组件中设置状态regionId。

this.state = {
  regionId: 1 // this will pre-select the first value.
};

“问题在于更改参数而不会导致错误或Api调用出现CORS问题。”

我不确定更改参数时遇到哪些问题。您能否详细说明或包含屏幕截图?

关于CORS错误消息。请查看文章How to fix CORS problems,以更好地理解它以及您需要更改的内容。出现此错误时,问题不在客户端应用程序中,而在服务器应用程序中。要解决此问题,您需要在服务器级别启用CORS支持。 您可以通过设置Access-Control-Allow-Origin标头来实现。例如

Access-Control-Allow-Origin: *

这将允许任何主机访问API,即使它们位于不同的域或发布中。