异步 API 调用,Redux React-Native

Posted

技术标签:

【中文标题】异步 API 调用,Redux React-Native【英文标题】:Async API Call, Redux React-Native 【发布时间】:2019-01-20 15:54:27 【问题描述】:

我最近开始学习 React-Native,我正在尝试实施 Redux 来管理我的应用程序的状态。

由于我有使用 React JS 的经验,我实现了状态管理 Redux,就像我通常使用 React JS 一样。除了异步 api 调用外,一切似乎都有效。 store 中的 props 发生变化,但组件 props 中没有变化。

这是我设置 redux 商店的方式

import  createStore, compose, applyMiddleware  from 'redux';
import logger from 'redux-logger';
import thunk from 'redux-thunk';
import reducer from './reducers';

//create initial state 
const initialState = ;

//create a variable that holds all the middleware
const middleware = [thunk, logger];

//create the store
const store = createStore(
  reducer,
  initialState,
  compose(
    applyMiddleware(...middleware)
  )
);

export default store;

我的减速器组件

import  FETCH_REQUEST_BEGIN, FETCH_REQUEST_FAILED, DATA_FETCHED from '../constants';


const initialState = 
  movieResults: null,
  fetching : false,
  failed : false


export default (state = initialState, actions)=>

  switch(actions.type)

    case FETCH_REQUEST_BEGIN:
      return  
        ...state,
        fetching : true
      ;
    case DATA_FETCHED : 
      return 
        ...state,
        movieResults : actions.payload,
        fetchin : false
      
    case FETCH_REQUEST_FAILED:
      return  
        ...state,
        failed : true
      ;
    default : 
      return state;
  

这是根减速器

import  combineReducers  from 'redux';
import movieReducer from './movieReducer';


export default combineReducers(
  movie : movieReducer
);

动作组件

import axios from 'axios';

import  FETCH_REQUEST_BEGIN, FETCH_REQUEST_FAILED  from '../constants';

const apiRequest = (url, type) => 
  return dispatch => 
    dispatch(
      type : FETCH_REQUEST_BEGIN
    );

    axios.get(url)
      .then((results) => 
        dispatch(
          type : type,
          payload : results.data
        );
      ).catch((error) => 
        dispatch(
          type : FETCH_REQUEST_FAILED,
          payload : error
        );
      );
  


export default apiRequest;

主要组件

import React,  Component  from 'react';
import  View, Text, Button, ActivityIndicator  from 'react-native';
import  API, DATA_FETCHED  from '../constants';
import  apiRequest  from '../actions';
import  connect  from 'react-redux';

class Home extends Component 

  componentWillMount() 
    const discoverUrlMovies =`https://jsonplaceholder.typicode.com/posts`;
    this.fetchData(discoverUrlMovies, DATA_FETCHED);
  

  fetchData = (url, type) => 
    this.props.apiRequest(url, type);
  

  shouldComponentUpdate(nextProps, prevProps)
    return nextProps != prevProps
  

  render() 
    const  movie   = this.props;

    //console out the props
    console.log('this.props', this.props);

    let displayMovies;

    if(movie === undefined || movie === null )
      displayMovies = <ActivityIndicator size = 'large' color = '#121222'/>
    else 
      displayMovies = <Text>Working</Text>
    
    return (
      <View style = flex: 1>
        <Text>Home</Text>
        
          //display result 
          displayMovies
        
      </View>
    );
  


const mapStateToProps = (state) => 
  return 
    movie : state.movieResults
  

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

我错过了什么/做错了什么?

【问题讨论】:

【参考方案1】:

您需要将mapStateToProps func 定义为

movie : state.movie.movieResults

因为您将它们组合为

export default combineReducers(
  movie : movieReducer
);

【讨论】:

谢谢,非常感谢!想弄清楚这个问题,我很生气。 我现在面临另一个问题。道具更新但坏了。我的意思是它更新前 5-10 个然后它更新整个使一些数据重复 哦,好的,您可以单独创建一个包含相关详细信息的问题,以便更多用户回答。当我有空时,我会看看它。谢谢。 谢谢!一定会的!

以上是关于异步 API 调用,Redux React-Native的主要内容,如果未能解决你的问题,请参考以下文章

react-redux s-s-r 异步 api 调用未按预期工作

在 Redux 中我应该在哪里编写复杂的异步流?

如何对 REST api 执行异步 axios 调用并更新存储(redux thunk 令人困惑)?

如何一个接一个地调度两个异步 redux 动作?

如何使用 Redux-Saga 和 Hooks 调用 API

如何在异步函数中调用 redux 调度作为函数体?