@pinia/plugin-debounce
Version:
Debounce any action in your pinia 🍍 store!
101 lines (80 loc) • 2.35 kB
Markdown
<h1>
<img height="64" src="https://pinia.esm.dev/logo.svg" alt="Pinia logo">
Pinia Debounce
</h1>
<a href="https://npmjs.com/package/@pinia/plugin-debounce">
<img src="https://badgen.net/npm/v/@pinia/plugin-debounce/latest" alt="npm package">
</a>
<a href="https://github.com/posva/pinia-plugin-debounce/actions/workflows/test.yml">
<img src="https://github.com/posva/pinia-plugin-debounce/workflows/test/badge.svg" alt="build status">
</a>
<a href="https://codecov.io/gh/posva/pinia-plugin-debounce">
<img src="https://codecov.io/gh/posva/pinia-plugin-debounce/branch/main/graph/badge.svg?token=9WqnRrLf1Q"/>
</a>
Debounce any action in your pinia 🍍 store!
This is also a very good example of **how to create a pinia plugin and how to type it**.
## Installation
```sh
npm install /plugin-debounce
```
You also need to use a `debounce` function like [lodash.debounce](https://lodash.com/docs/4.17.15#debounce) or [ts-debounce](https://github.com/chodorowicz/ts-debounce)
## Usage
```js
import { debounce } from 'ts-debounce'
import { PiniaDebounce } from '@pinia/plugin-debounce'
// Pass the plugin to your application's pinia plugin
pinia.use(PiniaDebounce(debounce))
```
You can then use a `debounce` option in your stores:
```js
defineStore('id', {
actions: {
someSearch() {
// ...
},
other() {
// ...
},
},
debounce: {
// debounce all `someSearch` calls by 300ms
someSearch: 300,
// you can pass an array of arguments if your debounce implementation accepts extra arguments
someSearch: [
300,
{
// options passed to debounce
isImmediate: true,
},
],
},
})
```
For setup stores, options are in a second arugment:
```js
defineStore(
'id',
() => {
// ...the store
return { someSearch }
},
{
debounce: {
// debounce all `someSearch` calls by 300ms
someSearch: 300,
},
}
)
```
### Extended TypeScript support
By default, extra arguments passed to your `debounce` implementation are not typed. This can be changed by extending the `Config` interface in any of your ts files:
```ts
import { debounce } from 'ts-debounce'
declare module '@pinia/plugin-debounce' {
export interface Config {
Debounce: typeof debounce
}
}
```
## License
[MIT](http://opensource.org/licenses/MIT)