85 lines
5.0 KiB
Markdown
85 lines
5.0 KiB
Markdown
---
|
||
title: Stores
|
||
---
|
||
|
||
# Stores
|
||
|
||
## Сторы (Stores)
|
||
|
||
> В этом разделе собраны основные правила и рекомендации по созданию и оформлению сторов. Следуйте этим принципам, чтобы обеспечить чистую архитектуру, удобство поддержки и единый стиль работы с состоянием в проекте.
|
||
> В проекте для организации состояния используется только библиотека Zustand.
|
||
|
||
### Структура
|
||
- Store размещается в файле `<store-name>.store.ts` в папке `stores/` на своём уровне абстракции согласно архитектуре проекта.
|
||
- Интерфейс состояния описывается в этом же файле с суффиксом `State` (PascalCase).
|
||
- Для каждого store создаётся отдельный хук доступа (например, `useTodoStore`).
|
||
- Для глобальных сторов используйте только `shared/store`.
|
||
|
||
### Именование
|
||
- Соблюдайте [правила именования файлов и папок](#правила-именования-файлов-и-папок):
|
||
- Файл store — `<store-name>.store.ts` (kebab-case).
|
||
- Имя интерфейса состояния — PascalCase с суффиксом `State`.
|
||
- Имя хука — camelCase с префиксом `use`.
|
||
|
||
### Требования
|
||
- В store допускается только хранение состояния и методы управления им, без бизнес-логики, асинхронных операций и side-effects (см. раздел "Правила организации и использовалья Store").
|
||
- Для методов, изменяющих состояние через set, если используется функция — тело функции в фигурных скобках, return с новой строки после стрелки.
|
||
- Не дублируйте логику между сторами.
|
||
|
||
### Типизация
|
||
- Всегда указывайте типы для всех полей состояния и методов.
|
||
- Не используйте неявное приведение типов и не полагайтесь на автоматический вывод, если это может снизить читаемость или безопасность.
|
||
|
||
### Документирование
|
||
- Документируйте только назначение store и смысл полей, строго по [правилам документирования кода](#правило-для-документирования-кода).
|
||
|
||
### Экспорт
|
||
- Экспортируйте хук доступа к store и интерфейс состояния через `index.ts` слоя/компонента.
|
||
|
||
### Примеры
|
||
|
||
```ts
|
||
import { create } from 'zustand';
|
||
import { TodoItem } from './types/todo-item.interface';
|
||
|
||
/**
|
||
* Состояние хранилища задач.
|
||
*/
|
||
export interface TodoStoreState {
|
||
/** Массив задач. */
|
||
items: TodoItem[];
|
||
/** Добавить задачу. */
|
||
addTodo: (item: TodoItem) => void;
|
||
/** Удалить задачу. */
|
||
removeTodo: (id: string) => void;
|
||
}
|
||
|
||
/**
|
||
* Хук для доступа к хранилищу задач.
|
||
*/
|
||
export const useTodoStore = create<TodoStoreState>((set) => ({
|
||
items: [],
|
||
addTodo: (item) => set((state) => {
|
||
return {
|
||
items: [...state.items, item],
|
||
};
|
||
}),
|
||
removeTodo: (id) => set((state) => {
|
||
return {
|
||
items: state.items.filter((t) => t.id !== id),
|
||
};
|
||
}),
|
||
}));
|
||
```
|
||
|
||
### Чек-лист
|
||
|
||
- [ ] Store размещён в `stores/<store-name>.store.ts` на своём уровне абстракции согласно архитектуре проекта.
|
||
- [ ] Именование файлов и сущностей соответствует [правилам именования файлов и папок](#правила-именования-файлов-и-папок).
|
||
- [ ] Все поля и методы строго типизированы (см. [общие правила типизации](#общие-правила-типизации)).
|
||
- [ ] В store только состояние и методы управления им, без бизнес-логики и side-effects.
|
||
- [ ] Для методов, изменяющих состояние через set, используется функция с return с новой строки.
|
||
- [ ] Документировано только назначение store и смысл полей (см. [правила документирования кода](#правило-для-документирования-кода)).
|
||
- [ ] Нет неиспользуемого или невалидного кода.
|
||
- [ ] Экспорт через индексный файл.
|