Skip to content

View Models

Назначение

Эта страница объясняет, как думать о view model в Nrgy.js.

View model как контракт

View model является контрактом между бизнес-логикой и представлением.

Хорошая view model:

  • отдаёт только те данные, которые нужны view
  • отдаёт только те actions, которые view имеет право вызывать
  • скрывает service orchestration и workflow details
  • остаётся пригодной для нескольких реализаций представления

Пример

ts
import { declareViewModel, readonlyAtom } from '@nrgyjs/core';

export const CounterViewModel = declareViewModel(({ scope, view }) => {
  const count = scope.atom(view.props.initialValue());

  return {
    state: {
      count: readonlyAtom(count),
    },
    increment: () => count.update((value) => value + 1),
  };
});

MVC vs MVVM

Полезнее всего формулировать различие практично:

  • MVC чаще держит явную координацию и binding-логику в controller
  • MVVM переносит большую часть view-facing связи в модель, к которой view привязывается
  • оба подхода отделяют rendering от business logic, но MVVM сильнее акцентирует чистый публичный контракт для view

Для документации Nrgy.js полезнее всего не историческая чистота терминов, а показ того, как сделать views тонкими, а бизнес-flow переиспользуемыми.

Что важно описывать в docs

Для каждой view model стоит явно фиксировать:

  • какие входы ей нужны
  • какие state fields она отдаёт
  • какие actions поддерживает
  • кто владеет её lifecycle

Это потом сильно упрощает перенос в React wrappers и публичную документацию.

Для React-интеграции withViewModel() является важным MVVM helper-ом, потому что делает границу view model явной на уровне компонента.