Maneja contadores numéricos con límites automáticos. Incrementa, decrementa, establece y resetea valores fácilmente.
Simplifica el manejo de valores numéricos con límites automáticos. Define mínimo y máximo, y el hook respeta esos límites automáticamente.
import { useCounter } from "@blifedesarrollo/hooks";function Counter() {
const [count, { increment, decrement, set, reset }] = useCounter(5, { min: 0, max: 10 });
return (
<div>
<p>Contador: {count}</p>
<button onClick={decrement}>-</button>
<button onClick={increment}>+</button>
<button onClick={() => set(0)}>Reset a 0</button>
<button onClick={reset}>Reset inicial</button>
</div>
);
}Cómo funciona:
[valor, { increment, decrement, set, reset }]increment() y decrement() cambian el valor en 1set(valor) establece un valor específicoreset() vuelve al valor inicialmin y maxfunction BoundedCounter() {
const [count, { increment, decrement, set, reset }] = useCounter(5, {
min: 0, // No puede bajar de 0
max: 10, // No puede subir de 10
});
return (
<div>
<p>Valor: {count}</p>
<button onClick={decrement} disabled={count <= 0}>
-
</button>
<button onClick={increment} disabled={count >= 10}>
+
</button>
<button onClick={() => set(count + 5)}>+5</button>
<button onClick={reset}>Reset</button>
</div>
);
}const [count, { increment, decrement }] = useCounter(0, {
min: 0, // No permite valores negativos
});const [count, handlers] = useCounter(50, {
max: 100, // No puede pasar de 100
});const [count, handlers] = useCounter(10); // Sin límites (default)
const [count, handlers] = useCounter(); // Inicia en 0function ProductQuantity({ product, onQuantityChange }) {
const [quantity, { increment, decrement, set }] = useCounter(1, {
min: 1,
max: product.stock || 99,
});
useEffect(() => {
onQuantityChange(quantity);
}, [quantity, onQuantityChange]);
return (
<div>
<button onClick={decrement} disabled={quantity <= 1}>
-
</button>
<input
type="number"
value={quantity}
onChange={(e) => set(parseInt(e.target.value) || 1)}
min={1}
max={product.stock}
/>
<button onClick={increment} disabled={quantity >= product.stock}>
+
</button>
</div>
);
}function usePagination(totalItems, itemsPerPage = 10) {
const totalPages = Math.ceil(totalItems / itemsPerPage);
const [
currentPage,
{ increment: nextPage, decrement: prevPage, set: goToPage, reset: goToFirst },
] = useCounter(1, {
min: 1,
max: totalPages,
});
const startIndex = (currentPage - 1) * itemsPerPage;
const endIndex = Math.min(startIndex + itemsPerPage, totalItems);
return {
currentPage,
totalPages,
nextPage,
prevPage,
goToPage,
goToFirst,
goToLast: () => goToPage(totalPages),
startIndex,
endIndex,
hasNextPage: currentPage < totalPages,
hasPrevPage: currentPage > 1,
};
}| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
initialValue | number | No | 0 | Valor inicial del contador |
options.min | number | No | -Infinity | Valor mínimo permitido |
options.max | number | No | Infinity | Valor máximo permitido |
Retorna un array con dos elementos:
const [count, { increment, decrement, set, reset }] = useCounter(initialValue, options);| Elemento | Tipo | Descripción |
|---|---|---|
count | number | Valor actual del contador |
increment | () => void | Incrementa en 1 (respeta max) |
decrement | () => void | Decrementa en 1 (respeta min) |
set | (value: number) => void | Establece un valor (se ajusta a límites) |
reset | () => void | Resetea al valor inicial |
Comportamiento de límites:
set(15) con max: 10 → el valor será 10set(-5) con min: 0 → el valor será 0increment() cuando count === max → no cambiadecrement() cuando count === min → no cambia