質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

3334閲覧

react、reduxのaction実行後のstateについて

seiyan0426

総合スコア16

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2018/06/07 15:53

前提・実現したいこと

react、redux、react-redux、redux-thunkを使用してWebAPIを実行し、結果を表示させるアプリを作っています。
APIを実行し、jsonにて返却されたデータを画面に表示させたいです。

発生している問題・エラーメッセージ

コンポーネントの検索ボタン押下時にAPIを実行し、JSONデータがstateにセットされるので、そのセットされた値を画面に表示させたいです。

action実行後にstateにセットされた値にアクセスする方法を教えてください。

該当のソースコード

JS

1// index.js 2import React from 'react'; 3import ReactDOM from 'react-dom'; 4import { Provider } from 'react-redux'; 5import Store from './store/store'; 6 7import DataExtract from './components/DataExtract'; 8 9const store = Store(); 10 11const render = () => ( 12 ReactDOM.render( 13 <Provider store={store}> 14 <div> 15 <DataExtract /> 16 </div> 17 </Provider>, 18 document.getElementById('app') 19 ) 20); 21 22render();

JS

1// components/DataExtract.js 2import React, { Component } from 'react'; 3import { 4 RaisedButton 5 } from 'material-ui'; 6import { bindActionCreators } from 'redux'; 7import { connect } from 'react-redux'; 8import assign from 'object-assign'; 9 10import * as actionDataExtract from '../actions/actionDataExtract'; 11 12class DataExtract extends Component { 13 constructor(props) { 14 super(props); 15 this.state = { 16 }; 17 } 18 componentDidMount() { 19 } 20 // 検索ボタン押下イベントハンドラー 21 onBtnSearchClick = (event) => { 22 // データ抽出実行 23 this.props.actions.getTrnSales(); 24 console.log(this.props); 25 26 ★★★ 27 this.props.actions.getTrnSales() を実行することによって、 28 セットされたthis.props.stateのデータをここで使用したい場合には、 29 どうすれば良いでしょうか??? 30 ★★★ 31 32 }; 33 render() { 34 return ( 35 <div style={{ display: "inline-block", verticalAlign: "top", marginTop: "5px" }}> 36 <RaisedButton 37 label="検索" 38 backgroundColor="#2962FF" 39 style={{ width: "85px" }} 40 labelStyle={{ color: "#fff", fontWeight: "bold", fontSize: "14px" }} 41 icon={<CachedIcon color={"#fff"} style={{ marginLeft: "0px" }} />} 42 labelPosition="after" 43 onClick={this.onBtnSearchClick} 44 /> 45 </div> 46 ); 47 } 48} 49 50 51const mapStateToProps = (state) => { 52 return { 53 state: state.ReducerDataExtract 54 }; 55}; 56 57const mapDispatchToProps = (dispatch) => { 58 return { 59 actions: bindActionCreators ( 60 assign({}, null, { 61 getTrnSales: actionDataExtract.getTrnSales, 62 }), dispatch 63 ) 64 }; 65}; 66 67export default connect( 68 mapStateToProps, 69 mapDispatchToProps 70)(DataExtract); 71

JS

1// reducers/reducerDataExtract.js 2import assign from 'object-assign'; 3 4import * as actionTypes from '../constants/actionTypes'; 5 6const initalState = { 7 isFetching: false, 8 items: [] 9}; 10 11const reducerDataExtract = (state = [initalState], action) => { 12 switch (action.type) { 13 case actionTypes.GET_TRNSALES_REQUEST: 14 return assign({}, state, { 15 isFetching: true, 16 items: [] 17 }); 18 19 case actionTypes.GET_TRNSALES_SUCCESS: 20 console.log(action.items); 21 return assign({}, state, { 22 isFetching: false, 23 items: action.items 24 }); 25 case actionTypes.GET_TRNSALES_FAILURE: 26 return assign({}, state, { 27 isFetching: false, 28 error: action.error 29 }); 30 default: 31 return state; 32 } 33}; 34 35export default reducerDataExtract; 36

JS

1// root.js 2import { combineReducers } from 'redux'; 3import ReducerDataExtract from './reducerDataExtract'; 4 5const rootReducer = combineReducers({ 6 ReducerDataExtract 7}); 8 9export default rootReducer;

JS

