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

如何多次导入同一React组件并为其设置不同的displayName

问题根源

你通过import {Button as Btn, Button as MyBtn}导入的两个重命名组件,本质是对同一个组件对象的引用,起别名不会生成新的独立组件实例。所以你两次修改displayName都是在修改同一个对象的属性,最终只会保留最后一次的赋值结果。

解决方案

要实现不同的displayName,你需要生成两个完全独立的组件实例,有以下两种常用实现方式:

方案1:手动包裹生成独立组件

直接定义新的组件透传原Button的所有属性,生成独立实例后分别设置displayName,适合需要少量重命名组件的场景:

import { Button } from 'design-system';

export const Btn = (props) => <Button {...props} />;
Btn.displayName = 'Btn';

export const MyBtn = (props) => <Button {...props} />;
MyBtn.displayName = 'MyBtn';

如果需要批量生成多个重命名组件,可以封装通用的包裹函数:

import { Button } from 'design-system';

const wrapButton = (Component) => (props) => <Component {...props} />;

const Btn = wrapButton(Button);
Btn.displayName = 'Btn';
const MyBtn = wrapButton(Button);
MyBtn.displayName = 'MyBtn';

方案2:使用React内置API生成独立实例

如果你需要组件缓存能力,也可以用React.memo包裹原组件,天然会生成新的独立实例:

import { Button } from 'design-system';
import { memo } from 'react';

const Btn = memo(Button);
Btn.displayName = 'Btn';

const MyBtn = memo(Button);
MyBtn.displayName = 'MyBtn';

如果你使用TypeScript,可以为包裹函数增加泛型保证类型和原Button完全一致:

import type { ComponentType } from 'react';
import { Button, type ButtonProps } from 'design-system';

const wrapButton = <P extends object>(Component: ComponentType<P>) => (props: P) => <Component {...props} />;

const Btn = wrapButton<ButtonProps>(Button);
Btn.displayName = 'Btn';

内容的提问来源于stack exchange,提问作者Ale TheFe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:06:04