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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

解決済

1回答

383閲覧

React(redux): reducerの中でstateを更新する方法を知りたい

nanase21

総合スコア144

Redux

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

0クリップ

投稿2020/10/27 22:59

編集2020/10/29 13:27

困っていること

react typescriptでstateの管理はreduxでしているのですがstateが更新できなくて困っています。
本来ならreact.jsで作ったものを勉強でtypescriptで作り直しているので更新できるはずなのですが...

ts

1import { SING_IN, SING_OUT } from './types'; 2import { initialState } from './initial_state'; 3 4const sessionReducer = { 5 currentUser(state = initialState, action: any) { 6 switch (action.type) { 7 case SING_IN: 8 return { 9 ...state, 10 ...action.payload 11 }; 12 case SING_OUT: 13 return { 14 ...state, 15 ...action.payload 16 }; 17 default: 18 return state; 19 } 20 } 21} 22export default sessionReducer;

実現したいこと

action.payloadにはちゃんと値は入ってきているのでstateを更新方法を知りたいです。
更新したいcaseSIGN_INで、SIGN_INの中に処理は入ってきています。

追記

ts

1// actionです 2export const signInAction = (userState: any) => { 3 return { 4 type: SING_IN, 5 payload: { 6 user: { 7 userId: userState.userId, 8 firstName: userState.firstName, 9 lastName: userState.lastName 10 } 11 } 12 } 13};

ts

1// initial_stateです 2export interface State { 3 user: { 4 userId: string 5 firstName: string 6 lastName: string 7 } 8} 9 10export const initialState: State = { 11 user: { 12 userId: "", 13 firstName: "", 14 lastName: "" 15 } 16}

ts

1const dispatch = useDispatch(); 2// container 3<div className="form-control"> 4 <input type="submit" onClick={() => dispatch(signInAction( 5 { userId: 'xxx', firstName: 'test', lastName: 'user' }))} /> 6</div> 7

ts

1import { createStore, applyMiddleware, compose } from 'redux'; 2import thunk from "redux-thunk" 3import rootReducer from './reducers/root_reducers'; 4 5const storeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; 6 7const store = createStore( 8 rootReducer, 9 storeEnhancers(applyMiddleware(thunk)) 10); 11 12export default store

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

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

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

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

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

maisumakun

2020/10/27 23:25

Reducerのコードではなく、それを「呼ぶ側」の問題という可能性はないのでしょうか? (呼ぶ側のコードがないのでなんとも言えない状況です)
Hogeike

2020/10/28 03:07 編集

上に同じく、Reducerのコードは問題なさそうに見えます。 多分、呼ぶ側の引数が誤っているのでは?
nanase21

2020/10/29 12:44

ご教示頂きありがとうございます。 返信が遅くなり申し訳ございません。 一連処理のコードを追記させて頂きました。 まだ、可能であればご教示いただけると嬉しいです。
guest

回答1

0

自己解決

原因を特定できました。
input typeがsubmitだったためsubmitするとリロードされてしまいその結果、更新されたstateが初期化されていました...

投稿2020/10/29 13:48

nanase21

総合スコア144

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問