美文网首页
01_13.抽取tab导航子组件_子传父

01_13.抽取tab导航子组件_子传父

作者: Robyn_Luo | 来源:发表于2017-11-24 20:15 被阅读0次
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <link rel="stylesheet" type="text/css" href="css/tab.css">
        <script src="../react.js"></script>
        <script src="../react-dom.js"></script>
        <script src="../browser.min.js"></script>
    </head>
    <body>
        <div id="app"></div>
        <script type="text/babel">
    
        // 创建APPTabNav组件
        var AppTabNav = React.createClass({
    
            // 状态定义
            getInitialState() {
                return {
                    focusIndex: 0
                };
            },
    
            // 修改焦点下标
            clickHandler(i) {
                this.setState({
                    focusIndex: i
                });
                // 子调用父的函数给他传值
                this.props.change(i);
            },
    
            render() {
                return (
                    <ul className="tab" id="tab-menu">
                        {
                            this.props.menuList.map((v, i) => {
                                return (
                                    <li onClick={ this.clickHandler.bind(this, i) } className={ this.state.focusIndex == i? 'tab-item active': 'tab-item' } key={ v }>
                                        <span>◆</span>{ v }
                                    </li>
                                )
                            })
                        }
                    </ul>
                )
            }
        });
    
    
        // 在react中, 子组件给父组件传递数据, 父可以给子传一个函数过去, 子在需要的时候调用
        // 其实这个实现本质和vue子传父有点像, vue中是父监听子的一个自定义事件, 子在需要的时候触发事件函数被调用
    
        var AppTab = React.createClass({
    
            // 状态定义
            getInitialState() {
                return {
                    focusIndex: 0
                };
            },
    
            // 该方法会传给子组件调用, 接收子的数据
            changeIndex(i) {
                this.setState({
                    focusIndex: i
                });
            },
    
            render() {
                return (
                    <div className="wrapper" id="wrapper">
                        <AppTabNav menuList={ this.props.menuList } change={ this.changeIndex }/>
                        <div className="products" id="tab-main">
                            {
                                this.props.mainList.map((v, i) => {
                                    return (
                                        <div className={ this.state.focusIndex == i? "main selected": "main" } key={ i }>
                                            <a href="###"><img src={ v } alt=""/></a>
                                        </div>
                                    )
                                })
                            }
                        </div>
                    </div>
                );
            }
        });
    
        // 渲染AppTab组件
        var menuList1 = [ '后端', '运维', '数据库', '架构师' ];
        var menuList2 = [ 'web前端', 'android前端', 'ios前端', 'pc前端'];
        var mainList1 = ['imgs/guojidapai.jpg', 'imgs/guojidapai.jpg', 'imgs/guojidapai.jpg', 'imgs/guojidapai.jpg'];
        var mainList2 = ['imgs/guozhuangmingpin.jpg', 'imgs/qingjieyongpin.jpg', 'imgs/nanshijingpin.jpg', 'imgs/guozhuangmingpin.jpg'];
        ReactDOM.render(
        <div>
            <AppTab menuList={ menuList1 } mainList={ mainList1 }/>
            <AppTab menuList={ menuList2 } mainList={ mainList2 }/>
        </div>
        , document.querySelector('#app'));
        </script>
    </body>
    </html>
    
    

    相关文章

      网友评论

          本文标题:01_13.抽取tab导航子组件_子传父

          本文链接:https://www.haomeiwen.com/subject/egnfbxtx.html