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

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

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

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

React.js

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

Q&A

解決済

2回答

363閲覧

reducerのfunctionを動かしたい(redux)

yamady

総合スコア176

Redux

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

React.js

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

0グッド

0クリップ

投稿2018/06/28 15:42

編集2018/06/30 08:33

こちらの質問で、Reduxを通してエラーモーダルを表示させるための質問をしたのですが、やはり上手くいかなかったので、再度質問させていただきます。

エラー

onError is not found.

Reducerの中にonError()を書いていないので当たり前ではあるのですが、Reducerの中にAlert文を書くのは不整合であるように感じます。
Reducerで起こしたonError()アクションをどのようにすれば、View上のonError()を起こすのに繋がるのかが知りたいところです。

ソースコード

actions

JavaScript

1・・・ 2export const userCreate = ({ user }) => { 3 return (dispatch) => { 4 firebase.database().ref(`/users/`) 5 .set({ 6 user 7 }) 8 .then(() => { 9 dispatch({ type: 'user_save_success' }); 10 }); 11 }) 12 .catch(err => { 13 dispatch({ type: 'USER_SAVE_FAIL' }); 14 }); 15 } 16} 17・・・

reducer

JavaScript

1export default (state = initialState, action) => { 2 switch(action.type) { 3 case 'USER_UPDATE': 4 return { ...state, [action.payload.prop]: action.payload.value }; 5 case 'USER_SAVE_SUCCESS': 6 return { initialState, successModal: true }; 7 case 'USER_SAVE_FAIL': 8 return { ...state, failedModal: true }; 9 default: 10 return state; 11 } 12};

View(UserCreate.js)

JavaScript

1class CreditCard extends React.Component { 2 state = { 3 showModal: false, 4 error: null 5 }; 6 7 static navigationOptions = ({ navigation }) => { 8 const { params = {} } = navigation.state; 9 return { 10 headerTitle: 'ユーザーの新規作成', 11 headerLeft: ( 12 <TouchableOpacity 13 onPress={()=> navigation.goBack()} 14 style={styles.headerIcon} 15 > 16 <Icon name='chevron-left' size={28} style={{color: '#fff'}}/> 17 </TouchableOpacity> 18 ), 19 headerRight: ( 20 <TouchableOpacity 21 onPress={() => params.handleSave()} 22 > 23 <Text style={styles.headerBtn}>{I18n.t('save')}</Text> 24 </TouchableOpacity> 25 ), 26 headerStyle: { 27 backgroundColor: Theme.PRIMARY, 28 }, 29 headerTitleStyle: { 30 color: '#fff', 31 fontWeight: 'bold' 32 } 33 }; 34 }; 35 36 onButtonPress() { 37 const { firstName, lastName } = this.props; 38 39 this.props.userCreate({ firstName, lastName }); 40 } 41 42 componentDidMount() { 43 this.props.navigation.setParams({ handleSave: this.onButtonPress.bind(this) }); 44 } 45 46 render() { 47 if(this.props.error === true) { 48 Alert.alert( 49 'エラーが発生しました', 50 [ 51 {text: 'キャンセル', onPress: () => console.log('Cancel Pressed'), style: 'cancel'}, 52 {text: 'はい', onPress: () => this.onConfirmReport()}, 53 ], 54 { cancelable: false } 55 ) 56 } 57 58 return ( 59 <View> 60 <TextInput 61 value={this.props.firstName} 62 onChangeText={value => this.props.userUpdate({ prop: 'firstName', value })} 63 /> 64 <Input 65 value={this.props.lastName} 66 onChangeText={value => this.props.userUpdate({ prop: 'lastName', value })} 67 /> 68 </View> 69 ); 70 } 71} 72 73const mapStateToProps = (state) => { 74 const { firstName, lastName } = state.userForm; 75 76 return { firstName, lastName }; 77}; 78 79export default connect(mapStateToProps, { 80 userUpdate, userCreate 81})(UserCreate);

ここでいうUserCreate.jsのonErrorを動かしたいです。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

前回の質問の続きですね。もう少し具体的に書きます。
とはいえ、ざっくり回答ですが、ご参考までにどうぞ!

action

