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

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

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

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

Q&A

解決済

1回答

3754閲覧

useEffectが発火しない

dyekv

総合スコア128

React.js

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

0グッド

0クリップ

投稿2020/04/17 02:25

やりたいこと

API経由で取得したJsonデータをテーブル形式で表示させたいです

画面上で表示させる項目や表示させる行数を指定できるようにしたいです

APIやルーティングはLaravelで作っています

ソース

js

1import React, { useState, useEffect } from 'react'; 2import ReactDOM from 'react-dom'; 3 4const Example = () => { 5 const [param, setParam] = useState([]); 6 const [lines, setLines] = useState(3); 7 const [tableData, setTableData] = useState([]); 8 const [loading, setLoading] = useState(false); 9 10 useEffect(() => { 11 const get = async () => { 12 // 実際はparamとlinesを渡してAPI経由でデータを取得しています 13 const sampleData = [ 14 { 'id': 1, 'name': 'taro', 'age': 16 }, 15 { 'id': 2, 'name': 'hanako', 'age': 15 }, 16 { 'id': 3, 'name': 'satoshi', 'age': 22 }, 17 { 'id': 4, 'name': 'kaori', 'age': 19 }, 18 ] 19 await setTableData(sampleData) 20 setLoading(true) 21 console.log('useEffect was called') 22 } 23 get() 24 }, [lines, param]) 25 26 const changeParam = (target) => { 27 const arr = param; 28 const index = arr.findIndex((v) => v == target); 29 if (index == -1) { 30 arr.push(target); 31 setParam(arr); 32 } else { 33 arr.splice(index, 1); 34 setParam(arr); 35 } 36 console.log('param >> ', param) 37 } 38 39 return ( 40 <div> 41 <p>表示行数</p> 42 <input type='number' value={lines} onChange={(e) => { setLines(e.target.value) }} /> 43 <input type='checkbox' onChange={() => { changeParam('id') }} />ID 44 <input type='checkbox' onChange={() => { changeParam('name') }} />Name 45 <input type='checkbox' onChange={() => { changeParam('age') }} />Age 46 {loading && <TableEample data={tableData} />} 47 </div> 48 ) 49} 50 51 52export default Example; 53

現象

初回ロード時とlinesの値が変わったときはconsoleに'useEffect was called'と表示されます

チェックボックスをクリックしたときにparamの値は変わっていますがuseEffectが呼ばれません

チェックボックスをクリックしたタイミングでデータを更新できるようにしたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

changeParamの中で、arrを破壊的に変更してしまっているため、arrそのものは同じインスタンスとなり、useEffectに変更が認識されません。

最初のconst arr = param;const arr = param.slice();として、どんな変更をしてもインスタンスが入れ替わるようにしておきましょう。

投稿2020/04/17 02:32

maisumakun

総合スコア145184

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

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

dyekv

2020/04/17 02:38

とても早い回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問