Create the powerful singleton easily
npm install use-singleton




> Create the powerful singleton easily.
- Lazy or Immediately
- Refresh
- Cache value
- Support cjs, ejs, umd
- Typescript
- Zero dependence
- Side-effect free
- Only ~.5kb after gzipped
``bash`
npm install use-singleton --save
`html
// es2015+
`
`javascript
import { useSingleton, useSingle } from "use-singleton";
// the simple
const [getter, setter] = useSingle(initialValue);
// the powerful
const getSingleton = useSingleton(createInstance, options);
`
`javascript
const [getCount, setCount] = useSingle(0);
getCount(); // -> 0
setCount(1);
getCount(1); // -> 1
// vue
const [getCount, setCount] = useSingle(ref(0));
watch(getCount, (val) => console.log(val));
setCount(1);
// log -> 1
getCount().value; // -> 1
`
#### Lazy
`javascript
const getNumber = useSingleton(() => {
console.log("created");
return 1;
});
getNumber();
// log -> 'created'
// -> 1
getNumber(); // -> 1
`
#### Immediately
`javascript
const getNumber = useSingleton(
() => {
console.log("created");
return 1;
},
{
immediately: true,
}
);
// log -> 'created'
getNumber();
// -> 1
`
#### Async
`javascripthttps://foo.bar/api/server-info
const getServerInfo = useSingleton(
() => {
console.log('fetch data')
return await api.get()
}
);
await getServerKey()
// log -> 'fetch data'
// -> server-info
await getServerKey()
// -> server-info
await getServerKey(null,{ refresh: true})
// log -> 'fetch data'
// -> server-info_new
await getServerKey()
// -> server-info_new
`
#### With key
`javascriptfetch user info: ${userId}
const getUserInfo = useSingleton(
async (key) => {
const userId = key;
console.log();https://foo.bar/api/user?id=${userId}
userInfo = await api.get();
return userInfo;
},
{
withKey: true,
}
);
await Promise.all[(getUserInfo(1), getUserInfo(1), getUserInfo(2))];
// log -> 'fetch user info: 1'
// log -> 'fetch user info: 2'
// -> [userInfo_1, userInfo_1, userInfo_2]
await getUserInfo(1);
// log -> 'fetch user info: 1'
// -> userInfo_1
`
#### Key cache
> To use the key cache, withKey must be set to true.
`javascriptfetch user info: ${userId}
const getUserInfo = useSingleton(
async (key) => {
const userId = key;
console.log();https://foo.bar/api/user?id=${userId}
userInfo = await api.get();
return userInfo;
},
{
withKey: true,
keyCache: true,
}
);
await Promise.all[(getUserInfo(1), getUserInfo(1), getUserInfo(2))];
// log -> 'fetch user info: 1'
// log -> 'fetch user info: 2'
// -> [userInfo_1, userInfo_1, userInfo_2]
await getUserInfo(1);
// form cache -> userInfo_1
await getUserInfo(1, { refresh: false });
// log -> 'fetch user info: 1'
// -> userInfo_1
``