合并React Provider列表时生成匿名HTML元素的问题如何解决?
问题根因
递归合并Provider时生成的中间包装组件是未命名箭头函数,未设置displayName属性,React DevTools无法读取可读名称,因此显示为Anonymous。此外你调用BuildProviderTree时多余的展开运算符属于隐藏bug:函数定义接收单个数组参数,你传入...[xxx]相当于将数组元素逐个作为参数传入,会导致函数入参异常。
修复方案
方案1:改用reduce实现(更简洁,无递归冗余)
export function BuildProviderTree(providers) { return providers.reduce((Accumulated, Current) => { const Wrapper = ({ children }) => ( <Accumulated> <Current>{children}</Current> </Accumulated> ); // 显式设置displayName供DevTools识别 Wrapper.displayName = `ProviderMerge(${Accumulated.displayName || Accumulated.name}, ${Current.displayName || Current.name})`; return Wrapper; }); }
方案2:修改原有递归代码,补充displayName
export function BuildProviderTree(providers) { if (providers.length === 1) { return providers[0]; } const A = providers.shift(); const B = providers.shift(); const Combined = ({ children }) => ( <A> <B>{children}</B> </A> ); Combined.displayName = `ProviderMerge(${A.displayName || A.name}, ${B.displayName || B.name})`; return BuildProviderTree([ Combined, ...providers, ]); }
调用代码修正
去掉多余的展开运算符:
const Providers = BuildProviderTree([ HeaderBarProvider, CreditsProvider, BundlesProvider, ContactsProvider, PhoneVerificationProvider, PurchaseProvider, RanksProvider, RoleWizardProvider, BasesProvider, DepsProvider, TitlesProvider, UrlsProvider, ]);
额外优化建议
所有自定义Provider建议显式设置displayName属性,避免生产环境代码压缩后函数名丢失,导致DevTools显示异常。
内容的提问来源于stack exchange,提问作者user17498878
相关产品推荐
相关产品推荐

