vue-composable
![vue-composable logo](https://pikax.me/vue-composable/assets/logo.svg)
![bundle size](https://badgen.net/bundlephobia/minzip/vue-composable)
Out-of-the-box ready to use composables
- 🌴 TreeShakable
- 🧙♂️ Fully Typescript
- 💚 Vue 3 and 2 support
- 🔨 Vue Devtools support
Introduction
This library aim is to be one stop shop for many real-world composable functions, with aggressive tree-shaking to keep it light on your end code.
Installing
yarn add @vue/composition-api vue-composable
npm install @vue/composition-api vue-composable
yarn add vue-composable
npm install vue-composable
Documentation
Check our documentation
Composable
Event
- Event - Attach event listener to a DOM element
- Mouse Move - Attach
mousemove
listener to a DOM element - Resize - Attach
resize
listener to a DOM element - Scroll - Attach
scroll
listener to a DOM element - onOutsidePress - Execute callback when click is outside of element
Dom
Date
- useNow : Return reactive custom timer with specified refresh rate
- useDateNow : Returns reactive
Date.now()
with custom refresh rate - usePerformanceNow : Returns reactive
performance.now()
with custom refresh rate
Format
- format - Reactive string format
- path - Retrieve object value based on string path
Breakpoint
MISC
Storage
- WebStorage - Reactive access to
Storage API
, useLocalStorage
and useSessionStorage
use this - storage - uses
localStorage
or on safari private it uses sessionStorage
- localStorage - Reactive access to a
localStorage
- sessionStorage - Reactive access to a
sessionStorage
Validation
i18n
- i18n - Simple i18n implementation with API inspired by vue-i18n
Intl
Promise
Meta
- Title - reactive
document.title
State
- Timeline - Tracks variable history
- Undo - Tracks variable history, to allow
undo
and redo
- valueSync - syncs variables value, across multiple
ref
s
Web
External
New packages needed
Information
This is a monorepo project, please check packages
Devtools
There's some experimental devtools support starting from 1.0.0-beta.6
, only available for vue-next
and devtools beta 6
.
Install plugin
To use devtools you need to install the plugin first:
import { createApp } from "vue";
import { VueComposableDevtools } from "vue-composable";
import App from "./App.vue";
const app = createApp(App);
app.use(VueComposableDevtools);
app.use(VueComposableDevtools, {
id: "vue-composable",
label: "devtool composables"
});
app.mount("#app");
Component State
To add properties to the component inspector tab
ComponentState
const bar = "bar";
useDevtoolsComponentState(
{
bar
},
{
type: "custom composable"
}
);
const baz = () => "baz";
useDevtoolsComponentState({ baz });
useDevtoolsComponentState({ baz });
const the = 42;
useDevtoolsComponentState({ the });
useDevtoolsComponentState({ the }, { duplicate: true });
interface StateBase {
key: string;
value: any;
editable: boolean;
objectType?: "ref" | "reactive" | "computed" | "other";
raw?: string;
type?: string;
}
useDevtoolsComponentState([
{
key: "_bar",
type: "direct",
value: "bar",
editable: true
},
{
key: "_baz",
type: "direct",
value: "baz",
editable: false
}
]);
useDevtoolsComponentState((payload, ctx) => {
payload.state.push(
...[
{
key: "_bar",
type: "raw",
value: "bar",
editable: true
},
{
key: "_baz",
type: "raw",
value: "baz",
editable: false
}
]
);
});
Timeline events
To add timeline events:
const id = "vue-composable";
const label = "Test events";
const color = 0x92a2bf;
const { addEvent, pushEvent } = useDevtoolsTimelineLayer(
id,
description,
color
);
addEvent({
time: Date.now(),
data: {
},
meta: {
}
});
pushEvent({
data: {
},
meta: {
}
});
Inspector
Allows to create a new inspector for your data.
I'm still experimenting on how to expose this API on a composable, this will likely to change in the future, suggestions are welcome.
useDevtoolsInspector(
{
id: "vue-composable",
label: "test vue-composable"
},
[
{
id: "test",
label: "test - vue-composable",
depth: 0,
state: {
composable: [
{
editable: false,
key: "count",
objectType: "Ref",
type: "setup",
value: myRefValue
}
]
}
}
]
);
Typescript
Typescript@3.x
is not supported, the supported version can be checked on package.json, usually is the latest version or the same major as vue-3
Contributing
You can contribute raising issues and by helping out with code.
Tests and Documentation are the most important things for me, because good documentation is really useful!
I really appreciate some tweaks or changes on how the documentation is displayed and how to make it easier to read.
Twitter: @pikax_dev
Build
yarn
yarn build --version=2
yarn test:vue2
yarn build
yarn test
New composable
- Fork it!
- Create your feature branch:
git checkout -b feat/new-composable
- Commit your changes:
git commit -am 'feat(composable): add a new composable'
- Push to the branch:
git push origin feat/new-composable
- Submit a pull request
License
MIT