2017-06-08 25 views
0

私はFetchAPIとReduxを使ってテストAPIを取得しようとしています。RexでのReduxアクションのディスパッチ

問題はディスパッチ控除アクションです。ここで

は私のコードです:

ProductList.js 
import React, { Component } from 'react'; 
import { bindActionCreators } from 'redux'; 
import { connect } from 'react-redux'; 
import * as productActions from '../actions/product'; 
import RaisedButton from 'material-ui/RaisedButton'; 

function fetchProductsWithRedux() { 
    console.log("fetchProductsWithRedux-1"); 
    return (dispatch) => { 
     console.log("fetchProductsWithRedux-2"); 
     dispatch(this.props.action.fetchProdutcsRequest()); 
     return fetchProdutcs().then(([response, json]) => { 
      if (response.status === 200) { 
       console.log("success"); 
       dispatch(this.props.action.fetchProductsSucesss(json)) 
      } 
      else { 
       console.log("error"); 
       dispatch(this.props.action.fetchProductsError()) 
      } 
     }) 
    } 
} 

function fetchProdutcs() { 
    const URL = "https://jsonplaceholder.typicode.com/posts"; 
    return fetch(URL, { method: 'GET' }) 
     .then(response => Promise.all([response, response.json()])); 
} 


class ProductList extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      productList: [ 
       'product 1', 
       'product 2', 
       'product 3' 
      ] 
     } 
    } 
    componentDidMount() { 
     fetchProductsWithRedux(); 
    } 
    render() { 
     return (
      <div className="ProductList"> 
       <h2>Products</h2> 
       <ul> 
        { 
         this.props.posts && 
         this.props.posts.map((post) => { 
          return (
           <li>{post.title}</li> 
          ) 
         }) 
        } 
       </ul> 

       <ol> 
        <RaisedButton label="Get Products Action" onClick={this.props.action.getProducts} /> 
       </ol> 
      </div> 
     ); 
    } 
} 

function mapStateToProps(state, props) { 
    return { 
     product: state.product, 
     posts: state.posts 
    }; 
} 
function mapDispatchToProps(dispatch) { 
    return { 
     action: bindActionCreators(productActions, dispatch) 
    } 
} 
export default connect(mapStateToProps, mapDispatchToProps)(ProductList); 

product.js(アクション)

export function fetchProductsRequest() { 
    console.log('fetchProductsRequest'); 
    return { 
    type: 'FETCH_PRODUCTS_REQUEST' 
    } 
} 

export function fetchProductsSuccess(payload) { 
    console.log('fetchProductsSuccess'); 
    return { 
    type: 'FETCH_PRODUCTS_SUCCESS' 
    } 
} 

export function fetchProductsError() { 
    console.log('fetchProductsError'); 
    return { 
    type: 'FETCH_PRODUCTS_ERROR' 
    } 
} 

product.js(減速)

export default(state = [], payload) => { 
    switch (payload.type) { 
     case 'FETCH_PRODUCTS_REQUEST': 
      console.log('FETCH_PRODUCTS_REQUEST action'); 
      return state; 
     case 'FETCH_PRODUCTS_SUCCESS': 
      console.log('FETCH_PRODUCTS_SUCCES action'); 
      return {...state, posts: payload.payload} 
     default: 
      return state; 
    } 
}; 

store.js

import { createStore } from 'redux'; 
import rootReducer from './reducers'; 

export default(initialState) => { 
    return createStore(rootReducer, initialState); 
} 

Product.js (pages, component) 
import React, { Component } from 'react'; 
import ProductList from '../../components/ProductList'; 
import RaisedButton from 'material-ui/RaisedButton'; 
//import './Product.css'; 

class Product extends Component { 
    render() { 
     return (
      <div className="Product"> 
       <h1>ProductList Page</h1> 
       <RaisedButton label="Default" /> 
       <ProductList /> 
      </div> 
     ); 
    } 
} 
export default Product; 

行console.log( "fetchProductsWithRedux-2"); in ProductList.jsには一度も達していません。

どういうところが間違っていますか?何か案は?前もって感謝します。

+0

あなたは 'redux-thunk'ミドルウェアを使うべきです。それを店舗に適用します。 – Gnanesh

答えて

2

あなたは 'redux-thunk'からのインポートサンクを見逃したようです。あなたは「Reduxの-サンク」のような任意のミドルウェアを使用していけない場合があります。これは、

componentDidMount() { 
    fetchProductsWithRedux(); 
} 
0
function fetchProductsWithRedux() { 
console.log("fetchProductsWithRedux-1"); 
return (dispatch) => { 
    console.log("fetchProductsWithRedux-2"); 
    ... 
    } 

をReduxのアクションで関数を返すことはできません。あなたのコードに関するいくつかの問題。

最初に、fetchProductsWithReduxはアクションであるため、直接呼び出すのではなく、ディスパッチする必要があります。 Bjoernが言及したように、あなたがそれを呼び出す方法では、関数呼び出しは決して呼び出されない関数を返します。

現在、オブジェクトではなく関数を返すため、現在のシナリオではディスパッチできません。これを修正するには、関数をディスパッチできるようにするredux-thunkを使用する必要があります。

getProductsの場合と同様に、mapDispatchToPropsに追加することはできますが、省略形があります。 -

const mapDispatchToProps = { fetchProductsWithRedux, getProducts } 

2つの機能を持つオブジェクトを返すだけであることに気づくでしょう。ドキュメントから

オブジェクトが渡された場合、その内部の各機能は、Reduxのアクションの作成者であると想定されます。同じファンクション名を持ち、すべてのアクション作成者がディスパッチコールにラップされて直接呼び出されるオブジェクトは、コンポーネントの小道具にマージされます。

これで、bindActionCreatorsの以前の動作とまったく同じになりますが、より洗練されたものになります。今、onClick={this.props.action.getProducts}の代わりにonClick={this.props.getProducts}を行うことができます。またaction.

行方不明、インポートではなく、直接関数を呼び出すよりも、componentDidMountで、あなたの問題を解決するために、今すぐ

import { getProducts } from '../actions/product'; 

に変更されます注意してください、あなたは何をする必要があります: -

componentDidMount() { 
    this.props.fetchProductsWithRedux(); 
} 

うまくいけば、これが役に立ちます。

1

で呼び出されていない機能function(dispatch){...}を返し

関連する問題