koba04 / redux-store-structure-patterns

Patterns for Redux Store with a data structure that has nested relationships

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

redux-store-structure-patterns

Patterns for Redux Store with a data structure that has nested relationships. How do you structure your Redux Store with this?

interface User {
  id: number;
  name: string;
  todos: Todo[];
}

interface Todo {
  id: number;
  body: string;
  memos: Memo[];
}

interface Memo {
  id: number;
  body: string;
}

Patterns

Nested Structure

interface UserState {
  id: number;
  name: string;
  todos: TodoState[];
}

interface TodoState {
  id: number;
  body: string;
  memos: MemoState[];
}

interface MemoState {
  id: number;
  body: string;
}

interface State {
  users: UserState[];
}

Separated List Structure

interface UserState {
  id: number;
  name: string;
  todoIds: number[];
}

interface TodoState {
  id: number;
  body: string;
  memoIds: number[];
}

interface MemoState {
  id: number;
  body: string;
}

interface State {
  users: UserState[];
  todos: TodoState[];
  memos: MemoState[];
}

Normalized Structure

interface UserState {
  id: number;
  name: string;
  todoIds: number[];
}

interface TodoState {
  id: number;
  body: string;
  memoIds: number[];
}

interface MemoState {
  id: number;
  body: string;
}

interface State {
  userIds: number[];
  users: {
    [id: number]: UserState;
  };
  todos: {
    [id: number]: TodoState;
  };
  memos: {
    [id: number]: MemoState;
  };
}

Normalized Structure with ES2015 Map

interface UserState {
  id: number;
  name: string;
  todoIds: number[];
}

interface TodoState {
  id: number;
  body: string;
  memoIds: number[];
}

interface MemoState {
  id: number;
  body: string;
}

interface State {
  users: Map<number, UserState>;
  todos: Map<number, TodoState>;
  memos: Map<number, MemoState>;
}

Development

npm install
npm test

About

Patterns for Redux Store with a data structure that has nested relationships

License:MIT License


Languages

Language:TypeScript 100.0%