Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jlalmes/simple-atom

Simple atomic state that can be updated outside of React components.
https://github.com/jlalmes/simple-atom

atomic jotai reactjs state zustand

Last synced: 3 months ago
JSON representation

Simple atomic state that can be updated outside of React components.

Awesome Lists containing this project

README

        


simple-atom


If Jotai & Zustand had a baby 👼








Simple atomic state that can be updated outside of the React life-cycle.

## Why use `simple-atom`?

- Update state **outside of a React component.**

- No need for React Context, store your atoms in **global scope**.

- **Familiar API**, identical usage to `React.setState`.

- First class **Typescript support**.

- It's simple, open source and it's tiny! **<250 bytes** gzipped.

## Installation

```bash
npm install simple-atom
```

Please ensure you have installed [`react`](https://github.com/facebook/react) at version `v16.8.0` or higher.

## Examples

#### Basic usage

```javascript
import React from 'react';
// Import 'simple-atom'
import { createAtom, useAtom } from 'simple-atom';

// Create an atom with 'createAtom'
const userAtom = createAtom({ name: 'James', age: 25 });

const MyComponent = () => {
// Get current value and setter function with 'useAtom' hook
const [user, setUser] = useAtom(userAtom);

if (!user) {
return

You are logged out

;
}

return setUser(null)}>Logout;
};
```

#### Update component state outside of React

```javascript
// == MyComponent.jsx ==
import React from 'react';
import { createAtom, useAtom } from 'simple-atom';

export const isLoadingAtom = createAtom(false);

const MyComponent = () => {
const [isLoading] = useAtom(isLoadingAtom);

if (isLoading) {
return (

Loading, please wait...

);
}

return (
// ...
);
}

// == other-application-file.js ==
import { isLoadingAtom } from './MyComponent.jsx';

// MyComponent will now re-render with the updated isLoading state
isLoadingAtom.value = true;

```

#### Subscribe to state changes

```javascript
import React from 'react';
import { createAtom, useAtom } from 'simple-atom';

const darkModeAtom = createAtom(() => {
if (typeof window === 'undefined') {
return false;
}
return window.localStorage.getItem('dark-mode') === 'true';
});

// Add a subscriber that is triggered on atom value change
darkModeAtom.subscribe((value) => {
window.localStorage.setItem('dark-mode', value.toString());
});

const MyComponent = () => {
const [darkMode, setDarkMode] = useAtom(darkModeAtom);

return setDarkMode(!darkMode)}>Toggle dark mode;
};
```

#### With Typescript

```typescript
import { createAtom } from 'simple-atom';

type User = { name: string; age: number } | null;

const userAtom = createAtom({ name: 'James', age: 25 });
```

## Acknowledgements

This package was inspired by these projects.

- [React](https://reactjs.org/docs/hooks-reference.html#usestate)
- [Jotai](https://github.com/pmndrs/jotai)
- [Zustand](https://github.com/pmndrs/zustand)

## Authors

- [James Berry (@jlalmes)](https://twitter.com/@jlalmes)

Contributions & PRs are always welcome! 🙌