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-bucketjs

v1.0.2

Published

React state-management using elegant buckets with hooks to support re-render on changes.

Downloads

3

Readme

React BucketJS!

bucket.js is an ultra lightweight state-management for your react projects.

  • Easily find your bucket references across your codebase
  • Supports primitive, arrays and object types
  • Hooks to track changes by bucket or bucket selector
  • No dependencies, only react 18 as peerDependency

Install

npm install react-bucketjs

Basic Example

Simple counter and re-rendering on change.

import { bucket, useBucket } from "react-bucketjs";

//suggestion: export your bucket in a globals file to access anywhere
let btCount = bucket(0);

function Counter() {
    let count = useBucket(btCount);

    return (
        <div>
            <h1>{count}</h1>
            <button onClick={() => btCount.set(count + 1)}>Increment</button>
        </div>
    );
}

Advanced Example

Multiple counters in a single bucket, showing how to increment in different ways.

import { bucket, useBucketSelector } from "react-bucketjs";

let btCounters = bucket({ Larry: 0, Curly: 0, Moe: 0 });

function Counter() {
    let larry = useBucketSelector(btCounters, (bucket) => bucket.Larry);
    let curly = useBucketSelector(btCounters, (bucket) => bucket.Curly);
    let moe = useBucketSelector(btCounters, (bucket) => bucket.Moe);

    return (
        <div>
            <h1>Curly: {curly}</h1>
            <button
                onClick={() => {
                    let counters = btCounters.get();
                    counters.Curly++;
                    btCounters.set(counters);
                }}
            >
                Slap
            </button>

            <h1>Larry: {larry}</h1>
            <button
                onClick={() => {
                    btCounters.assign({ Larry: larry + 1 });
                }}
            >
                Bonk
            </button>

            <h1>Moe: {moe}</h1>
            <button
                onClick={() => {
                    let moeCount = btCounters.get((bucket) => bucket.Moe);
                    btCounters.assign({ Moe: moeCount + 1 });
                }}
            >
                Pinch
            </button>
        </div>
    );
}

Comparator

You can control if useBucket and useBucketSelector should trigger a re-render using a comparator. This is helpful if you have an object in a bucket and only want specific keys in that bucket to be triggered instead of any key/value.

import { useBucket, useBucketSelector } from "react-bucketjs";

// A JSON stringify comparator is available to use as well for complex objects/arrays
import { compareStringified } from "react-bucketjs";

// Example 1
// Render only when specific keys do not match
const comparatorA = (prev, next) => prev.key !== next.key;
let value = useBucket(myBucket, comparatorA);

// Example 2
// Render selector values always, even if they are equal
const comparatorB = (prev, next) => true;
let selectedValue = useBucketSelector(
    myBucket,
    (bucket) => bucket.key,
    comparatorB
);

Subscribe to bucket

Track bucket changes outside of a react function component using any function.

import { bucket } from "react-bucketjs";

let btCounter = bucket(0);

/**
 * Note: internally we always use an object to store the value in a "state".
 * This is required for useSyncExternalStore,
 * so for regular functions you'll need to access the bucket.state.
 */
const onIncrement = (bucket) => console.log("Count: ", bucket.state);

// Subscribe to the bucket
btCounter.subscribe(onIncrement);

// Trigger an increment
function increment() {
    let count = btCounter.get();
    btCounter.set(count + 1);
}

//...

increment();
//output: Count: 1

increment();
//output: Count: 2