tbsten
@tbsten (てべすてん)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Reactでの状態管理

解決したいこと

Reactで状態管理の設計に困っています。例えば以下のような状態を管理したいとします。

扱うモデル(?)
School //学校
->Grade //学年
->->Class //学級
->->Student //生徒
各モデルの保持する値(フィールド)
School(name, location)
Grade(name)
Class(name, teacher)
Student(name, old)

念のため言葉で説明すると、「複数のSchoolがあって、Schoolの中にGradeが複数あって、Gradeの中にClassが複数あって...」となっています。

・ReduxやRecoilなどでこれをグローバルに保持したい
ClassやStudent(下の階層のもの)は追加・削除・内容変更を含め更新が多い

(以下、状態管理ライブラリにReduxを選んだとして話を進めます。)

この時どのような構造で状態管理を保持すると良いと思いますか?

自分で考えたのは次の2パターンです。

1 すべてのオブジェクトを1つのStoreで管理

具体的にはStoreのState が以下のようになります。

Store:{
  schools:[
    {    //School Object
      name:"A high school",
      location: "X県x市",
      grades:[
        {    //Grade Object
          name:"grade 1",//1年生
          classes:[
            {    //Class Object
              name:"1-A",
              teacher:"ころせんせー",
              students:[
                {    //Students Object
                  name:"N村 N男",
                  old: 15,
                },
                .....
              ]
            },
            .....
          ],
        },
        .....
      ],
    },
    .....
  ],
}
問題点

意味的にはシンプルで分かりやすいですが、1つのStudentのnameを変更するたびに全体が更新されるため、パフォーマンス的に最悪です。

2 オブジェクト一覧を作ってIDで管理

具体的にはStoreのState が以下のようになります。

Store:{
  schools:{
    "SchoolId-0":{
      name:"",
      location:"",
      grades:["GradeId-0","GradeId-1","GradeId-2"]
    },
    .....
  },
  grades:{
    "GradeId-0":{
      name:"1-A",
      classes:["ClassId-0","ClassId-1"]
    },
  },
  classes:{
    name:"1-A",
    teacher:"ころせんせー",
    studentes:["StudentsId-0","StudentsId-1","StudentsId-2"],
  },
  students:{
    name:"N村 N男",
    old:15,
  },
}
問題点

意味的にはシンプルで分かりやすいですが、1つのStudentのnameを変更するたびに全体が更新されるため、パフォーマンス的に最悪です。

(上の2つの例以外にもあればお教えください。)

どのように管理すればいいでしょうか?

0

1Answer

表示するページの構成はどうなっていますか?

School //学校
->Grade //学年
->->Class //学級
->->Student //生徒

全部が1ページ?それともそれぞれのレベルでページがある?

0Like

Comments

  1. @tbsten

    Questioner

    ご回答ありがとうございます。
    「全部が1ページ」の想定で質問いたしました。

Your answer might help someone💌