数据库 Hooks
用于数据库操作的 React Hooks
useDatabaseInit
初始化数据库的 Hook。
import { useDatabaseInit } from '@linch-tech/desktop-core';
function App() {
const { isReady, error } = useDatabaseInit();
if (error) {
return <div>数据库初始化失败: {error.message}</div>;
}
if (!isReady) {
return <div>正在初始化数据库...</div>;
}
return <MainApp />;
}返回值
interface UseDatabaseInit {
isReady: boolean; // 数据库是否就绪
error: Error | null; // 初始化错误
}参数
useDatabaseInit(options?: DatabaseInitOptions)
interface DatabaseInitOptions {
name?: string; // 数据库名(默认 'app.db')
migrations?: Migration[]; // 迁移列表
}通常不需要手动调用此 Hook。LinchDesktopProvider 会自动处理数据库初始化。
useSetting
读写单个设置的 Hook。
import { useSetting } from '@linch-tech/desktop-core';
function SettingsPage() {
const { value, setValue, isLoading, error } = useSetting<string>('theme', {
defaultValue: 'light',
});
if (isLoading) return <div>加载中...</div>;
return (
<select
value={value ?? 'light'}
onChange={(e) => setValue(e.target.value)}
>
<option value="light">浅色</option>
<option value="dark">深色</option>
</select>
);
}返回值
interface UseSettingReturn<T> {
value: T | null; // 当前值
setValue: (value: T) => Promise<void>; // 更新值
isLoading: boolean; // 是否加载中
error: Error | null; // 错误信息
}参数
useSetting<T>(key: string, options?: UseSettingOptions<T>)
interface UseSettingOptions<T> {
defaultValue?: T; // 默认值
}示例
// 布尔值设置
const { value: notifications, setValue: setNotifications } = useSetting<boolean>(
'notifications',
{ defaultValue: true }
);
// JSON 对象设置
interface UserPreferences {
fontSize: number;
sidebarOpen: boolean;
}
const { value: prefs, setValue: setPrefs } = useSetting<UserPreferences>(
'preferences',
{ defaultValue: { fontSize: 14, sidebarOpen: true } }
);useAppState
持久化 UI 状态的 Hook。
import { useAppState } from '@linch-tech/desktop-core';
function Sidebar() {
const { state: isOpen, setState: setIsOpen, isLoading } = useAppState<boolean>(
'sidebarOpen',
true
);
if (isLoading) return null;
return (
<aside style={{ width: isOpen ? 200 : 50 }}>
<button onClick={() => setIsOpen(!isOpen)}>
{isOpen ? '收起' : '展开'}
</button>
</aside>
);
}返回值
interface UseAppStateReturn<T> {
state: T | null; // 当前状态
setState: (value: T) => Promise<void>; // 更新状态
isLoading: boolean; // 是否加载中
}参数
useAppState<T>(key: string, defaultValue?: T)useSetting vs useAppState
| 特性 | useSetting | useAppState |
|---|---|---|
| 用途 | 用户偏好设置 | UI 状态持久化 |
| 存储表 | settings | app_state |
| 典型场景 | 主题、语言、通知开关 | 侧边栏展开、列表排序 |
存储格式
设置和状态以 JSON 格式存储在 SQLite 数据库中:
-- settings 表
INSERT INTO settings (key, value) VALUES ('theme', '"dark"');
-- app_state 表
INSERT INTO app_state (key, value) VALUES ('sidebarOpen', 'true');注意事项
这些 Hooks 需要 features.database 为 true(默认启用)才能使用。
复杂对象会自动序列化/反序列化为 JSON。