You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:06:03