UIStore
UIStore
- это логика фичи, реализованная с помощью state manager.
UIStore
можно рассматривать как View-Model из паттерна MVVM или Supervising Controller.
Рекомендуется отдавать предпочтение реализации логики через UIStore
перед useLogic
. Причины:
- Возможность упрощения реактивной логики за счет использования state manager
- Более простые тесты для логики
- Меньшая связь со спецификой ui фреймворка
Структура
├── app/
├── screens/
├── modules/
| └── payment/
| | ├── features/
| | | ├── PaymentSwitch/
| | | | ├── PaymentSwitch.tsx
| | | | ├── UIStore/
| | | | | ├── UIStore.ts
| | | | | └── index.ts
| | | | └── index.ts
| | | ├── CashPayment/
| | | └── index.ts
| | ├── domain/
| | └── index.ts
├── data/
└── shared/
Style guide
Работа с data слоем
UIStore
взаимодействует с data
слоем для:
- Получения данных
- Форматирования данных для отображения в компоненте
- Формирования флагов состояния загрузки данных для отображения в компоненте
Формирование данных для отображения
Форматирование дат для от ображения
export class UIStore {
constructor(private readonly params: { issueDate: Date }) {
makeAutoObservable(this);
}
public get issueDate() {
return this.params.issueDate.toLocaleDateString();
}
}
export const Card = (props: Props) => {
const [{ issueDate }] = useState(() => createUIStore(props));
return (
<Wrapper>
<IssueDate>{issueDate}</IssueDate>
</Wrapper>
);
};
Склеивание строк для отображения
export class UIStore {
constructor(private readonly params: { name: string; surname: string }) {
makeAutoObservable(this);
}
public get fullName() {
return `${this.params.name} ${this.params.surname}`;
}
}
export const Card = (props: Props) => {
const [{ fullName }] = useState(() => createUIStore(props));
return (
<Wrapper>
<Typography>{fullName}</Typography>
</Wrapper>
);
};
Формирование массивов или объектов
export class UIStore {
constructor(
private readonly params: { list: Array<{ name: string; surname: string }> },
) {
makeAutoObservable(this);
}
public get data() {
return this.params.list.map(({ name, surname }) => `${name} ${surname}`);
}
}
export const List = (props: Props) => {
const [{ data }] = useState(() => createUIStore(props));
return (
<Wrapper>
{data.map((fullName) => (
<li key={fullName}>
<Typography>{fullName}</Typography>
</li>
))}
</Wrapper>
);
};