导出React Hook时如何修改其名称及返回值的属性名?
实现方案
直接使用as重命名导出只能修改钩子本身的导出名称,无法修改钩子返回值的内部属性,所以需要对原useSnackbar做一层简单的自定义封装,完成属性名映射:
第一步:修改公共导出逻辑
在你原来导出notistack能力的文件中,替换原有重导出逻辑为以下代码:
import { SnackbarProvider, useSnackbar } from 'notistack'; // Provider直接重命名导出即可,使用方式完全不变 export { SnackbarProvider as ToastProvider }; // 自定义封装useToast,完成返回属性的重命名 export const useToast = () => { const { enqueueSnackbar, closeSnackbar, ...otherProps } = useSnackbar(); return { // 映射你需要的属性名 addToast: enqueueSnackbar, closeToast: closeSnackbar, // 原钩子返回的其他属性原样返回,避免能力缺失 ...otherProps }; };
第二步:业务中按预期调用
封装完成后,业务代码的使用完全符合你的要求:
// 导入你封装的useToast import { useToast } from '你的公共导出文件路径'; // 解构使用 const { addToast, closeToast } = useToast(); // 调用方式和原API完全一致,不需要修改业务逻辑 addToast('提交成功', { variant: 'success' });
可选:TypeScript类型适配
如果你的项目使用TypeScript,可以补充类型定义保证类型提示正常:
import type { OptionsObject, SnackbarKey, SnackbarMessage, SnackbarProviderProps } from 'notistack'; import { SnackbarProvider, useSnackbar } from 'notistack'; export type ToastProviderProps = SnackbarProviderProps; export { SnackbarProvider as ToastProvider }; type UseToastReturn = { addToast: (message: SnackbarMessage, options?: OptionsObject) => SnackbarKey; closeToast: (key?: SnackbarKey) => void; } & Omit<ReturnType<typeof useSnackbar>, 'enqueueSnackbar' | 'closeSnackbar'>; export const useToast = (): UseToastReturn => { const { enqueueSnackbar, closeSnackbar, ...rest } = useSnackbar(); return { addToast: enqueueSnackbar, closeToast: closeSnackbar, ...rest }; };
内容的提问来源于stack exchange,提问作者Alper
相关产品推荐
相关产品推荐

