React学习(六)-antd-moblie的TabBar组件搭配Route的使用

一.前言

  移动端web较为常见的使用了标签栏,如下。可以通过切换该tab选项来展示不同的内容。

 

 

   在antd-moblile中,TabBar是标签栏的组件。现在要和react-route搭配,来给它定义四个路由,每个url对应一个标签。

二.路由定义

  参照之前react学习中route的使用。在App.jsx中,设置路由,不同url对应不同组件。

render() {
    return (
        <Router>
            <Home>
                <Route path="/" exact component={Index} />
                <Route path="/tab1" component={Tab1} />
                <Route path="/tab2" component={Tab2} />
                <Route path="/tab3" component={Tab3} />
            </Home>
        </Router>
    );
}

  在Home组件中,引用TabBar组件。思路是,Home为父组件,当路由为对应url时,它可以输出子路由组件的内容。

{this.props.children}

  根据这个路由,那么可以在Home进行判断处理,来控制TabBar的显示。

componentDidMount() {
    switch (this.props.location.pathname) {
        case '/':
            this.setState({ selectedTab: 'index' });
            break
        case '/tab1':
            this.setState({ selectedTab: 'tab1' });
            break
        case '/tab2':
            this.setState({ selectedTab: 'tab2' });
            break
        case '/tab3':
            this.setState({ selectedTab: 'tab3' });
            break
        default:
            break;
    }
}

  同时TabBar的点击事件也可以改变url。这个是切换路由的方法。

changeUrl(url) {
    this.props.history.push(url);
}

  注意,上面this.props.history直接使用会有问题。需要对Home进行处理,这样父组件的路由信息才能传递过来。

import { withRouter} from 'react-router-dom';

export default withRouter(Home);

  贴上代码以供参考。Home.jsx

var React = require('react');
import { withRouter} from 'react-router-dom';
import { TabBar } from 'antd-mobile';

class Home extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            selectedTab: 'index'
        };
        this.changeUrl.bind(this);
    }

    componentDidMount() {
        switch (this.props.location.pathname) {
            case '/':
                this.setState({ selectedTab: 'index' });
                break
            case '/tab1':
                this.setState({ selectedTab: 'tab1' });
                break
            case '/tab2':
                this.setState({ selectedTab: 'tab2' });
                break
            case '/tab3':
                this.setState({ selectedTab: 'tab3' });
                break
            default:
                break;
        }
    }

    changeUrl(url) {
        this.props.history.push(url);
    }

    render() {
        return <div style={{ position: 'fixed', height: '100%', width: '100%', top: 0 }}>
            <TabBar
                unselectedTintColor="#949494"
                tintColor="#33A3F4"
                barTintColor="white"
            >
                <TabBar.Item
                    title="首页"
                    key="首页"
                    icon={<div style={{
                        width: '22px',
                        height: '22px',
                        background: 'url(https://zos.alipayobjects.com/rmsportal/sifuoDUQdAFKAVcFGROC.svg) center center /  21px 21px no-repeat'
                    }}
                    />
                    }
                    selectedIcon={<div style={{
                        width: '22px',
                        height: '22px',
                        background: 'url(https://zos.alipayobjects.com/rmsportal/iSrlOTqrKddqbOmlvUfq.svg) center center /  21px 21px no-repeat'
                    }}
                    />
                    }
                    selected={this.state.selectedTab === 'index'}
                    badge={1}
                    onPress={() => {
                        this.setState({
                            selectedTab: 'index',
                        });
                        this.changeUrl("/");
                    }}
                    data-seed="logId"
                >
                    {this.props.children}

                </TabBar.Item>
                <TabBar.Item
                    icon={
                        <div style={{
                            width: '22px',
                            height: '22px',
                            background: 'url(https://gw.alipayobjects.com/zos/rmsportal/BTSsmHkPsQSPTktcXyTV.svg) center center /  21px 21px no-repeat'
                        }}
                        />
                    }
                    selectedIcon={
                        <div style={{
                            width: '22px',
                            height: '22px',
                            background: 'url(https://gw.alipayobjects.com/zos/rmsportal/ekLecvKBnRazVLXbWOnE.svg) center center /  21px 21px no-repeat'
                        }}
                        />
                    }
                    title="合作"
                    key="合作"
                    badge={'new'}
                    selected={this.state.selectedTab === 'tab1'}
                    onPress={() => {
                        this.setState({
                            selectedTab: 'tab1',
                        });
                        this.changeUrl("/tab1");
                    }}
                    data-seed="logId1"
                >
                    {this.props.children}
                </TabBar.Item>
                <TabBar.Item
                    icon={
                        <div style={{
                            width: '22px',
                            height: '22px',
                            background: 'url(https://zos.alipayobjects.com/rmsportal/psUFoAMjkCcjqtUCNPxB.svg) center center /  21px 21px no-repeat'
                        }}
                        />
                    }
                    selectedIcon={
                        <div style={{
                            width: '22px',
                            height: '22px',
                            background: 'url(https://zos.alipayobjects.com/rmsportal/IIRLrXXrFAhXVdhMWgUI.svg) center center /  21px 21px no-repeat'
                        }}
                        />
                    }
                    title="客服"
                    key="客服"
                    dot
                    selected={this.state.selectedTab === 'tab2'}
                    onPress={() => {
                        this.setState({
                            selectedTab: 'tab2',
                        });
                        this.changeUrl("/tab2");
                    }}
                >
                    {this.props.children}
                </TabBar.Item>
                <TabBar.Item
                    icon={{ uri: 'https://zos.alipayobjects.com/rmsportal/asJMfBrNqpMMlVpeInPQ.svg' }}
                    selectedIcon={{ uri: 'https://zos.alipayobjects.com/rmsportal/gjpzzcrPMkhfEqgbYvmN.svg' }}
                    title="我的"
                    key="我的"
                    selected={this.state.selectedTab === 'tab3'}
                    onPress={() => {
                        this.setState({
                            selectedTab: 'tab3',
                        });
                        this.changeUrl("/tab3");
                    }}
                >
                    {this.props.children}
                </TabBar.Item>
            </TabBar>
        </div>;
    }
}

export default withRouter(Home);

 

posted @ 2021-12-07 17:26  shine声  阅读(1182)  评论(2编辑  收藏  举报