MCPcopy Index your code
hub / github.com/effector/reflect

github.com/effector/reflect @v10.1.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v10.1.0 ↗ · + Follow
95 symbols 207 edges 31 files 0 documented · 0%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

@effector/reflect

☄️ Attach effector stores to react components without hooks.

Install

npm install @effector/reflect
# or
pnpm add @effector/reflect

Getting started | API Docs

Motivation

What's the point of reflect?

It's the API design that, using the classic HOC-like pattern, allows you to write React components with Effector in an efficient and composable way.

import { reflect, variant } from '@effector/reflect';

export function UserForm() {
  return (
    <FormCard>
      <Name />
      <LastName />
      <SubmitButton />
    </FormCard>
  );
}

const Name = reflect({
  view: Input,
  bind: {
    value: model.$name,
    onChange: model.nameChanged,
  },
});

const LastName = reflect({
  view: Input,
  bind: {
    value: model.$lastName,
    onChange: model.lastNameChanged,
  },
});

const SubmitButton = reflect({
  view: Button,
  bind: {
    type: 'submit', // plain values are allowed too!
    disabled: model.$formValid.map((valid) => !valid),
    onClick: model.formSubmitted,
  },
});

Here we've separated this component into small parts, which were created in a convenient way using reflect operators, which is a very simple description of the props -> values mapping, which is easier to read and modify.

With @effector/reflect, our $formValid update will only cause the SubmitButton to be re-rendered, and for all other parts of our <UserForm /> there will literally be zero React work.

To learn more, please read the full Motivation article.

Release process

  1. Check out the draft release.
  2. All PRs should have correct labels and useful titles. You can review available labels here.
  3. Update labels for PRs and titles, next manually run the release drafter action to regenerate the draft release.
  4. Review the new version and press "Publish"
  5. If required check "Create discussion for this release"

Extension points exported contracts — how you extend this code

MemberProps (Interface)
(no doc)
src/no-ssr/list.test.tsx
ReflectConfig (Interface)
(no doc)
src/core/reflect.ts
MemberProps (Interface)
(no doc)
src/ssr/list.test.tsx
CommonProps (Interface)
(no doc)
type-tests/types-reflect.tsx
Context (Interface)
(no doc)
src/core/types.ts
ButtonButtonProps (Interface)
(no doc)
type-tests/types-reflect.tsx
AnchorButtonProps (Interface)
(no doc)
type-tests/types-reflect.tsx
LabelButtonProps (Interface)
(no doc)
type-tests/types-reflect.tsx

Core symbols most depended-on inside this repo

fromTag
called by 6
src/core/fromTag.ts
reflectFactory
called by 5
src/core/reflect.ts
plugins
called by 4
rollup.config.cjs
measure
called by 3
build.mjs
listFactory
called by 2
src/core/list.ts
forIn
called by 2
src/core/list.ts
reflectCreateFactory
called by 2
src/core/reflect.ts
sortProps
called by 2
src/core/reflect.ts

Shape

Function 87
Interface 8

Languages

TypeScript100%

Modules by API surface

type-tests/types-reflect.tsx16 symbols
type-tests/types-variant.tsx13 symbols
src/no-ssr/list.test.tsx11 symbols
src/ssr/list.test.tsx9 symbols
src/no-ssr/reflect.test.tsx8 symbols
src/no-ssr/variant.test.tsx5 symbols
src/core/reflect.ts5 symbols
src/ssr/variant.test.tsx4 symbols
src/ssr/reflect.test.tsx4 symbols
src/ssr/create-reflect.test.tsx4 symbols
src/core/variant.ts4 symbols
src/no-ssr/create-reflect.test.tsx3 symbols

For agents

$ claude mcp add reflect \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact