Convert Figma logo to code with AI

effector logoeffector

Business logic with ease ☄️

4,593
235
4,593
151

Top Related Projects

48,653

🐻 Bear necessities for state management in React

The official, opinionated, batteries-included toolset for efficient Redux development

Quick Overview

Effector is a powerful and lightweight state management library for JavaScript applications. It provides a simple and predictable way to manage application state, with a focus on type safety and developer experience. Effector is framework-agnostic and can be used with React, Vue, or vanilla JavaScript.

Pros

  • Excellent TypeScript support with strong type inference
  • Lightweight and performant, with a small bundle size
  • Framework-agnostic, can be used with any UI library or vanilla JS
  • Clear and predictable data flow with event-driven architecture

Cons

  • Steeper learning curve compared to some other state management solutions
  • Smaller community and ecosystem compared to Redux or MobX
  • Documentation could be more comprehensive, especially for advanced use cases
  • Limited middleware support compared to Redux

Code Examples

Creating a store and an event:

import { createStore, createEvent } from 'effector'

const increment = createEvent()
const $counter = createStore(0)
  .on(increment, state => state + 1)

$counter.watch(state => console.log('Counter:', state))

increment() // Counter: 1
increment() // Counter: 2

Using Effector with React:

import { createStore, createEvent } from 'effector'
import { useStore } from 'effector-react'

const increment = createEvent()
const $counter = createStore(0).on(increment, state => state + 1)

const Counter = () => {
  const count = useStore($counter)
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => increment()}>Increment</button>
    </div>
  )
}

Creating and combining effects:

import { createEffect, combine } from 'effector'

const fetchUserFx = createEffect(async (id) => {
  const response = await fetch(`https://api.example.com/users/${id}`)
  return response.json()
})

const fetchPostsFx = createEffect(async (userId) => {
  const response = await fetch(`https://api.example.com/posts?userId=${userId}`)
  return response.json()
})

const $userWithPosts = combine({
  user: fetchUserFx.doneData,
  posts: fetchPostsFx.doneData,
})

$userWithPosts.watch(console.log)

fetchUserFx(1)
fetchPostsFx(1)

Getting Started

To start using Effector in your project, first install it:

npm install effector

For React integration, also install:

npm install effector-react

Then, you can import and use Effector in your JavaScript or TypeScript files:

import { createStore, createEvent } from 'effector'

const increment = createEvent()
const $counter = createStore(0)
  .on(increment, state => state + 1)

$counter.watch(state => console.log('Counter:', state))

increment() // Counter: 1

Competitor Comparisons

48,653

🐻 Bear necessities for state management in React

Pros of Zustand

  • Simpler API with less boilerplate code
  • Easier learning curve for developers familiar with React hooks
  • Better TypeScript support out of the box

Cons of Zustand

  • Less powerful for complex state management scenarios
  • Fewer built-in utilities for derived state and side effects
  • Limited ecosystem compared to more established state management libraries

Code Comparison

Zustand:

import create from 'zustand'

const useStore = create((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}))

Effector:

import { createStore, createEvent } from 'effector'

const increment = createEvent()
const $count = createStore(0)
  .on(increment, (state) => state + 1)

Both Zustand and Effector are state management libraries for React applications, but they have different approaches and trade-offs. Zustand focuses on simplicity and ease of use, making it a good choice for smaller projects or developers new to state management. Effector, on the other hand, offers a more robust and scalable solution for complex state management needs, but with a steeper learning curve.

The official, opinionated, batteries-included toolset for efficient Redux development

Pros of Redux Toolkit

  • Widely adopted and well-established in the React ecosystem
  • Comprehensive documentation and large community support
  • Includes utilities for common Redux use cases, reducing boilerplate

Cons of Redux Toolkit

  • Steeper learning curve due to more complex concepts
  • Can be overkill for smaller applications
  • Requires more boilerplate code compared to Effector

Code Comparison

Redux Toolkit:

const counterSlice = createSlice({
  name: 'counter',
  initialState: 0,
  reducers: {
    increment: state => state + 1,
  },
});

Effector:

const increment = createEvent();
const $counter = createStore(0)
  .on(increment, state => state + 1);

Redux Toolkit uses a more declarative approach with slices, while Effector employs a more functional style with events and stores. Effector's syntax is generally more concise, but Redux Toolkit provides a more structured way of organizing state logic.

Both libraries aim to simplify state management, but they take different approaches. Redux Toolkit builds upon Redux, offering additional utilities and conventions, while Effector provides a lightweight alternative with a focus on performance and simplicity.

The choice between the two depends on project requirements, team familiarity, and personal preference. Redux Toolkit may be better suited for larger applications with complex state management needs, while Effector could be ideal for smaller projects or those seeking a more minimalist approach.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

Effector Comet Logo


join gitter rate on openbase build status discord chat become a patron

☄️ effector

Business logic with ease

Visit effector.dev for docs, guides and examples

Table of Contents

Introduction

Effector implements business logic with ease for Javascript apps (React/React Native/Vue/Svelte/Node.js/Vanilla), allows you to manage data flow in complex applications. Effector provides best TypeScript support out of the box.

