自定义 Hooks
📘 useSetState
useSetState
是一个增强版的 useState
Hook,支持:
- 设置对象状态时自动进行合并(类比于
this.setState
) - 状态更新后支持回调函数(拿到更新后的值)
✨ 导入方式
import { useSetState } from '@npmqg/hooks-setstate';
🧪 使用示例
1. 📚 简单对象合并
const [form, setForm] = useSetState({ name: '', age: 0 });
setForm({ name: '张三' });
// form = { name: '张三', age: 0 }
2. 📚 函数式更新 + 回调
setForm(
(prev) => ({ age: prev.age + 1 }),
(nextState) => {
console.log('加1后的年龄:', nextState.age);
},
);
3. 📚 非对象状态支持(如字符串)
const [text, setText] = useSetState('');
setText('Hello World');
// text = 'Hello World'
4. 📚 第三个参数获取实时最新值
const [textValue, setTextValue, getTextValue] = useSetState('');
setTextValue(123);
//能够同步获取到设置完毕的值
const currText = getTextValue();
🧩 类型定义
type SetStateAction<S> = S | ((prevState: S) => S);
type Dispatch<A> = (value: A, callback?: Function) => void;
📚 参数
参数名 | 类型 | 说明 |
---|---|---|
initialState | T | 初始状态值 |
📚 返回值
变量名 | 类型 | 说明 |
---|---|---|
state | T | 当前状态值 |
setState | (value: T | ((prev: T) => T), callback?: Function) => void | 更新状态并可选回调 |
⚙️ 功能特性
📚 支持对象状态合并(浅合并)
setState({ age: 18 });
setState({ name: 'Tom' });
// => 最终 state = { age: 18, name: 'Tom' }
📚 支持回调函数获取最新 state
setState({ name: 'Lucy' }, (newState) => {
console.log('更新后的状态:', newState);
});
📌 注意事项
- 若传入的是对象,默认会进行浅合并;
- 如果传入非对象(如字符串、数字、数组等),将直接替换原状态;
- 回调函数将在状态更新后立即执行,等效于
useLayoutEffect
的触发顺序; - 内部通过
useRef
存储回调函数,避免闭包陷阱。
✅ 适用场景
- 表单管理(多字段合并)
- 页面状态切片维护
- 替代
useReducer
的轻量对象状态合并需求 - 状态更新后需要获取最新值(如滚动 s、动画、接口请求)
⚡ useElectron
useElectron
是一个自定义 React Hook,帮助你在 Electron 渲染进程中获取主进程提供的 Electron API。它通过 window.require('electron')
获取 Electron 的模块,仅在 Electron 环境下生效,适合 React 应用中条件性使用 Electron 功能。
📥 导入方式
import useElectron from '@/hooks/useElectron';
✅ 使用示例
📚 示例 1:访问 ipcRenderer
const electron = useElectron();
useEffect(() => {
if (electron) {
electron.ipcRenderer.send('event-name', { data: 123 });
}
}, []);
📚 示例 2:条件渲染与容错处理
const electron = useElectron();
return <div>{electron ? "当前在 Electron 中运行" : "非 Electron 环境"}</div>;
🧩 返回值
返回值名 | 类型 | 说明 | |
---|---|---|---|
electron | `Electron | null` | Electron 模块对象,如果当前不在 Electron 环境中则为 null |
📌 注意事项
- 本 Hook 只能在 Electron 渲染进程(带有 Node 环境)中使用;
- 在浏览器中运行(如 Vite 开发时),
electron
为null
,请注意做非空判断; - 不支持在严格禁用
nodeIntegration
的环境中运行(除非通过 preload.js 暴露接口); - 如果你使用了
contextIsolation: true
,应通过window.electronAPI
注入而非window.require
。
🚀 适用场景
- 在 React 组件中安全地访问 Electron 的
ipcRenderer
、remote
、shell
等 API; - 区分 Web 与 Electron 环境,做功能降级或条件渲染;
- 封装 Electron 逻辑时的基础模块判断工具。