Reactjs React-基于API响应渲染动态组件
感谢您花时间阅读此文章 我是一个新的反应,我正在努力一点动态渲染组件。从API接收的对象可以任意嵌套到x个级别,需要注入的组件名称可以从be接收 我从API得到的响应如下:Reactjs React-基于API响应渲染动态组件,reactjs,Reactjs,感谢您花时间阅读此文章 我是一个新的反应,我正在努力一点动态渲染组件。从API接收的对象可以任意嵌套到x个级别,需要注入的组件名称可以从be接收 我从API得到的响应如下: { name: 'div' components: [ componentOne: { name: 'div' components: [ { name: 'p', components: [...deeply nested]
{
name: 'div'
components: [
componentOne: {
name: 'div'
components: [
{
name: 'p',
components: [...deeply nested]
},
{
name: 'h1',
components: [...deeply nested]
}
]
}
componentTwo: {
name: 'nav',
components: [...]
}
]
}
您必须处理不同类型的节点(至少是文本),但只需沿着树(API响应)走下去并根据它构建一个React节点树: 因此,节点定义如下所示(这是伪语法,不应该出现在代码中): 因此,api的实际响应可能是:
{
type: 'element',
name: 'div',
children: [
{
type: 'element',
name: 'div',
children: [
{
type: 'element',
name: 'h1',
children: [
{ type: 'text', value: 'Title 1' }
]
},
{
type: 'element',
name: 'p',
children: [
{ type: 'text', value: 'This is a paragraph' }
]
}
]
},
{
type: 'element',
name: 'nav',
children: []
}
]
}
我们将此解析为对象的响应传递给GenerateTreNode方法:
/**
* @param {object} apiResponse
* @returns {ReactNode}
*/
function generateTreeNode(apiResponse) {
switch (apiResponse.type) {
case 'element':
return React.createElement(apiResponse.name, { children: apiResponse.children.map(child => generateTreeNode(child)) });
case 'text':
return apiResponse.value;
default: // no default
}
}
注意,递归调用将确保整个apiResponse树被遍历
就这样。这是未经测试的,但应该可以很好地工作:generateTreeNode函数的返回值可以用作render方法的返回值
您应该了解使用它的主要资源是和
此外,请随意(而且您应该)扩展api响应结构,并步行处理:
- 自定义组件(必须以某种方式导入)
- 附加元素道具(例如样式或类名)
- 等等
还请注意,此代码假定响应的根是一个节点(记住React如何在渲染方法中不让您同时返回多个节点,这就是为什么将数组和片段放在一边)您必须处理不同类型的节点(至少是文本),但这只是一个沿着树走的问题(API响应)并根据其建立反应节点树: 因此,节点定义如下所示(这是伪语法,不应该出现在代码中): 因此,api的实际响应可能是:
{
type: 'element',
name: 'div',
children: [
{
type: 'element',
name: 'div',
children: [
{
type: 'element',
name: 'h1',
children: [
{ type: 'text', value: 'Title 1' }
]
},
{
type: 'element',
name: 'p',
children: [
{ type: 'text', value: 'This is a paragraph' }
]
}
]
},
{
type: 'element',
name: 'nav',
children: []
}
]
}
我们将此解析为对象的响应传递给GenerateTreNode方法:
/**
* @param {object} apiResponse
* @returns {ReactNode}
*/
function generateTreeNode(apiResponse) {
switch (apiResponse.type) {
case 'element':
return React.createElement(apiResponse.name, { children: apiResponse.children.map(child => generateTreeNode(child)) });
case 'text':
return apiResponse.value;
default: // no default
}
}
注意,递归调用将确保整个apiResponse树被遍历
就这样。这是未经测试的,但应该可以很好地工作:generateTreeNode函数的返回值可以用作render方法的返回值
您应该了解使用它的主要资源是和
此外,请随意(而且您应该)扩展api响应结构,并步行处理:
- 自定义组件(必须以某种方式导入)
- 附加元素道具(例如样式或类名)
- 等等
还要注意,这段代码假设您的响应根是一个节点(记住React不允许您在渲染方法中一次返回多个节点,数组和片段除外,这就是原因)嗨,我觉得这里没有明确的问题。你们能进一步描述一下你们想做什么,你们尝试了什么,以及你们在尝试时遇到了什么问题吗?Hi@remix,基本上目标是基于API响应呈现组件。因此,从发布的示例中,我需要将smtgh呈现为这样:
主要问题是,我不知道嵌套的深度,因为用户能够在CMS中构建UI,并在任何结构中添加他想要的组件。所以递归是一种选择,但我很难找到将组件作为动态注入的组件的子组件动态注入的方法。(我希望我没有让你更加困惑)嗨,我觉得这里没有明确的问题。你们能进一步描述一下你们想做什么,你们尝试了什么,以及你们在尝试时遇到了什么问题吗?Hi@remix,基本上目标是基于API响应呈现组件。因此,从发布的示例中,我需要将smtgh呈现为这样:
主要问题是,我不知道嵌套的深度,因为用户能够在CMS中构建UI,并在任何结构中添加他想要的组件。所以递归是一种选择,但我很难找到将组件作为动态注入的组件的子组件动态注入的方法。(我希望我没有让你更加困惑)