@idooel/runtime-context
Version:
Runtime data pool with namespaces, stackable contexts, subscriptions and optional persistence. Vue adapter included.
67 lines (51 loc) • 2.27 kB
JavaScript
// 核心库使用示例(不依赖 Vue)
import { createDataPool } from '@idooel/runtime-context/core'
// 1. 创建数据池
const pool = createDataPool()
// 2. 基本读写操作(自动添加 idooel 前缀)
pool.set('user', 'token', 'abc123') // 实际存储为 'idooel.user'
pool.set('user', 'profile', { name: '张三', age: 25 })
pool.set('app', 'theme', 'dark')
// 读取数据
const token = pool.get('user', 'token') // 'abc123'
const profile = pool.get('user', 'profile') // { name: '张三', age: 25 }
const theme = pool.get('app', 'theme', 'light') // 'dark'
console.log('Token:', token)
console.log('Profile:', profile)
console.log('Theme:', theme)
// 查看实际的命名空间(带前缀)
const snapshot = pool.snapshot({ merged: true })
console.log('带前缀的数据结构:', snapshot)
// 3. 订阅数据变更(保持一致性)
const unsubscribe = pool.subscribe({ ns: 'user', key: 'profile' }, (event) => {
console.log('用户资料更新:', event.value)
console.log('命名空间:', event.ns) // 显示 'user',而不是 'idooel.user'
})
// 更新数据会触发订阅
pool.set('user', 'profile', { name: '李四', age: 30 })
// 4. 上下文隔离(也会自动添加前缀)
const userContext = pool.createContext({
user: { role: 'admin' }, // 实际为 'idooel.user'
app: { theme: 'light' } // 实际为 'idooel.app'
})
pool.runInContext(userContext, () => {
// 在上下文中读取,会覆盖全局数据
const theme = pool.get('app', 'theme') // 'light' (来自上下文)
const role = pool.get('user', 'role') // 'admin' (仅存在于上下文)
// 设置数据到当前上下文
pool.set('user', 'permissions', ['read', 'write'])
console.log('上下文中的主题:', theme)
console.log('用户角色:', role)
})
// 退出上下文后,上下文中的数据不可访问
const permissions = pool.get('user', 'permissions') // undefined
console.log('上下文外权限:', permissions)
// 5. 数据快照
const snapshot = pool.snapshot({ merged: true })
console.log('数据快照:', snapshot)
// 6. 清理订阅
unsubscribe()
// 7. 删除和清空操作
pool.delete('user', 'token')
pool.clear('app') // 清除 app 命名空间下的所有数据
pool.clear() // 清除所有数据