将多级 JSON 菜单转换为多级 JSX/HTML 菜单

2023-11-25

我在用智能菜单创建一个下拉菜单。但是,我想动态创建菜单。 React 应用程序将向 API 服务器查询 JSON 代码,并据此构建菜单。我正在尝试找出一种将 JSON 代码转换为 HTML/JSX 代码的方法:

从 API 检索到的 JSON 代码将如下所示:

{
        "module_type": "menu",
        "title": "My Site",
        "menu": [
                {
                        "link": "/home",
                        "title": "Home"
                },
                {
                        "link": "#",
                        "title": "Fruit",
                        "menu": [
                                {
                                        "link": "/apples",
                                        "title": "Apples"
                                },
                                {
                                        "link": "/bananas",
                                        "title": "Bananas"
                                },
                                {
                                        "link": "/kiwi",
                                        "title": "Kiwi"
                                },
                                {
                                        "link": "/pears",
                                        "title": "Pears"
                                }
                        ]
                },
                {
                        "link": "#",
                        "title": "Vegetables",
                        "menu": [
                                {
                                        "link": "/carrots",
                                        "title": "Carrots"
                                },
                                {
                                        "link": "/celery",
                                        "title": "Celery"
                                },
                                {
                                        "link": "/potatoes",
                                        "title": "Potatoes"
                                },
                                {
                                        "link": "#",
                                        "title": "More",
                                        "menu": [
                                              {
                                                      "link": "/thirdlevel1",
                                                      "title": "3rd level menu"
                                              },
                                              {
                                                      "link": "/thirdlevel2",
                                                      "title": "3rd level two"
                                              }
                                        ]
                               }
                        ]
                },
                {
                        "link": "/about",
                        "title": "About"
                },
                {
                        "link": "/contact",
                        "title": "Contact"
                }
        ]
}

基于此 JSON 数据,我想生成以下 HTML/JSX 代码:

<nav className="main-nav" role="navigation">

  <input id="main-menu-state" type="checkbox" />
  <label className="main-menu-btn" htmlFor="main-menu-state">
    <span className="main-menu-btn-icon"></span> Toggle main menu visibility
  </label>

  <h2 className="nav-brand"><a href="#">My Site</a></h2>


  <ul id="main-menu" className="sm sm-blue">
    <li className="nav-item"><Link to="/">Home</Link></li>
    <li><a href="#">No Fruit</a>
      <ul>
        <li><Link to="/apples">Apples</Link></li>
        <li><Link to="/bananas">Bananas</Link></li>
        <li><Link to="/kiwi">Kiwi</Link></li>
        <li><Link to="/pears">Pears</Link></li>
      </ul>
    </li>
    <li><a href="#">Vegetables</a>
      <ul>
        <li className="nav-item"><Link to="/carrots">Carrots</Link></li>
        <li className="nav-item"><Link to="/celery">Celery</Link></li>
        <li className="nav-item"><Link to="/potatoes">Potatoes</Link></li>
        <li><a href="#">more...</a>
          <ul>
            <li><a href="#>3rd level menu</a></li>
              <li><a href="#>3rd level two</a></li>
          </ul>
        </li>
      </ul>
    </li>
    <li className="nav-item"><Link to="/about">About</Link></li>
    <li className="nav-item"><Link to="/contact">Contact</Link></li>
  </ul>
</nav>

以下链接提供了解决方案:使用 Javascript 将嵌套 JSON 转换为 HTML 嵌套列表。但是,这似乎不适用于 JSX,因为您无法将 document.createElement() 与 React/JSX 元素一起使用。

鉴于我正在使用多层菜单,在 React 中混合 JSX 和 html 元素来实现此目的的有效方法是什么?


这是使用 JSX 和示例数据动态生成的菜单。

正如您所看到的,我们在构建 JSX 时递归地迭代您的菜单项:

const renderMenu = items => {
  return <ul>
    { items.map(i => {
      return <li>
        <a href={i.link}>{ i.title }</a>
        { i.menu && renderMenu(i.menu) }
      </li>
    })}
  </ul>
}

const Menu = ({ data }) => {
  return <nav>
    <h2>{ data.title }</h2>
    { renderMenu(data.menu) }
  </nav>
}

