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

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

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

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

Q&A

解決済

1回答

1743閲覧

ReactにおけるStateとhistory.pushについて

2_34_koki

総合スコア67

React.js

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

0グッド

0クリップ

投稿2020/07/10 06:22

Reactを使った簡単なWebアプリを作成したいのですが,下記の工程でエラーが出てしまいます.

  • ユーザが選択を行う
  • 選択肢がなくなると,API通信を行い選択内容から結果を表示(この時に/resultページに移動)
  • エラー発生
Warning: Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state.
//選択ページで選択肢が1以下になった時にhandleSearchをよびたして移動. if (array.length <= 1) { handleSearch(); history.push("/result"); } //hooks const handleSearch = async () => { if (select.length < 1) return; const recip = await API.search(select); //API通信を行い,select内容を送信して結果を受け取る dispatch(get(recip.result));//(useReducerを使い,stateを更新) };

個人的な考えではありますが,stateが変更されるとレンダリングが走るのが関係しているのかなと思っています
解決策をご存知の方はどうかよろしくお願いします.

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

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

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

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

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

maisumakun

2020/07/10 06:30

if (array.length <= 1)のブロックは「どこに」書いていますか?
2_34_koki

2020/07/10 06:37

<Switch> <Route path="/result"> <Result result={result} /> </Route> <Route path="/"> <Menu state={state} mode={select.length} handleSearch={handleSearch} handleSelect={handleSelect} selectFilter={selectFilter} /> </Route> </Switch> 上記のようにページを分けており, Menuというコンポーネントに書いています.
maisumakun

2020/07/10 06:37

Menuというコンポーネント内で、どのように書いていますか?
2_34_koki

2020/07/10 06:42 編集

export const Menu: FC<Props> = ({ state, mode, handleSearch, handleSelect, selectFilter }) => { let history = useHistory(); const array = mode === 0 ? state.large : mode === 1 ? selectFilter(state.medium) : mode === 2 ? selectFilter(state.small) : []; if (array.length <= 1) { handleSearch(); history.push("/result"); } return ( <MenuList array={array} handleSelect={handleSelect} /> ); };
guest

回答1

0

ベストアンサー

関数コンポーネントの関数は、何度実行されるかわかりません。ということで、その中で副作用が発生することを行うのは適当ではありませんし、setStateすれば提示されたような警告も出ます。

useEffectの中で処理を行ってください。

typescript

1export const Menu: FC<Props> = ({ state, mode, handleSearch, handleSelect, selectFilter }) => { 2 3 const array = mode === 0 ? state.large : mode === 1 ? selectFilter(state.medium) 4 : mode === 2 ? selectFilter(state.small) : []; 5 6 const searchCond = array.length <= 1; 7 useEffect(() => { 8 if (array.length <= 1) { 9 handleSearch(); 10 } 11 }, [searchCond, handleSearch]) 12 13 14 return ( 15 <MenuList array={array} handleSelect={handleSelect} /> 16 ); 17};

投稿2020/07/10 06:45

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問