1// actions/actionDataExtract.js 2import axios from 'axios'; 3 4import * as actionTypes from '../constants/actionTypes'; 5 6const getTrnSalesRequest = () => { 7 return { 8 type: actionTypes.GET_TRNSALES_REQUEST 9 }; 10}; 11 12const getTrnSalesSuccess = (json) => { 13 return { 14 type: actionTypes.GET_TRNSALES_SUCCESS, 15 items: json 16 }; 17}; 18 19const getTrnSalesFailure = (error) => { 20 return { 21 type: actionTypes.GET_TRNSALES_FAILURE, 22 error 23 }; 24}; 25 26export const getTrnSales = () => { 27 return (dispatch) => { 28 dispatch(getTrnSalesRequest()) 29 return axios.get(`http://localhost:8080/det/trnsales`) 30 .then(res => 31 dispatch(getTrnSalesSuccess(res.data)) 32 ).catch(err => 33 dispatch(getTrnSalesFailure(err)) 34 ) 35 }; 36};

JS

1// store/store.js 2import { createStore, applyMiddleware } from 'redux'; 3import rootReducer from '../reducers/root'; 4import thunk from 'redux-thunk'; 5 6export default function configureStore() { 7 return createStore( 8 rootReducer, 9 applyMiddleware(thunk) 10 ); 11};

試したこと

コンポーネントのrenderメソッドを確認したところaction実行前後にてログが出力されており、実行後のstateにはデータが入っていることを確認しました。
render() {
console.log(this.props);
return (

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

コンポーネントの検索ボタン押下時にAPIを実行し、JSONデータがstateにセットされるので、そのセットされた値を画面に表示させたいです。

とのことですが、render() の中で、 this.props.state.items の内容を
何らかのHTML要素として展開すればよいかと思います。

具体的には、以下にて、動くようにしたものを上げておきましたので、もしよければ手元に clone してみてください。

https://github.com/jun68ykt/q130069

ただし、以下の 4点で手を加えています。

(1) CachedIcon が質問の中になかったので、material のRaisedButtonではなく、単なるテキストをクリック対象にしました。

(2) API がどのようなレスポンスを返すのか分からなかったので、以下のような JSONファイル

json

1[ 2 { "id": 1, "name": "Foo" }, 3 { "id": 2, "name": "Bar" }, 4 { "id": 3, "name": "Baz" } 5]

を作っておいて、これを返すようにしました。

(3) クリック時に発生する reduxアクションと state の変化を開発ツールのConsole で見るために、 redux-logger を追加しました。

(4) constants/actionTypes.js が質問に含まれていなかったので、こちらで適当なものを作りました。

上記のレポジトリに上げたものを手元で動かすと、初期表示画面は以下のようになります。

イメージ説明

「ここをクリック」のリンクをクリックすると、以下のようになります。

イメージ説明

上記の画面キャプチャから、GET_TRNSALES_REQUEST が発行されて成功し、
GET_TRNSALES_SUCCESS が発行され、this.props.state.items
内容が <li> として表示されているのが分かります。

以上、参考になれば幸いです。

投稿2018/06/08 08:41

編集2018/06/08 10:22
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seiyan0426

2018/06/09 23:53

jun68ykt 様 実際に動くものまで提供いただきありがとうございます、感動いたしました。解決いたしました。
jun68ykt

2018/06/10 00:53 編集

seiyan0426さん 解決されたとのことで、よかったです! 以下、参考までの補足です。 今現在、reactとreduxを使った開発プロジェクトに従事していますが、 そこでは、非同期処理と redux の連携として、redux-thunkのかわりに redux-saga を使っています。 手前味噌で恐縮ですが、Qiitaの記事 Reactサンプル:redux-sagaとreact-router v4でWebAPIの結果に応じて画面遷移させる。(前編) https://qiita.com/jun68ykt/items/f2dc1f7c076c76188834 Reactサンプル:redux-sagaとreact-router v4でWebAPIの結果に応じて画面遷移させる。(後編) https://qiita.com/jun68ykt/items/541cc8247900e126ac5b にて、redux-saga による簡単なフロント開発事例を投稿していますので、 もしよかったら、参考までにご覧ください。 (この回答と同様にGitHub にソースを公開しています。)
seiyan0426

2018/06/18 22:02

色々ありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問