2017-08-17 28 views
0

我有這些文件,當我派遣的東西時,總是返回reducer的默認情況。React-Redux |調度員不工作

這是我第一次使用終極版/ thunk的,而我下面這個教程:https://www.youtube.com/watch?v=nrg7zhgJd4w當他這樣做,它的工作原理..

請看看我的代碼:

反應成分:

import React, { Component } from 'react'; 
import './App.css'; 
import Request from 'request'; 
import { connect } from 'react-redux' 

import * as OperationsActions from './actions/operationsReducerActions' 

//import { Content, FilterSelect, ListItem, Searchbar, Sidebar} from './components/index.js' 

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

class App extends Component { 
    constructor(props){ 
    super(props); 
    } 
    componentDidMount(){ 
    this.props.dispatch(OperationsActions.getOperations()); 
    } 
    render() { 
    console.log(this.props) 
    return(
     <div>{this.props.operations.operations[0].text}</div> 
    ) 
    } 
} 

export default connect(mapStateToProps)(App) 

行動文件:

import Request from 'request'; 

export function getOperations(){ 
     Request('http://localhost:8000/client/REQUEST_OPERATIONS', (error, response, data) => { 
      if(!error){ 
       return {type : 'FETCH_OPERATIONS_SUCCES', payload : data}; 
      } 
      else { 
       return {type : 'FETCH_OPERATIONS_REJECTED', payload : error} 
      } 
    }); 
} 

減速機:

export default function reducer(state={ 
     operations : [{ 
      text : '', 
      reqArgument : '', 
      filters : [], 
      url : '' 
     }], 
     fetching : false, 
     fetched : false, 
     error : null 
    }, action) { 

     switch(action.type){ 
      case 'FETCH_OPERATIONS':{ 
       return {...state, fetching : true } 
      } 
      case 'FETCH_OPERATIONS_REJECTED':{ 
       return {...state, fetching : false, error : action.payload} 
      } 
      case 'FETCH_OPERATIONS_SUCCES':{ 
       return {...state, fetched : true, fetching : false, operations : action.payload } 
      } 
      default : { 
       return {...state} 
      } 
     } 
    } 

和我的商店:

進口{applyMiddleware,createStore}從 '終極版'

import logger from 'redux-logger' 
    import thunk from 'redux-thunk' 
    import promise from 'redux-promise-middleware' 

    import reducer from './reducers' 

    const middleware = applyMiddleware(promise, thunk, logger) 

    export default createStore(reducer, middleware) 
+0

什麼不工作是什麼呢?如果可以,請嘗試突出顯示問題。屏幕上什麼也沒有顯示出來?你有沒有嘗試用'console.log()'記錄任何值? –

+0

是的,我試過控制檯日誌記錄的東西,問題是,我的減速器總是不斷回饋默認情況/狀態,或者我的調度員不能正常工作... –

回答

1

問題

class App extends Component { 
    ... 
    componentDidMount(){ 
    this.props.dispatch(OperationsActions.getOperations()); 
    } 
    ... 
} 

調用OperationsActions.getOperations()將返回undefined - 它不沒有明確地返回任何東西。因此,您的減速器將收到undefined作爲其action參數。然後switch將運行其默認情況。

解決方案

getOperations行動應轉換爲一個thunk。下面是一個例子:

function getOperationsThunk() { 
    return function (dispatch) { 
    Request('http://foo.bar', (err, data) => { 
     if (err) { dispatch(errorAction(err)); } 
     else { dispatch(successAction(data)); } 
    }); 
    }; 
} 

errorActionsuccessAction功能將來自異步請求接收的數據,並創建操作對象要被分派。

延伸閱讀

+0

是的,我已經嘗試過,但我試圖調度行動作爲對象在thunk裏面,沒有工作。現在我添加了單獨的動作定義爲返回對象的函數,我派遣這些行動,它們的工作:) –

+0

@LaurensMäkel:使用對象文字來代替動作創建者函數應該沒有區別。你可以擴大你的問題,包括這一嘗試,我會審查它。然而,無論如何擁有行動創造者是一個很好的做法(參見[這裏](http://blog.isquaredsoftware.com/2016/10/idiomatic-redux-why-use-action-creators/)或[官方文檔](http ://redux.js.org/docs/basics/Actions.html#action-creators)爲什麼; tldr:modular,DRY,testable)。很高興它現在正在工作,但! – wing