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

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

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

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

React.js

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

Q&A

解決済

2回答

537閲覧

React stateを変更する関数をまとめたい

satodesu

総合スコア38

TypeScript

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

React.js

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

1グッド

1クリップ

投稿2020/03/27 06:13

編集2020/03/27 07:31

stateで upperCase、genderCase、groupCaseを管理しています。型は3つともboolean型です。
ON/Offを切り替えるスイッチがあり各スイッチを切り替えるとその各stateを変更する関数が呼ばれてtrueだったらfalseになりfalseだったらtruになります。
3つの関数はstateが違うだけで処理内容は同じです。
この処理を一つの関数にまとめたいのですがうまくいきません。
下記に自分が処理をまとめた関数を書いたのですがうまくいきませんでした。
わかる方がいましたら教えて欲しいです

// 3つの関数を一つにまとめてみた。 // stateを引数としてもらいそのstateを変更するようにしたい。 const CaseChange = (state: boolean) => { if (state) { setState({ ...state, state: false }); } else { setState({ ...state, state: true }); } };
interface IState { upperCase: boolean; genderCase: boolean; groupCase: boolean; } const [state, setState] = useState<IState>({ upperCase: false, genderCase: false, groupCase: false, }); const onUpperCaseChange = () => { if (state.upperCase) { setState({ ...state, upperCase: false }); } else { setState({ ...state, upperCase: true }); } }; const onGenderCaseChange = () => { if (state.genderCase) { setState({ ...state, genderCase: false }); } else { setState({ ...state, genderCase: true }); } }; const onGroupCaseChange = () => { if (state.groupCase) { setState({ ...state, groupCase: false }); } else { setState({ ...state, groupCase: true }); } };
whiwhdiw👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは、satodesuさん。

呼び出し元の処理がちょっと見えないので動くかどうか検証しきれませんが、以下のコードでどうでしょうか?

interface IState { upperCase: boolean; genderCase: boolean; groupCase: boolean; } type StateKeys = "upperCase" | "genderCase" | "groupCase"; const changeState = useCallback( (key: StateKeys) => { setState({ ...state, ...{ [key]: !state[key] } }); }, [state] ); // call changeState('upperCase') // true changeState('upperCase') // false changeState('genderCase') // false

投稿2020/03/27 07:46

jtemplej

総合スコア61

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

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

satodesu

2020/03/27 08:01

ありがとうございます!! なぜuseCallBackを使っているのでしょうか?? 普通の関数ではダメなのでしょうか?
jtemplej

2020/03/27 08:05

>なぜuseCallBackを使っているのでしょうか?? >普通の関数ではダメなのでしょうか? だめではないですよー。 ただ上のコードでは`state`の値がキャプチャされてしまい。ずっと同じ値になるはずです。 (ならなかったらすいませんw) なので、`state`が変更された場合でも対応出来るように`useCallBack`を使っただけです。 呼び出し元の状況等にもよるので、あくまでも一例として捉えていただけると助かります。
satodesu

2020/03/27 08:06

<Switch checked={state.upperState} onChange={onUpperCaseChange} />
satodesu

2020/03/27 08:06

呼び出し元は上記のようになっています。
satodesu

2020/03/27 08:08

ありがとうございます!! 根本的にuseCallbackがどのようなものかが分かっておらずすいません
jtemplej

2020/03/27 08:14

コードありがとうございます! しばしおまちください。
whiwhdiw

2020/03/27 08:18

親で関数を定義していて子コンポーネンで呼び出している感じです
jtemplej

2020/03/27 08:20

``` const changeState = (key: StateKeys) => () => { setState({ ...state, ...{ [key]: !state[key] } }); }; <Switch checked={state.upperState} onChange={changeState('upperCase')} /> ``` これでどうでしょうか?
whiwhdiw

2020/03/27 08:25

上記のchangeState関数の中にif文を書いてtrue/falseに書き換えればいいということでしょうか?
jtemplej

2020/03/27 08:27

いえ、changeState関数の引数にそれぞれのkey(upperCase| genderCase| groupCase)を呼び出せば期待した動きになると思います。 以下のような感じです。 <Switch checked={state.upperState} onChange={changeState('upperCase')} /> <Switch checked={state.genderCase} onChange={changeState('genderCase')} /> <Switch checked={state.groupCase} onChange={changeState('groupCase')} />
satodesu

2020/03/27 08:57

いけました。ありがとうございます
guest

0

コードありがとうございます。

全容わかりました、しばしおまちを。

投稿2020/03/27 08:14

jtemplej

総合スコア61

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問