Перейти к содержанию
Mercury
Русский
Дизайн книга
Меню
Русский

Фреймворки после effector-react

У Mercury один слой представления — Hyperscript. Его привязки к Hypergraph ещё предстоят; пока компонент читает хранилище через уже существующий хук Hyperscript.

В Effector модель связывается с представлением через пакет фреймворка: effector-react, effector-vue или effector-solid. У Mercury один слой представления — Mercury Hyperscript (@fiberfx/hyperscript): виртуальный DOM с собственной средой выполнения JSX и хуками. Привязок Vue и Solid нет, React тоже нет.

Один слой представления

Хуки Hyperscript находятся в @fiberfx/hyperscript/hooks: useState, useReducer, useRef, useEffect, useLayoutEffect, useCallback, useMemo, useContext, useImperativeHandle, useDebugValue, useErrorBoundary, useId и useSyncExternalStore. Компоненты — функции, возвращающие JSX, как и в React.

Запланированные привязки

Решение о привязках Hypergraph к Hyperscript принято, но они ещё не реализованы: это будут useUnit и Provider в подпути @fiberfx/hypergraph/hyperscript — знакомые имена из effector-react. Этот подпуть ещё не экспортируется: сегодня @fiberfx/hypergraph экспортирует только основную точку входа, /node и /inspect.

До выпуска привязок

useSyncExternalStore читает любое хранилище (store), на которое можно подписаться. Хранилище Hypergraph это позволяет: watch подписывается на обновления и возвращает функцию завершения подписки, а getState читает значение.

import { useSyncExternalStore } from "@fiberfx/hyperscript/hooks";
import { event, store, watch, type Store } from "@fiberfx/hypergraph";

export const increment = event<number>();
export const $count = store(0).on(increment, (count, by) => count + by);

function useStoreValue<T>(unit: Store<T>): T {
  return useSyncExternalStore(
    (onChange) => watch(unit, onChange),
    () => unit.getState(),
  );
}

export function Counter() {
  const count = useStoreValue($count);
  return <button onClick={() => increment(1)}>Clicked {count} times</button>;
}

Этот пример читает и записывает состояние вне всех изолированных областей состояния (scope). У него нет Provider, поэтому он не обращается к созданной через fork области. Рендеринг внутри области — например, серверный рендеринг или отдельная область на каждый остров — ждёт появления привязок.

Привязки, которые не переносятся

В effector-react В Mercury
useUnit(store), useUnit(event), useUnit({…}) запланирован useUnit в @fiberfx/hypergraph/hyperscript
Provider value={scope} запланирован Provider в @fiberfx/hypergraph/hyperscript
useStore отсутствует; уже был устаревшим в пользу useUnit
useEvent отсутствует; useUnit также принимает события
useStoreMap отсутствует; получите производное значение через $store.map или combine и прочитайте результат
useList отсутствует; преобразуйте массив внутри компонента
useGate, createGate отсутствуют
connect, createComponent отсутствуют
effector-vue, effector-solid отсутствуют; слой представления Mercury — Hyperscript