react-use-count-up
Version:
A React hook with Typescript typings for animating a number counting up
181 lines (127 loc) • 4.03 kB
Markdown
# react-use-count-up
A React hook with Typescript typings for animating a number counting up
## Installation
```
npm i react-use-count-up
```
## Usage
```javascript
import { useCountUp } from 'react-use-count-up';
const MyComponent = () => {
const value = useCountUp({ start: 0, end: 42, duration: 500 });
return (
<>{value}</>
);
}
```
## Options
`useCountUp` takes a configuration object with the following keys:
### start
the number to start with
### end
the number to end at
### duration
the duration of the animation in miliseconds
### started (optional)
whether the animation has started or not
default `true`
```javascript
import { useState } from 'react';
import { useCountUp } from 'react-use-count-up';
const MyComponent = () => {
const [ started, setStarted ] = useState(false);
const value = useCountUp({ start: 0, end: 42, duration: 500, started });
return (
<>
<div>Value: {value}</div>
<button onClick={() => setStarted(true)}>Start</button>
</>
);
}
```
### formatter (optional)
a function in the form `(value: number) => string` to be applied to the return value
default `v => v.toFixed(0)`
> 📝 If supplying a formatter function, ensure that you provide a constant reference to the useCountUp hook. To prevent unintended re-renders, either create the function outside your component, or memoize it
```javascript
import { useCountUp } from 'react-use-count-up';
// declared outside the component
const formatter = new Intl.NumberFormat('en-CA', { style: 'currency', currency: 'CAD' }).format
const MyComponent = () => {
const value = useCountUp({ start: 0, end: 42, duration: 500, formatter });
return (
<>{value}</>
);
}
```
### easingFunction (optional)
a custom easing function in the form `(t: number, b: number, c: number, d: number) => number` or a string that equals one of the [built-in easing functions](#built-in-easing-functions) used to be used to calculate the return value
default `'easeOutExpo'`
> 📝 If supplying an easing function, ensure that you provide a constant reference to the useCountUp hook. To prevent unintended re-renders, either create the function outside your component, or memoize it.
```javascript
import { useCountUp } from 'react-use-count-up';
// declared outside the component
const easeOutCirc = (t, b, c, d) => {
t /= d;
t--;
return c * Math.sqrt(1 - t * t) + b;
};
const MyComponent = () => {
const value = useCountUp({ start: 0, end: 42, duration: 500, easingFunction: easeOutCirc });
return (
<>{value}</>
);
}
```
## Easing
### Built-in Easing Functions
* linear
* easeOutExpo
* easeInExpo
* easeOutQuad
* easeInQuad
* easeOutCubic
* easeInCubic
* easeOutQuart
* easeInQuart
* easeOutQuint
* easeInQuint
To use one of these built-in easing functions, supply a string to the configuration object
```javascript
const options = {
start: 3,
end: 99,
duration: 2000,
easingFunction: 'easeOutCubic',
...
}
```
### Custom Easing Functions
Custom easing functions are in the form `(t: number, b: number, c: number, d: number) => number` and take the following paramters:
#### t
the amount of time elapsed
#### b
the start value
#### c
the total change (i.e. `end - start`)
#### d
the total duration
They return the how far through the animation we are, from `0` to `1`.
E.g.,
```javascript
const easeOutExpo = (t, b, c, d) => {
return (c * (-Math.pow(2, -10 * t / d) + 1)) + b;
};
```
### Custom Polynomial Higher-Order Function
You can use the custom polynomial higher-order functions `easeOutPoly` or `easeInPoly` to create a polynomial easing function of degree n (n = 1 is equivalent to linear, n = 2 is equivalent to quadradic, n = 3 is equivalent to cubic, etc.).
```javascript
import { easeOutPoly, useCountUp } from 'react-use-count-up';
const easeOutSeptic = easeOutPoly(7);
const MyComponent = () => {
const value = useCountUp({ start: 0, end: 42, duration: 500, easingFunction: easeOutSeptic });
return (
<>{value}</>
);
}
```