6 releases (3 breaking)

0.4.3 Dec 7, 2023
0.4.0 Aug 1, 2023
0.3.0 Jan 7, 2023
0.2.1 May 3, 2022
0.1.0 Dec 14, 2021

#28 in #state-management

Download history 129/week @ 2024-07-19 315/week @ 2024-07-26 315/week @ 2024-08-02 289/week @ 2024-08-09 217/week @ 2024-08-16 226/week @ 2024-08-23 236/week @ 2024-08-30 176/week @ 2024-09-06 139/week @ 2024-09-13 123/week @ 2024-09-20 126/week @ 2024-09-27 48/week @ 2024-10-04 85/week @ 2024-10-11 67/week @ 2024-10-18 67/week @ 2024-10-25 85/week @ 2024-11-01

305 downloads per month
Used in 9 crates (4 directly)

MIT/Apache

405KB
7.5K SLoC

Fermi ⚛

Atom-based global state management solution for Dioxus


Fermi is a global state management solution for Dioxus that's as easy as use_state.

Inspired by atom-based state management solutions, all state in Fermi starts as an atom:

static NAME: Atom<&str> = Atom(|_| "Dioxus");

From anywhere in our app, we can read the value of our atom:

fn NameCard(cx: Scope) -> Element {
    let name = use_read(cx, &NAME);
    cx.render(rsx!{ h1 { "Hello, {name}"} })
}

We can also set the value of our atom, also from anywhere in our app:

fn NameCard(cx: Scope) -> Element {
    let set_name = use_set(cx, &NAME);
    cx.render(rsx!{
        button {
            onclick: move |_| set_name("Fermi"),
            "Set name to fermi"
        }
    })
}

If needed, we can update the atom's value, based on itself:

static COUNT: Atom<i32> = Atom(|_| 0);

fn Counter(cx: Scope) -> Element {
    let mut count = use_atom_state(cx, &COUNT);

    cx.render(rsx!{
        p {
          "{count}"
        }
        button {
            onclick: move |_| count += 1,
            "Increment counter"
        }
    })
}

It's that simple!

Installation

Fermi is currently under construction, so you have to use the master branch to get started.

[dependencies]
fermi = { git = "https://github.com/dioxuslabs/dioxus" }

Running examples

The examples here use Dioxus Desktop to showcase their functionality. To run an example, use

$ cargo run --example fermi

Features

Broadly our feature set required to be released includes:

  • Support for Atoms
  • Support for AtomRef (for values that aren't Clone)
  • Support for Atom Families
  • Support for memoized Selectors
  • Support for memoized SelectorFamilies
  • Support for UseFermiCallback for access to fermi from async

Dependencies

~3MB
~55K SLoC