質問編集履歴

3

コメントの付与

2022/03/19 10:28

投稿

pierogi.user
pierogi.user

スコア19

test CHANGED
File without changes
test CHANGED
@@ -15,6 +15,7 @@
15
15
  import {useContext, createContext, useState, useEffect, useRef} from "react";
16
16
  import {io, Socket} from "socket.io-client";
17
17
 
18
+ //console.logでの日時表示用の関数
18
19
  const current_time_readable = () => {
19
20
  let date_obj = new Date();
20
21
  return `${date_obj.getUTCFullYear()}-${('0' + (date_obj.getUTCMonth() + 1)).slice(-2)}-${('0' + date_obj.getUTCDate()).slice(-2)} ${('0' + date_obj.getUTCHours()).slice(-2)}:${('0' + date_obj.getUTCMinutes()).slice(-2)}:${('0' + date_obj.getUTCSeconds()).slice(-2)}`;
@@ -24,14 +25,19 @@
24
25
  children: ReactNode;
25
26
  }
26
27
 
28
+ //Contextの作成。contextDataを他のコンポーネントへ渡す
27
29
  const DataContext = createContext({
28
30
  contextData: [] as Array<any>,
29
31
  });
30
32
 
33
+ //socketオブジェクトを作成して通信を開始。
31
34
  const socket: Socket = io("http://***.***.***.***");
32
35
 
33
36
  const DataProvider = (props: Props) => {
37
+ //他のコンポーネントへ渡すcontextData変数をuseStateで作成
34
38
  const [contextData, setContextData] = useState<Array<any>>([]);
39
+
40
+ //データの一時保存、更新用の変数をuseRefで作成
35
41
  let socketData = useRef<Array<any>>([]);
36
42
 
37
43
  useEffect(() => {
@@ -40,32 +46,54 @@
40
46
  console.log(e);
41
47
  });
42
48
 
49
+ //初期データ受信用のsocketイベント
43
50
  socket.on('initial_data_to_browser', (data) => {
51
+ //受信データをsocketDataへ保存
44
52
  socketData.current = data;
53
+
54
+     //useRef変数の確認表示
45
55
  console.log('initialData');
46
56
  console.log(socketData.current);
57
+
58
+    //contextDataへsocketDataを保存
47
59
  setContextData(() => socketData.current);
60
+
61
+ //contextDataの確認表示(ステートの確認表示)
48
62
  console.log('stateData');
49
63
  console.log(contextData);
50
64
  });
51
65
 
66
+ //新規データ受信用のsocketイベント
52
67
  socket.on('test_emit_10s', (data) => {
68
+           //受信時間の表示
53
69
  console.log(`${current_time_readable()} | test_data received`);
70
+
71
+ //古いデータを1つだけ削除
54
72
  socketData.current.shift();
73
+
74
+ //最新データを追加
55
75
  socketData.current.push(data);
76
+
77
+ //データの更新結果の確認表示
56
78
  console.log('socketData');
57
79
  console.log(socketData.current);
80
+
81
+ //contextDataへ更新結果を保存
58
82
  setContextData(socketData.current);
83
+
84
+ //contextDataの確認表示(ステートの確認表示)
59
85
  console.log('contextData');
60
86
  console.log(contextData);
61
87
  });
62
88
 
63
89
  return () => {
90
+ //コンポーネントがアンマウントされた時にsocket通信を終了
64
91
  socket.disconnect()
65
92
  };
66
93
  }, []);
67
94
 
68
95
  return (
96
+ //他のコンポーネントへの出力としてcontextDataを設定
69
97
  <DataContext.Provider value={{contextData}}>
70
98
  {props.children}
71
99
  </DataContext.Provider>
@@ -85,6 +113,7 @@
85
113
  import {useData} from "../../context/dataContext";
86
114
  import {chartDataType} from "../../types/chartDataType";
87
115
 
116
+ //表示データに現在時刻を付与するための関数
88
117
  const current_time_readable = () => {
89
118
  let date_obj = new Date();
90
119
  return `${date_obj.getUTCFullYear()}-${('0' + (date_obj.getUTCMonth() + 1)).slice(-2)}-${('0' + date_obj.getUTCDate()).slice(-2)} ${('0' + date_obj.getUTCHours()).slice(-2)}:${('0' + date_obj.getUTCMinutes()).slice(-2)}:${('0' + date_obj.getUTCSeconds()).slice(-2)}`;
@@ -96,9 +125,12 @@
96
125
 
97
126
  export const ChartCard: VFC<Props> = (props) => {
98
127
  const {dataName} = props;
128
+
129
+ //contextDataをchartDataとして受け取り
99
130
  const chartData = useData().contextData;
100
131
  const propNameData: Array<chartDataType> = [];
101
132
 
133
+ //chartDataから特定の項目のデータを抽出して新たに配列を作成
102
134
  if (chartData) {
103
135
  chartData.forEach((data) => {
104
136
  propNameData.push({
@@ -111,6 +143,7 @@
111
143
  return (
112
144
  <>
113
145
  {
146
+ //データの表示
114
147
  propNameData ? (propNameData.map((data: any) => (
115
148
  <Heading as="h1" key={data.unixTime}>{`${current_time_readable()} | ${data.unixTime} | ${data.value}`}</Heading>
116
149
  ))) : null

2

タグを追加

2022/03/19 10:12

投稿

pierogi.user
pierogi.user

スコア19

test CHANGED
File without changes
test CHANGED
File without changes

1

コンポーネントの親子関係に関する追記

2022/03/19 10:12

投稿

pierogi.user
pierogi.user

スコア19

test CHANGED
File without changes
test CHANGED
@@ -121,6 +121,8 @@
121
121
  ```
122
122
  上記のコードだと`dataContext.tsx`では `socketData`の保存・更新はうまくいっているのですが、`contextData`への保存がうまくいっておらず空配列のままです(`initial_data_to_browser`、`test_emit_10s`のどちらのイベント発生時でも)。
123
123
  `dataCard.tsx`の表示は初期データはブラウザに表示されるのですが、その後の更新データは表示されません。この点に関しては、`dataContext.tsx`で`contextData`は空のままなのに初期データだけが`dataCard.tsx`に渡されているのが不思議です。
124
+ `dataCard.tsx`はコンポーネントの上位階層で`<DataProvider>`タグで囲んでいます(間にルーティングのためのコンポーネントは存在しています)。
124
125
 
125
126
  `dataCard.tsx`で初期データ・更新データをリアルタイムに表示するにはどう修正すればいいでしょうか?
127
+ よろしくお願いします。
126
128