npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-atomic-variables

v2.1.8

Published

a super simple, no-dependency, implementation of a bottom-up state management system for react

Downloads

15

Readme

react-atomic-variables

CI Tests Coverage Status

View Demo Here!

How To Use

import { useVariable, AtomicVariable } from "react-atomic-variables";

const variable = new AtomicVariable(0);

const App = () => {
  const [counter, setCounter] = useVariable(variable);
  return (
    <div>
      <button onClick={() => setCounter((c) => c + 1)}>Increment</button>
      <button onClick={() => setCounter((c) => c - 1)}>Decrement</button>
      <p>Counter: {counter}</p>
    </div>
  );
};

API

AtomicVariable<Type>

This class represents a single self-contained variable.

constructor(initialValue: Type)

The constructor only takes one parameter, the initialValue of the variable.

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

const jeff: User = {
  name: "Jeff",
  age: 21,
};

const variable = new AtomicVariable(jeff); // Type is inferred as User

getValue()

This function returns the current value of the variable. This can be called from anywhere in the application including outside react components

const variable = new AtomicVariable(0);

console.log(variable.getValue()); // 0

set(newValue: Type | Setter<Type>)

This method is used to set the value of the variable.

It takes either a new value or a setter function.

The setter function is passed the current value of the variable and should return the new value.

const variable = new AtomicVariable(0);

variable.set(1);
console.log(variable.getValue()); // 1

variable.set((c) => c + 1);
console.log(variable.getValue()); // 2

subscribe(callback: (newValue: Type) => UnsubscribeFn)

This method is used to subscribe to changes in the variable. The callback is called whenever the value of the variable changes. The callback is passed the new value of the variable.

The callback returns an unsubscribe function which can be used to remove the listener from the variable.

const variable = new AtomicVariable(0);

const unsubscribe = variable.subscribe((newValue) => {
  console.log(newValue);
});


variable.set(1); // This should trigger the callback and log 1 to the console

unsubscribe(); // This removes the listener from the variable

variable.set(2); // This should not trigger the callback

useVariable(variable: AtomicVariable) => [Value, Setter]

This is similar to the useState react hook except that it takes an AtomicVariable as a parameter instead of an initial value.

It returns a tuple containing the current value of the variable and a setter function.

const variable = new AtomicVariable(0);

const App = () => {
  const [counter, setCounter] = useVariable(variable);
  return (
    <div>
      <button onClick={() => setCounter((c) => c + 1)}>Increment</button>
      <button onClick={() => setCounter((c) => c - 1)}>Decrement</button>
      <p>Counter: {counter}</p>
    </div>
  );
};

useValue

This is a hook that takes an AtomicVariable and returns the current value of the variable.

It will trigger a re-render of the component anytime the setter function is called.

const variable = new AtomicVariable(0);

const App = () => {
  const counter = useValue(variable)
  return (
    <p>Counter: {counter}</p>
  );
};

useSetVariable

This is a hook that takes an AtomicVariable and returns the setter function of the variable. All this hook really does is just return AtomicVariable.set since the reference to the setter in the current implementation never changes.

const variable = new AtomicVariable(0);

const App = () => {
  const setCounter = useSetVariable(variable)
  return (
    <div>
      <button onClick={() => setCounter((c) => c + 1)}>Increment</button>
      <button onClick={() => setCounter((c) => c - 1)}>Decrement</button>
    </div>
  );
};