πββοΈ Made by @thekitze
- π« React Academy - Interactive React and GraphQL workshops
- π Twizzy - A standalone app for Twitter DM
- π» Sizzy - A tool for testing responsive design on multiple devices at once
- π€ JSUI - A powerful UI toolkit for managing JavaScript apps
β οΈ Warning: hooks are not part of a stable React release yet, so use this library only for experimentsβ οΈ
yarn add react-hanger
import React, { Component } from "react";
import {
useInput,
useBoolean,
useNumber,
useArray,
useOnMount,
useOnUnmount
} from "react-hanger";
const App = () => {
const newTodo = useInput("");
const showCounter = useBoolean(true);
const limitedNumber = useNumber(3, { lowerLimit: 0, upperLimit: 5 });
const counter = useNumber(0);
const todos = useArray(["hi there", "sup", "world"]);
const rotatingNumber = useNumber(0, {
lowerLimit: 0,
upperLimit: 4,
loop: true
});
useOnMount(() => console.log("hello world"));
useOnUnmount(() => console.log("goodbye world"));
return (
<div>
<button onClick={showCounter.toggle}> toggle counter </button>
<button onClick={counter.increase}> increase </button>
{showCounter.value && <span> {counter.value} </span>}
<button onClick={counter.decrease}> decrease </button>
<button onClick={todos.clear}> clear todos </button>
<input
type="text"
value={newTodo.value}
onChange={newTodo.onChange}
/>
</div>
);
};
Just an alternative syntax to useState
, because it doesn't need array destructuring.
It returns an object with value
and a setValue
method.
const username = useStateful("test");
username.setValue("tom");
console.log(username.value);
const App = () => {
useOnMount(() => console.log("hello world"));
return <div> hello world </div>;
};
const App = () => {
useOnUnmount(() => console.log("goodbye world"));
return <div> goodbye world </div>;
};
const App = () => {
useLifecycleHooks({
onMount: () => console.log("mounted!"),
onUnmount: () => console.log("unmounted!")
});
return <div> hello world </div>;
};
const showCounter = useBoolean(true);
Methods:
toggle
setTrue
setFalse
const counter = useNumber(0);
const limitedNumber = useNumber(3, { upperLimit: 5, lowerLimit: 3 });
const rotatingNumber = useNumber(0, {
upperLimit: 5,
lowerLimit: 0,
loop: true
});
Methods:
Both increase
and decrease
take an optional amount
argument which is 1 by default, and will override the step
property if it's used in the options.
increase(amount = 1)
decrease(amount = 1 )
Options:
lowerLimit
upperLimit
loop
step
- sets the increase/decrease amount of the number upfront, but it can still be overriden bynumber.increase(3)
ornumber.decrease(5)
const newTodo = useInput("");
<input value={newTodo.value} onChange={newTodo.onChange} />
<input {...newTodo.bindToInput} />
<Slider {...newTodo.bind} />
Methods:
clear
onChange
bindToInput
- binds thevalue
andonChange
props to an input that hase.target.value
bind
- binds thevalue
andonChange
props to an input that's using onlye
inonChange
(like most external components)
Properties:
hasValue
const todos = useArray([]);
Methods:
add
clear
removeIndex
removeById
const { state, setState } = useSetState({ loading: false });
setState({ loading: true, data: [1, 2, 3] });
Methods:
setState(value)
- will merge thevalue
with the currentstate
(like this.setState works in React)
Properties:
state
- the current state
Use it to get the previous value of a prop or a state value.
It's from the official React Docs.
It might come out of the box in the future.
const Counter = () => {
const [count, setCount] = useState(0);
const prevCount = usePrevious(count);
return (
<h1>
Now: {count}, before: {prevCount}
</h1>
);
};