ReactDOM.render(
  <Menu data={data} />,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script>
  // The sample data is declared here, only to keep the React example short and clear
  const data = {
    "module_type": "menu",
    "title": "My Site",
    "menu": [{
        "link": "/home",
        "title": "Home"
      },
      {
        "link": "#",
        "title": "Fruit",
        "menu": [{
            "link": "/apples",
            "title": "Apples"
          },
          {
            "link": "/bananas",
            "title": "Bananas"
          },
          {
            "link": "/kiwi",
            "title": "Kiwi"
          },
          {
            "link": "/pears",
            "title": "Pears"
          }
        ]
      },
      {
        "link": "#",
        "title": "Vegetables",
        "menu": [{
            "link": "/carrots",
            "title": "Carrots"
          },
          {
            "link": "/celery",
            "title": "Celery"
          },
          {
            "link": "/potatoes",
            "title": "Potatoes"
          },
          {
            "link": "#",
            "title": "More",
            "menu": [{
                "link": "/thirdlevel1",
                "title": "3rd level menu"
              },
              {
                "link": "/thirdlevel2",
                "title": "3rd level two"
              }
            ]
          }
        ]
      },
      {
        "link": "/about",
        "title": "About"
      },
      {
        "link": "/contact",
        "title": "Contact"
      }
    ]
  }
</script>
<div id="container"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多级 JSON 菜单转换为多级 JSX/HTML 菜单 的相关文章

  • 茉莉花单元测试 - 测试对象的未定义属性

    我有以下声明 expect A BAR name toEqual foo 由于我的对象 A 具有顶级属性 BAR 并且 bar 具有值 foo 传递 我想测试我的结构以确认属性 NONEXISTINGPROP 尚未定义 例如 expect
  • 在 angularjs 模块初始化期间有条件地注入依赖项

    我有一个角度模块 我想有条件地将依赖项注入其中 IE var myapp angular module myapp ngRoute myappcontroller ngGrid I want to include ngGrid only i
  • Strapi 未加载 Digital Ocean 上托管的现有 MongoDB 中的集合

    我正在使用 Strapi 创建一个新应用程序 并尝试将其与托管在 Digital Ocean 上的 MongoDB 连接 但不幸的是Strapi 无法从现有 MongoDB 获取集合 在这里 我提到我实现 Strapi 与现有 MongoD
  • 变量前面加双下划线

    我的节点代码中有以下代码片段 var fs require fs fs readdir dirname function err files console log files 为什么变量 dirname 有双下划线 我知道一个下划线是私有
  • 语法:const {} = 变量名,任何人都可以解释或指出我正确的方向[重复]

    这个问题在这里已经有答案了 这个语法在 JavaScript 中意味着什么 可能是 ES6 const 变量名 我目前正在尝试掌握 React 在很多例子中我都遇到过这种语法 例如 const girls guys women men st
  • JavaScript 原型 - 请澄清

    有人可以帮我理解原型属性吗 我不明白原型属性是函数的属性还是函数内部的属性 假设我们创建以下构造函数 Food 此时 函数 Food 具有 Food prototype 属性 由于 Food 是 Object 的实例 因此这意味着 Obec
  • 数据表“footerCallback”函数未在页脚中显示结果

    我尝试获取每列的总和并将结果显示在页脚中 我在用着 页脚回调 https datatables net reference option footerCallbackDatatables提供的功能 但是它在页脚中没有显示任何内容 数据表解释
  • AngularJS - 服务、工厂、过滤器等中的依赖注入

    因此 我想在我的 Angular 应用程序中使用一些插件和库 目前 我只是引用这些函数 方法 因为它们是在 99 的应用程序中以完全忽略依赖注入的方式使用的 我有 例如 javascript 库 MomentJS 它处理格式化和验证日期 并
  • 属性访问器(getter)的扩展运算符问题

    我很难理解为什么以下代码存在一些问题https jsfiddle net q4w6e3n3 3 https jsfiddle net q4w6e3n3 3 Note 所有示例均在 chrome 版本 52 0 2743 116 中进行测试
  • 添加选项以选择框而不用 Internet Explorer 关闭该框?

    我正在尝试构建一个包含多个下拉选择框的网页 这些下拉选择框在首次打开时异步加载其选项 这在 Firefox 下工作得很好 但在 Internet Explorer 下则不然 下面是我想要实现的目标的一个小例子 基本上 有一个选择框 ID 为
  • 更改特定字符串的颜色

    有谁知道如果将特定单词输入文本区域 我如何更改它的颜色 例如 如果用户输入 你好我的朋友 它会动态地将 你好 更改为绿色 在google上花了很多时间 找不到任何相关的东西 谢谢 textareas 的设计目的不是选择性着色
  • Google 地图 InfoBubble PixelOffset(从标记上方的默认位置移动)

    我正在尝试实现一个自定义 infoBubble 它的框打开到标记的侧面 而不是顶部的默认位置 事实证明这比预期的要困难 使用普通的infoWindow 您可以使用pixelOffset 请参阅此处文档 https developers go
  • javascript/jquery 禁用点击提交按钮,防止重复提交

    所以我的提交按钮如下所示 a href img src images user create product png border 0 a 当我双击它时 显然会双重提交 问题是 我将信息保存在数据库中 因此那里会有重复的信息 我不想那样 这
  • D3.js - 具有多个环的圆环图

    以下示例显示了 D3 js 中的圆环图 是否可以向图表添加多个圆环 var dataset apples 53245 28479 19697 24037 40245 var width 460 height 300 radius Math
  • 使用 Socket.IO 时如何访问会话标识符?

    我有一个聊天 我需要管理独特的连接 我四处搜寻 但我找到的解决方案似乎都已被弃用 那么 如何使用 Socket IO 获取套接字的会话 ID 我在用着Node js http en wikipedia org wiki Node js Ex
  • 在多个数组中搜索字符串,然后设置 var - jQuery

    我正在寻找基于字符串存在于哪个数组中设置一个变量 例如 var primary red blue yellow var secondary orange purple green 然后检查 purple 并返回它在 secondary 数组
  • 简单的颜色变化

    我正在创建一个用户界面 用户可以在其中更改页面的颜色值 我想要的是获取分配给其背景颜色的值并将其变亮一定程度 我只是想获得一条亮点线 而不必每次都制作新图像 示例 用户将背景颜色设置为 ECECEC 现在我希望某个元素边框变成 F4F4F4
  • 在 Firefox 中使用 Javascript 检测键盘布局

    有没有办法在 Firefox 中检测客户端的键盘布局 我知道 Chrome 的答案是肯定的 请参阅https developer mozilla org en US docs Web API Navigator keyboard https
  • 如何制作过期/签名视频嵌入网址

    我是新来的 正在学习网络开发等等 我只知道如何将我的视频嵌入网站中 任何菜鸟都可以轻松获得源代码 他们也可以嵌入它 但在许多网站中 视频 src 均使用重定向器链接进行编码 例如 它会在一段时间后过期 在本例中是一天 我了解到这是一个签名网
  • React 错误:目标容器不是 DOM 元素

    我刚刚开始使用 React 所以这可能是一个非常简单的错误 但我们开始吧 我的html代码非常简单 load staticfiles

随机推荐

  • 我可以设置viewpager的项目宽度吗?

    我希望我可以在viewpager的页面中显示3个项目 但是现在我只能设置viewpager的padding值和margin值 所以它在viewpager的页面中只显示一个项目 如何设置项目宽度 我认为如果我可以设置更小的项目宽度 viewp
  • 我什么时候应该选择IsolatedStorage 和AppData 文件存储?

    我最近发现了IsolatedStorage net 中的设施 我想知道什么时候应该将它们用于我的应用程序数据 什么时候应该使用 例如 Application LocalUserAppDataPath 我注意到的一件事是Application
  • 使用 Magick++ 获取像素颜色?

    我已经问过这个问题了 但那是关于FreeImage 现在我正在尝试做同样的事情ImageMagick 更正确地说 与Magick 我所需要的只是获取图像中像素的 RGB 值 并能够将其打印到屏幕上 我在ImageMagick论坛 不过好像没
  • 从动态库调用函数

    当我们在编译时不知道函数的名称时 如果可能的话 加载动态库并调用其函数之一的最佳方法是什么 例如 有没有一种方法可以让程序从文件中读取字符串 然后加载DLL并搜索并调用名称为从文件中读取的字符串的函数 非常感谢您的帮助 有一个example
  • 求函数在给定范围内的根

    我有一组函数f t有几个根 实际上是两个 我想找到 第一个 根并用fsolve大部分时间都工作正常 问题是 当 t 趋向无穷大时 两个根会收敛 我的功能的一个简单例子是f t x x 2 1 t 所以越大t得到的 错误越多fsolve使 有
  • iOS 7 导航栏文本和箭头颜色

    我想将导航栏设置为背景black以及里面的所有颜色white 所以 我使用了这段代码 UINavigationBar appearance setTitleTextAttributes NSDictionary dictionaryWith
  • Numpy:具有可变列数的 loadtxt()

    我有一个制表符分隔值的文件 其中文件的前半部分有 3 列和 N 行 后半部分有 2 列和 M 行 我需要将这样的文件转换为两个单独的数组 一个 3xN 和一个 2xM Example 6 7900209022264466 3 8259897
  • 如何从一条管道中排放另一条管道中的水?

    我需要以编程方式从另一个管道中排出管道 这DataflowPipelineJob类没有drain方法实施 可以打电话吗drain使用 Java API 的管道 能够使用以下代码启动排水 spawn child pipe DataflowPi
  • 终端中带有块字符的文本进度条[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我编写了一个简单的控制台应用程序 用于使用 ftplib 从 FTP 服务器上传和下载文件 我希望该应用程序向用户显示其下载 上传进度的一些可视化 每次下载数据块时 我希望它提供
  • IIS 7.5 中的 ASP.NET MVC3

    你好 我想在 Windows Server 2008 R2 SP1 中发布 MVC 3 站点 我安装了 MVC 3 和 MVC 2 当我创建 MVC 2 站点时 它工作正常 但 MVC 3 站点无法工作 我首先安装了 MVC 3 当该站点无
  • ASP Net Core Linux ERR_CONNECTION_REFUSED

    我正在测试将网络核心应用程序部署到运行 Ubuntu 18 04 和 Nginx 1 14 的 Digitalocean Droplet 为了进行测试 我使用 dotnet new 中提供的模板 The 点网新网 and dotnet新mv
  • 如何写入/传输到 V4L2loopback 模块创建的虚拟网络摄像头?

    我编写了一个应用程序 它从网络摄像头读取数据并在 Linux 上使用 OpenCV 处理帧 现在我想将应用程序的输出通过管道传输到由 V4L2loopback 模块创建的虚拟网络摄像头 以便其他应用程序能够读取它 我使用 C 编写了该应用程
  • 如何用 Javascript 替换整个 HTML 内容?

    我尝试使用 html html this responseText 它替换了内容 但不替换 head 和 body 标签 例如 如果我想替换此内容 h1 This is a Heading h1 然后我在检查器中检查 HTML 结构 结果如
  • 在顶部插入时,双端队列是否提供 O(1) 复杂度

    我正要过去thispost 并指出 deque 在顶部和底部提供高效的插入 但是这post这里指出除后面之外的双端队列的时间复杂度是 O n 我认为如果双端队列具有有效的顶部和底部插入 它将具有 O 1 而向量应该仅在底部插入具有 O 1
  • ReferenceError:未定义 privateSpecialRepair

    我在哨兵上收到此错误 我不知道下一个 路由器如何或为什么将用户重定向到同一页面 它发生在某些浏览器上 并且在某些浏览器上工作得很好 Tags routing instrumentation next router 操作 页面加载 看起来这与
  • Xcode 4 外部构建项目和调试

    我已经设置了一个基于 makefile 的项目 可以在多个平台上构建我的代码 在我的 Mac 上 我想使用 Xcode 进行调试 我已将 Xcode 设置为外部构建项目 我可以从 Xcode 中运行该应用程序 输出显示在 Xcode 中 如
  • 我应该如何组织我的 OCaml 项目?

    我知道这个问题很普遍 我什至不知道如何更好地问 我没有太多的经验C我只是希望我能在 OCaml 中做与 Java 类似的事情 例如 在Java 我通常创建一个项目 使用Eclipse或其他 IDE 那么我有一个src文件夹和一个bin文件夹
  • JTable 列跨越

    我正在尝试做一个JTable有可用的列跨度 具体来说 我希望嵌套一个JTable在另一个里面JTable 当用户单击查看嵌套表时 它应该展开以下推下面的行并填充空白空间 这与您在 MS Access 中看到的类似 您可以在其中嵌套表 单击行
  • JavaScript 中的全局变量和“window.variable”有什么区别?

    我正在读骨干网 js文档 并且我看到很多将属性分配给window object window something whatever 调用此代码与仅分配变量并创建全局变量有什么区别 如下所示 something whatever 我假设存在某
  • 将多级 JSON 菜单转换为多级 JSX/HTML 菜单

    我在用智能菜单创建一个下拉菜单 但是 我想动态创建菜单 React 应用程序将向 API 服务器查询 JSON 代码 并据此构建菜单 我正在尝试找出一种将 JSON 代码转换为 HTML JSX 代码的方法 从 API 检索到的 JSON