如何在map遍历中无需临时变量直接渲染JS对象存储的React组件?
正确实现方案
你想要省略临时变量的需求有两种合法实现方式,需要注意不能直接把组件当成普通函数调用,直接调用sections[section.type](props)会绕过React的组件调度逻辑,违反hooks规则,在使用dynamic导入的场景下还会导致加载状态异常。
方案1:使用React.createElement(最贴近你想要的函数调用写法)
React.createElement是JSX语法的底层实现,完全符合你期望的调用形式:
export default function Page({ page }) { return ( <main> {page.sections.map((section, index) => React.createElement( sections[section.type] || null, { key: `${pageKey}-${index}`, id: index, fields: section.fields } ) )} </main> ); }
方案2:用括号包裹动态组件直接写JSX
如果更习惯JSX写法,只需要用括号把动态取到的组件表达式包裹起来即可,JSX会自动识别括号内的结果为自定义组件,不会当成原生DOM标签处理:
export default function Page({ page }) { return ( <main> {page.sections.map((section, index) => ( <(sections[section.type] || null) key={`${pageKey}-${index}`} id={index} fields={section.fields} /> ))} </main> ); }
注意事项
两种写法的效果和你原来的写法完全等价,性能、生命周期行为没有任何区别,可以根据团队编码习惯选择。
内容的提问来源于stack exchange,提问作者Darkbound
相关产品推荐
相关产品推荐

