我正在使用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元素的有效方法是什么?
这是使用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>