Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React-基于API响应渲染动态组件_Reactjs - Fatal编程技术网

Reactjs React-基于API响应渲染动态组件

Reactjs React-基于API响应渲染动态组件,reactjs,Reactjs,感谢您花时间阅读此文章 我是一个新的反应,我正在努力一点动态渲染组件。从API接收的对象可以任意嵌套到x个级别,需要注入的组件名称可以从be接收 我从API得到的响应如下: { name: 'div' components: [ componentOne: { name: 'div' components: [ { name: 'p', components: [...deeply nested]

感谢您花时间阅读此文章

我是一个新的反应,我正在努力一点动态渲染组件。从API接收的对象可以任意嵌套到x个级别,需要注入的组件名称可以从be接收

我从API得到的响应如下:

{
  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,并在任何结构中添加他想要的组件。所以递归是一种选择,但我很难找到将组件作为动态注入的组件的子组件动态注入的方法。(我希望我没有让你更加困惑)