export const userCreate = ({ user }) => { return (dispatch) => { // 省略 }) .catch(error => { dispatch({ type: 'USER_SAVE_FAIL', payload: error, error: true, // オプション meta: {} // オプション }); }); } }

参考:https://github.com/redux-utilities/flux-standard-action - 「Flux Standard Action
」というaction objectの形式のスタンダードみたいなものが提唱されていて、この形式に従ってライブラリーを作るライブラリーオーサーもそれなりに多いようです。typeとpayloadは必須。errorとmetaプロパティーは任意という感じの形式ですね。

reducer

// usersReducer.js const initialState = { users: [], isFetching: false, //API通信中かどうか(読み込み中かどうか) error: null // API通信周りのerrorオブジェクトが入る } export default (state = initialState, action) => { // 省略 // action.typeやaction.errorに応じて、stateを変える }

参考:https://github.com/reduxjs/redux/blob/master/examples/real-world/src/reducers/index.js#L16 - リンク先コードのようにerror用のreducerを別途に用意するパターンも有り。

component / container

//省略 // this.props.isFetchingがtrueならローディングアイコンを表示するなど // this.props.errorがnullじゃない場合は、アラートを表示したり、通信実行のリトライボタンを表示するなど

投稿2018/06/29 00:39

編集2018/06/29 00:43
HayatoKamono

総合スコア2415

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

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

yamady

2018/06/29 02:27

Hayatoさん、いつもありがとうございます!迅速なご回答で非常に助かっています! (理解が悪く、なんどもお手数おかけします...汗) Reducerからはstateの変更を送り返すことができるということですよね。別件の質問になると思うのですが、受け取ったView側でファンクションを条件によって押したり押さなかったりできる方法ってどれが正しいのでしょうか。 if(isFetching: true) { ・・・ } とかだとエラーになってしまうんですよね。汗
HayatoKamono

2018/06/29 02:30

こんにちは!すみません、別件の質問の意味がちょっとわからないです!
yamady

2018/06/29 02:34

早速ありがとうございます! 一旦整理して再ポストします。!
yamady

2018/06/29 09:14

//省略 // this.props.isFetchingがtrueならローディングアイコンを表示するなど // this.props.errorがnullじゃない場合は、アラートを表示したり、通信実行のリトライボタンを表示するなど これって componentDidMount() { }の中に書くのが正解なのでしょうか。 理解が悪くすみません。
yamady

2018/06/29 09:26

ソースコードを更新してみたのですが、上手く通りませんでした(汗)
HayatoKamono

2018/06/30 08:18 編集

ライフサイクルメソッドの中ではなく、renderメソッドの中で、ですね。(追記- ライフサイクルメソッドでも適切なライフサイクルメソッドの中であればOKですが、render内がひとまず手っ取り早いかなと)
yamady

2018/06/30 02:36

ありがとうございます! ``` render() { if(this.props.failedModal === true) { Alert.alert( 'エラーが発生しました', [ {text: 'キャンセル', onPress: () => console.log('Cancel Pressed'), style: 'cancel'}, {text: 'はい', onPress: () => this.onConfirmReport()}, ], { cancelable: false } ) } console.log('&&&&&&&'); return ( ``` これでやってみたのですが、reduxが通ってきたあとに機能してくれませんでした。
HayatoKamono

2018/06/30 04:10 編集

「これでやってみたのですが、reduxが通ってきたあとに機能してくれませんでした。」について、具体的に説明すると、どういう状況でしょうか? 説明が難しい、または苦手な場合は、必要なコードを全部載せてもらった方が早いかもしれません。
yamady

2018/06/30 08:26

ご回答いただきまして、本当にありがとうございます! 説明が分かりづらくて申し訳ございません。 こちら、質問欄に再度記述させていただきます(_ _)
yamady

2018/06/30 08:26

ご回答いただきまして、本当にありがとうございます! 説明が分かりづらくて申し訳ございません。 こちら、質問欄に再度記述させていただきます(_ _)
HayatoKamono

2018/07/01 01:18

追記されたコード拝見したのですが、UserCreate.js内でthis.props.errorを参照出来る理由が掲載されている限られたコードから見えてこないです。なぜ、参照出来るのですか?
HayatoKamono

2018/07/01 01:35

「ここでいうUserCreate.jsのonErrorを動かしたいです。」← そもそも、onErrorなるものがもはや見当たらないです。。。
yamady

2018/07/01 14:16

ありがとうございます。一旦、すべて整理し直します(_ _)
yamady

2018/07/03 14:10

Hayatoさん、ありがとうございます。色々と模索した結果、本質的ではありませんが、解決することができました(_ _)
HayatoKamono

2018/07/04 11:25

おー、そう解決しましたか。そうじゃない感はありますが、とりあえず前に進むことは大事ですからね、その勢いで頑張ってください!
yamady

2018/07/05 03:26

Hayatoさん、いつも本当にありがとうございます! 課題がここで解決する度にReact愛が深まっていきます!^^
guest

0

JavaScript

1 .catch(err => { 2 dispatch({ type: 'user_save_failed' }); 3 Alert.alert( 4 '失敗しました', 5 '保存に失敗してしまいました。', 6 [ 7 {text: 'OK', onPress: () => console.log('OK Pressed')}, 8 ], 9 { cancelable: false } 10 )

本質的な解決ではありませんが、reduxの中に関数を書くことで何とかやりたいことは実現できました。

投稿2018/07/03 14:11

yamady

総合スコア176

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問