小编典典

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

reactjs

我正在使用SmartMenus创建一个下拉菜单。但是,我想动态创建菜单。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>

鉴于我正在使用多个级别的菜单,在React中混合使用JSX和html元素的有效方法是什么?


阅读 273

收藏
2020-07-22

共1个答案

小编典典

这是使用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>
2020-07-22