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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

React.js

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

Q&A

解決済

1回答

286閲覧

axiosから取得したJSONオブジェクトから表コンポーネント(react-spreadsheet-grid)行を作成したい。

_ui_luz

総合スコア2

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

React.js

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

0グッド

0クリップ

投稿2023/12/12 16:18

編集2023/12/13 00:53

実現したいこと

axiosから取得したJSONオブジェクト(バックエンドで.jsonファイルをjson.load(file)したもの)をReactで扱い、内容をレンダリングできるようにしたい。

前提

React+TypeScriptで開発を行っています。
react-spreadsheet-gridというライブラリでExcelライクな表画面を作成しています。
axiosで動的に取得したJSONオブジェクトから、列情報(column)、行情報(row)を取得しフロントエンドでレンダリングをしたいです。

列名(Colum)は、オブジェクトで定義します。基本的にその列オブジェクトをライブラリのコンポーネントの"column"プロパティに渡すと、列名がレンダリングされます。

以下の場合で①だと問題なくレンダリングされますが、
②の場合だとレンダリングがされません(何も表示されない)

① 行オブジェクトの定義をハードコーディングした場合
② axiosでJSONオブジェクトを取得(response.data)して行情報の内容をマッピングして新しく作成したオブジェクトをコンポーネントのプロパティに渡した場合

該当のソースコード

以下の違いが判りません。はじめから定義したオブジェクトはレンダリングに反映されますが、配列に追加(push)したオブジェクトはレンダリングに反映されません。

レンダリング方法は一旦置いておいて、レンダリングに反映されないのはこの違いのせいだと考えていますが、調べても試行してもわからないためご存じでしたらご教示いただけますと幸いです。
なぜレンダリング方法はいったん置いておくかというと、どちらもconsole.logで直に確認すると[Onject Object]で、同じpopertyに対し一方はレンダリングされ、一方はされないので、Inputのオブジェクトの扱い方が悪いと考えました。

①はじめから定義(初期化)したオブジェクト(column)→レンダリングされる[Object Object]

TypeScript

1const column:any[] = [{id:"1",title:"hoge"}]; 23<DataSheetGrid 4 value={data} 5 onChange={setData} 6 columns={column} ← 7 />

②pushで1つずつ追加したオブジェクト(column)→レンダリングされない[Object Object]

TypeScript

1const column:any[] = []; 2 3const response = await axios.get(endpoint) 4Object.keys(response.data[0]).map((key,index)=>{ 5 column.push({id:index, title: key }) 6}) 7 89<DataSheetGrid 10 value={data} 11 onChange={setData} 12 columns={column} ← 13 />

試したこと

・JSON.stringify(res.data)
・setData(JSON.parse(JSON.stringify(res.data));

補足情報(FW/ツールのバージョンなど)

React
TypeScript
react-spreadsheet-grid

何卒よろしくお願いいたします。

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

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

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

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

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

_ui_luz

2023/12/13 00:17 編集

ご回答ありがとうございます。 >新しい配列を作って state を更新する必要があります。 こちらについては存じ上げており、以下についても試しましたが、やはり動作していません。 ```Typescript const [colmns, setColumns]=useState<any[]>([]) const response = await axios.get(endpoint) Object.keys(response.data[0]).map((key,index)=>{  setColumns(...colmns,{id:index, title: key }) }) ``` もしくは ```Typescript const [colmns, setColumns]=useState<any[]>([]) const column:any[] = []; const response = await axios.get(endpoint) Object.keys(response.data[0]).map((key,index)=>{  column.push({id:index, title: key }) }) setColumns(colmn); ``` useEffectで依存関係をcolumnsに持たせて変更時にconsole.logしていますが、値は格納されているようです。 console.log(columns) → [Object Object],[Object Object],.. console.log(JSON.stringify(colmns))→意図した構造と文字列 申し訳ありませんが引き続きよろしくお願いいたします。
hoshi-takanori

2023/12/13 02:31

useEffect の使い方に問題がありそうですが、コードが断片的なので回答が難しいですね。 コンポーネント全体のコード(ビルドが通るなら多少省略されても構いませんが)をお示しください。 その際、コメント欄ではなく、質問を編集していただけれぼ幸いです。
guest

回答1

0

自己解決

お世話になっております。

すみません、やはりsetStateの更新の仕方に問題があったようです。
すでにstateとは別の配列を用意し、その配列で更新しているつもりでしたが、
さらに新しい配列にコピーした後、setStateに渡したところ、stateが更新されオブジェクトがレンダリングできるようになりました。

Typescript

1const [colmns, setColumns]=useState<any[]>([]) 2var column:any[] = []; 3const response = await axios.get(endpoint) 4Object.keys(response.data[0]).map((key,index)=>{ 5 6 column.push({id:index, title: key }) ; 7 8}) 9const newcolum = column ; 10setColumns(newcolmn); 11

たくさんの閲覧、ご回答誠にありがとうございました。

投稿2023/12/13 03:00

_ui_luz

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問