Effector follows five basic principles:

  • Application stores should be as light as possible - the idea of adding a store for specific needs should not be frightening or damaging to the developer.
  • Application stores should be freely combined - data that the application needs can be statically distributed, showing how it will be converted in runtime.
  • Autonomy from controversial concepts - no decorators, no need to use classes or proxies - this is not required to control the state of the application and therefore the api library uses only functions and plain js objects
  • Predictability and clarity of API - a small number of basic principles are reused in different cases, reducing the user's workload and increasing recognition. For example, if you know how .watch works for events, you already know how .watch works for stores.
  • The application is built from simple elements - space and way to take any required business logic out of the view, maximizing the simplicity of the components.

Installation

You can use any package manager

npm add effector

React

To getting started read our article how to write React and Typescript application.

npm add effector effector-react

SolidJS

npm add effector effector-solid

Vue

npm add effector effector-vue

Svelte

Svelte works with effector out of the box, no additional packages needed. See word chain game application written with svelte and effector.

CDN

Documentation

For additional information, guides and api reference visit our documentation site

Packages

Articles

Community

Online playground

You can try effector with online playground

Code sharing, Typescript and react supported out of the box. Playground repository

DevTools

Use effector-logger for printing updates to console, displaying current store values with ui or connecting application to familiar redux devtools


More examples in documentation

Learn more

Support us

Your support allows us to improve the developer experience 🧡.

Contributors

Dmitry/
Dmitry
andretshurotshka/
andretshurotshka
Sova/
Sova
Alexander
Alexander Khoroshikh
popuguy/
popuguy
Igor
Igor Kamyşev
Egor/
Egor
Valeriy
Valeriy Kobzar
Yan/
Yan
Illia
Illia Osmanov
Ruslan
Ruslan @doasync
mg901/
mg901
Igor
Igor Ryzhov
Arthur
Arthur Irgashev
Viktor/
Viktor
Ilya/
Ilya
Ainur/
Ainur
Arutiunian
Arutiunian Artem
Ilya
Ilya Olovyannikov
Dmitrij
Dmitrij Shuleshov
Nikita
Nikita Nafranets
Ivan
Ivan Savichev
Aleksandr
Aleksandr Osipov
Зухриддин
Зухриддин Камильжанов
Mikhail
Mikhail Kireev
bakugod/
bakugod
Victor
Victor Didenko
Viktor
Viktor Pasynok
Kirill
Kirill Mironov
Andrei/
Andrei
Ivan/
Ivan
Bohdan
Bohdan Petrov
Dan/
Dan
Filipkin
Filipkin Denis
sergey20x25/
sergey20x25
Ivanov
Ivanov Vadim
Tauyekel
Tauyekel Kunzhol
Victor/
Victor
Vladimir
Vladimir Ivakin
Aldiyar
Aldiyar Batyrbekov
cqh/
cqh
xaota/
xaota
☃︎/
☃︎
Andrei
Andrei Antropov
Ivan/
Ivan
Sozonov/
Sozonov
Samir/
Samir
Renat
Renat Sagdeev
Kirill/
Kirill
Denis
Denis Sikuler
Arsen-95/
Arsen-95
Anton
Anton Yurovskykh
Anton
Anton Kosykh
Aleksandr
Aleksandr Belov
The
The Gitter Badger
Usman
Usman Yunusov
Vasili
Vasili Sviridov
Vasili
Vasili Svirydau
Victor
Victor Kolb
Vladislav/
Vladislav
Vladislav
Vladislav Melnikov
Vladislav
Vladislav Botvin
Will
Will Heslam
Simon
Simon Muravev
Shiyan7/
Shiyan7
Sergey
Sergey Belozyorcev
Satya
Satya Rohith
Roman
Roman Paravaev
Roman/
Roman
Robert
Robert Kuzhin
Raman
Raman Aktsisiuk
Rachael
Rachael Dawn
xxxxue/
xxxxue
vladthelittleone/
vladthelittleone
Vladimir/
Vladimir
roman/
roman
Marina
Marina Miyaoka
lightningmq/
lightningmq
Kirill
Kirill Leushkin
kanno/
kanno
Ilya/
Ilya
ilfey/
ilfey
Houston
Houston (Bot)
Grigory
Grigory Zaripov
dmitryplyaskin/
dmitryplyaskin
Stanislav/
Stanislav
ansunrisein/
ansunrisein
Anatoly
Anatoly Kopyl
Yesset
Yesset Zhussupov
Rasul
Rasul
Ed
Ed Prince
Dmitry
Dmitry Dudin
Dmitry/
Dmitry
Denis
Denis Skiba
Dinislam
Dinislam Maushov
Ayu/
Ayu
David/
David
BlackPoretsky/
BlackPoretsky
Александр/
Александр
Alexander/
Alexander
Alex
Alex Anokhin
Aleksei/
Aleksei
Alex
Alex Arro
Aleksandr
Aleksandr Grigorii
Abel
Abel Soares Siqueira
7iomka/
7iomka
Abdukerim
Abdukerim Radjapov
0xflotus/
0xflotus
bigslycat/
bigslycat
Pavel
Pavel Hrakovich
Oleh/
Oleh
Oleg/
Oleg
Mike
Mike Cann
Nikita
Nikita Svoyachenko
Ludovic
Ludovic Dem
Leniorko/
Leniorko
Lebedev
Lebedev Konstantin
Joel
Joel Bandi
Jesse
Jesse Jackson
Jan
Jan Keromnes
Ivan/
Ivan
Infant
Infant Frontender
Ilya
Ilya Martynov
Gleb
Gleb Kotovsky
Gabriel
Gabriel Husek
Edward
Edward Gigolaev

Tested with browserstack

NPM DownloadsLast 30 Days