🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TypeScript

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

React.js

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

Q&A

解決済

1回答

2782閲覧

Reakt Hooksのstateの一部のみを更新したい

kawauso

総合スコア56

TypeScript

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

React.js

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

0グッド

0クリップ

投稿2021/01/21 23:30

前提・実現したいこと

React(TypeScript)とApexchartsを使用してボタンをクリックするとデータを1つずつ追加しチャートを更新していくアプリを開発中です。
下記のソースコードのように実装すると目標のものはできましたが、新しくnewSeries を作成してsetしている部分に引っ掛かりを感じています。

実現したいこと
seriesdataの配列だけを更新することはできないでしょうか?

該当のソースコード

typescript

1import Chart from 'react-apexcharts'; 2import { useState } from 'react'; 3 4export default function MyChart() { 5 const [options, setOptions] = useState({}); 6 const [series, setSeries] = useState([ 7 { 8 name: 'hogehoge', 9 data: [14.4, 3.5, 15.0, 4.2, 16.8, 18.1, 8.3], // ★直接ここだけを変更したい 10 }, 11 ]); 12 13 const add = () => { 14 var arr = series[0].data.slice(); 15 arr.push(Math.floor(Math.random() * 10) + 3); 16 17 // 現在は新しくstateを作成しなおしてsetしています 18 var newSeries = [{ 19 name: 'hogehoge', 20 data: arr, 21 }]; 22 23 setSeries(newSeries); 24 } 25 26 return ( 27 <> 28 <Chart options={options} series={series} type='line' /> 29 <style>{` 30 .chart { 31 width: 500px; 32 margin: auto; 33 }`} 34 </style> 35 <button onClick={add}>ランダム追加</button> 36 </> 37 ); 38}

試したこと

下記のようにコードを書き換えました。
seriesのdataは更新されますが、チャートは更新されませんでした。

typescript

1 2export default function MyChart() { 3 const [seriesData, setSeriesData] = useState([14.4, 3.5, 15.0, 4.2, 16.8, 18.1, 8.3]); 4 const [series, setSeries] = useState([ 5 { 6 name: 'hogehoge', 7 data: seriesData, 8 }, 9 ]); 10 11 const add = () => { 12 var arr = seriesData.slice(); 13 arr.push(Math.floor(Math.random() * 10) + 3); 14 15 setSeriesData(arr); 16 } 17}

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

React: v.17.0.1
Typescript: v.4.0.3
apexcharts: v.3.23.1

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

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

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

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

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

hoshi-takanori

2021/01/22 00:34

name と data を別々に更新したいなら、別々に useState すれば良いのでは。または useReducer を使うか。
kawauso

2021/01/22 01:02

Reactを勉強し始めて間もないためuseReducerは知りませんでした。また調べてみたいと思います。ありがとうございました。
guest

回答1

0

ベストアンサー

新しくnewSeries を作成してsetしている部分に引っ掛かりを感じています。

むしろ、そうしなければなりません。

Reactは基本的に、オブジェクトの変更をインスタンスの違いとして認識することで効率化する戦略を取っていますので、たとえオブジェクトの一部しか変更しない場合でも、オブジェクト全体を再作成して入れ替えるのが適切です。

投稿2021/01/21 23:54

maisumakun

総合スコア145963

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

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

maisumakun

2021/01/22 00:06

> seriesのdataの配列だけを更新することはできないでしょうか? そうしたいことに、どのような理由がありますか?
kawauso

2021/01/22 00:07

ご回答ありがとうございます。 React初学者のため違和感がありましたが、いただいた回答で納得できました。 ありがとうございました。
kawauso

2021/01/22 00:25

今回のコードでは省略していますが、optionsの方に複数オブジェクトが存在します。(chart,xaxis, title, など) たとえばseriesが増えるにつれてxaxisなども増やしていきたいのですが、その場合はxaxisだけを新たに作成して更新すればよいのでしょうか?それともchart,xaxis, title,などすべてを新たに作成しなければならないのでしょうか? 後者の場合、開発途中に元のoptionsにオブジェクトが追加・変更があったさいに面倒だと感じたのがこの質問を行った理由です。
maisumakun

2021/01/22 00:28

> たとえばseriesが増えるにつれてxaxisなども増やしていきたいのですが、その場合はxaxisだけを新たに作成して更新すればよいのでしょうか? はい、変更のあったオブジェクトと、その親(さらに親なども含む)だけで大丈夫です。変更のないオブジェクトはそのまま引き回して問題ありません。
kawauso

2021/01/22 01:01

ありがとうございました。開発を進めていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問