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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

TypeScript

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

React.js

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

Q&A

0回答

702閲覧

描画のための最適なデータ構造とその変更の責務はバックエンドが適切か

midooo

総合スコア6

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

TypeScript

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

React.js

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

0グッド

0クリップ

投稿2021/12/07 16:14

編集2022/01/12 10:55

前提・実現したいこと

React@TypescriptでSPAのチャットアプリを作っています.
作ろうとしているのは,Slackのように,日付の区切り線コンポーネントがあるようなメッセージ一覧です.
日付区切り線は索引のようになっていて,指定の日付にスクロールジャンプする仕組みを作ろうとしています.
ただし,このメッセージ一覧ですが,新着メッセージを追加したり,読み込まれていない過去のメッセージをLazyLoadingするような機能も検討しています.
Reactのリストコンポーネントは react-windowを使っていて、移動のための scrollToItem というライブラリの機能を利用する方針です.なので,必要なのは配列の中の移動したい日付のデータ要素のIndexです.

質問したいこと

困っていることは,サーバーからメッセージ一覧を取得して,フロントエンドに適した形に直す.というロジックを考えた時,
どこで,どのようにデータを設計すればいいかわからないことです.

具体的にわからないことは,

  1. 日付とメッセージを混ぜたデータはバックエンドで作るべき?それともフロントエンド?
  2. 日付データで区切られたメッセージ配列をどのように設計すれば,今後の開発で取り回しが効く?

詳細

現在考えているフロントエンド側のデータの構造とスクロールジャンプのロジックです.
参考にしているSlackで,デバッグツールをみて自分なりに解析し,1つの配列のデータ構造でコンポーネントのだしわけをしていると解釈しました.
ただ,HTML的にはもうちょっとリッチな感じ(日付コンポーネントがスクロールした時に部分的に追従したり..)なのでおそらく正確ではない気がしています.
もしかしたら,日付をキーにしたハッシュ型なのか?と推測してみたりしています.

typescript

1type Message = { 2 _type: "message"; 3 id: string; 4 body: string; 5 createdAt: int; 6}; 7 8type DateDivider = { 9 _type: "dateDivier"; 10 date: int; 11}; 12 13type StreamItem = Message | DateDivider; 14 15const findTheDateIndex = (date: int, stream: StreamItem[]): index: number => { 16 const isTheDay = (data: StreamItem,):boolean => { 17 if(isDateDivider(data)){ 18 return data.date === date; 19 } 20 return false; 21 } 22 return stream.findIndex(isTheDay(item)); 23} 24 25// react list.tsx の抜粋----- 26stream: StreamItem[] = data.message // APIから受け取ったデータ, 27const Row = ({ index, style, data }) => ( 28 <div style={style}> 29 {isMessage(data[index] && <Message message={data[index]}/>} 30 {isDate(data[index] && <DateDivider dateDivider={data[index]}/>} 31 </div> 32); 33return ( 34 <List 35 items={stream} 36 /> 37 {Row} 38 </List> 39);

追記・備考

ひとまず、読み込まれていない日付の移動は考えていませんでした。が、考えたことはコメントにて返しました。

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

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

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

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

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

hoshi-takanori

2021/12/08 20:22

自分なら日付ごとにまとめるのはフロントでやりたい気がしますが、実際にやってみないと分からないですね…。 ちなみに、興味本位の質問ですが、まだ読み込まれてない日付へのジャンプもできるようにするんですか? (難しそう…。)
midooo

2021/12/13 03:28

コメントありがとうございます!そうですね、バックエンドがどのようにスケールするのかとかあんまり考えられていなくてこんな疑問が浮かんでいます。データ成形は、UI側の事情なので責任範囲を考えればフロントで処理するのが自然な気がしてきています。 > ちなみに、興味本位の質問ですが、まだ読み込まれてない日付へのジャンプもできるようにするんですか? 難しいと思っているのですが。今考えたのは、 まず、データセットの中に読み込み範囲をデータ日付?で持つようにしようと考えています。 なので、読み込んだ時点で読み込み範囲外が分かるので、何日以降のデータを取得するAPIを作って差分で読み込めるかな??と日和見計算してます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問