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

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

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

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

React.js

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

Q&A

1回答

1238閲覧

React Stateが変わっているが画面が変わらない

satodesu

総合スコア38

TypeScript

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

React.js

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

1グッド

1クリップ

投稿2020/03/29 12:53

編集2020/03/31 05:26

やりたいこと

switchでon/offを切り替えた時にonChange関数が呼ばれます。
データの保存に成功した時にstateの値を書き変えて画面上でswitchをON/OFF切り替えたいのですが
stateの値は書き換わっているのに画面上ではswitchは切り替わっていなく、リロードをすれば切り替わっています。

⑴の関数にしてみたところ画面上でもON/OFF切り替えることはできますが⑵だとリロードしないとON/OFFが切り替わりません。
どうしてなのでしょうか?

⑴ // switch切り替わる const onChange = () => { setState({ ...state, switch: !state.switch}); }
⑵ // これだとswitchが切り替わらない const Required = window.gon.switch; interface IState { switch: boolean; message: string; } const index:FC = () => { const [state, setState] = useState<IState>({ switch: Required, message: '' }); const onChange = () => { Axios.post('/user', toJsonBody({ param: !state.switch, })) .then(() => { setState({ ...state, switch: !state.switch}); succsessMessage(SAVEMESSSAGE) }) .catch(() => handleError(ERROR)); } <Switch checked={state.switch} onChange={onChange} /> ``` 追記 switchコンポーネントはマテリアルUIを使っています。
whiwhdiw👍を押しています

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

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

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

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

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

hoshi-takanori

2020/03/29 21:00

Axios.post の結果を確認しましたか? then の中で console.log してみるとか。
satodesu

2020/03/30 01:18

then()の中の処理は呼べれています
satodesu

2020/03/30 01:19

.catchの処理は呼ばれずthem()の処理が呼ばれています
hoshi-takanori

2020/03/31 07:33

successMessage は何をしてますか?
guest

回答1

0

.thenの中身は非同期実行ですが、state呼び出し時点で固定されてしまうので、遅延実行された.thenの中ではsetStateで直接stateを使うような処理はうまく動かないことが考えられます。

setState(state => ({ ...state, switch: !state.switch}))のように、変更関数を渡す形にしてみたらどうなりますでしょうか。

投稿2020/03/30 06:24

maisumakun

総合スコア146018

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

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

satodesu

2020/03/30 13:21

const index:FC = () => { const [state, setState] = useState<IState>({ switch: Required, message: '' }); const onChange = () => { Axios.post('/user', toJsonBody({ param: !state.switch, })) .then(() => { setState(state => ({ ...state, switch: !state.switch})) succsessMessage(SAVEMESSSAGE) }) .catch(() => handleError(ERROR)); }
satodesu

2020/03/30 13:22

stateのとこでarameter 'state' implicitly has an 'any' type.というエラーになってしまいます。 上記の書き方であっていますでしょうか?
maisumakun

2020/03/30 13:39

TypeScriptだったんですね…「setState((state: IState) => ({ ...state, switch: !state.switch}))」のように型を明記してみたら解決しますか?
satodesu

2020/03/30 13:54

上記のエラーは解決しましたが結局変割らなかったです
satodesu

2020/03/30 13:54

変わらなかったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問