用ReactJs写一个简单的手风琴菜单效果

ReactJs除了利用Virtual DOM大大提高了页面渲染速度。

本身基于组件的编码方式也很优雅,组件层次结构比较清晰,挺易于维护的。

下面用ReactJs写一个简单的手风琴菜单效果,仅供学习交流。

完整源码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title></title>
    <script src="https://npmcdn.com/react@15.3.1/dist/react.js"></script>
    <script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.js"></script>
    <script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
    <style type="text/css">
        .hidden{
            display:none;
        }
    </style>
  </head>
  <body>
    <div id="myComponent"></div>
    <script type="text/babel">

        //菜单数据
        var menuDatas = [
            {id:"010",  label:"ANIMAL",     children:[
                {id:"011",  label:"dog"},
                {id:"012",  label:"cat"},
                {id:"013",  label:"bird"}
            ]},
            {id:"020",  label:"TRAFFIC",    children:[
                {id:"021",  label:"car"},
                {id:"022",  label:"bus"},
                {id:"023",  label:"plane"}
            ]},
            {id:"030",  label:"MOBILE",     children:[
                {id:"031",  label:"ipone"},
                {id:"032",  label:"smartisan"}
            ]}
        ];

        //菜单React组件
        var ReactMenus = React.createClass({
            getInitialState : function(){
                return {expandId : -1};
            },
            clickHandler : function(menuDataId){
                this.setState({ expandId: menuDataId});
            },
            render :function(){
                //保持当前组件对象,方便在循环内部使用
                var crtCmp = this;

                //遍历获取菜单数据,生成Virtual DOM对象
                var menusDataDom = this.props.menuDatas.map(function(crtMenuData){

                    //遍历子菜单数据,生成Virtual DOM对象-->当前组件被点击,才展示子菜单数据
                    var liData = null;
                    if(crtMenuData.children){

                        liData = crtMenuData.children.map(function(currentLiData){
                            return (
                                    <li key={currentLiData.id} className={crtMenuData.id==crtCmp.state.expandId?"":"hidden"}>
                                        {currentLiData.label}
                                    </li>
                                    )
                        });

                        liData = <ul>{liData}</ul>
                    }


                    //将完整Virtual DOM返回
                    return (
                            <div key={crtMenuData.id}>
                                <div onClick={crtCmp.clickHandler.bind(crtCmp,crtMenuData.id)}>{crtMenuData.label}</div> 
                                {liData?liData:""} 
                            </div>
                            );

                })

                return (
                    <div>{menusDataDom}</div>
                )
            }
        });

        //渲染到DOM
        ReactDOM.render(<ReactMenus menuDatas={menuDatas} /> , document.getElementById("myComponent"));
    </script>
  </body>
</html>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值