專案地址
ant-mobile TabBar 元件配合 react-router-redux 的最佳實踐,堅定的眼神:)
故事背景: 最近在使用ant-mobile開發web app 應用,遇到TabBar元件切換問題,在ant-mobile的issues中搜到一些實踐案例,但是感覺並沒有完美解決這個問題,經過思考得出了下面這個最佳實踐。直接上程式碼,你需要關注的3個檔案及程式碼:
1、src/router/router.js
<Router history={history}>
<Route path='/' component={IndexPage}>
<IndexRedirect to="/login"/>
<Route path='/login' component={Login}/>
<Route path='/home' component={HomePage}/>
<Route component={HomePage}>
<Route path='/customer/:type' component={Customer}/>
<Route path='/agent/:type' component={Agent}/>
<Route path='/store/:type' component={Store}/>
<Route path='/user/:type' component={User}/>
</Route>
<Route path="/*" component={NotFoundPage}/>
</Route>
</Router>複製程式碼
定義路由,根據url匹配相應的元件
2、src/routers/HomePage/HomePage.js
render() {
const {children} = this.props;
return (
<div className={styles.homePage}>
<TabBarNav tabBarChildren={children}/>
</div>
);
}複製程式碼
將路由元件通過homePage傳入TabBarNav元件中
3、src/components/Common/TabBarNav/TabBarNav.js
<TabBar
unselectedTintColor="#949494"
tintColor="#33A3F4"
barTintColor="white"
hidden={this.state.hidden}
>
<TabBarItem
title={formatMessage(messages.customer)}
key='customer'
icon={<Icon type={shoppingCart} size="md" />}
selectedIcon={<Icon type={shoppingCart} color={selectIconColor} size="md" />}
selected={this.state.selectedTab === 'blueTab'}
onPress={() => {
this.setState({
selectedTab: 'blueTab',
});
dispatch(routerRedux.push('/customer/customer'));
}}
data-seed="logId"
>
{tabBarChildren.props.params.type=='customer' ? tabBarChildren:null}
</TabBarItem>
<TabBarItem
icon={<Icon type={dollar} size="md" />}
selectedIcon={<Icon type={dollar} color={selectIconColor} size="md" />}
title={formatMessage(messages.agent)}
key="agent"
selected={this.state.selectedTab === 'redTab'}
onPress={() => {
this.setState({
selectedTab: 'redTab',
});
dispatch(routerRedux.push('/agent/agent'));
}}
data-seed="logId1"
>
{tabBarChildren.props.params.type=='agent' ? tabBarChildren:null}
</TabBarItem>
<TabBarItem
icon={<Icon type={home} size="md"/>}
selectedIcon={<Icon type={home} color={selectIconColor} size="md"/>}
title={formatMessage(messages.store)}
key='store'
selected={this.state.selectedTab === 'greenTab'}
onPress={() => {
this.setState({
selectedTab: 'greenTab',
});
dispatch(routerRedux.push('/store/store'));
}}
>
{tabBarChildren.props.params.type=='store' ? tabBarChildren:null}
</TabBarItem>
<TabBarItem
icon={<Icon type={user} size="md"/>}
selectedIcon={<Icon type={user} color={selectIconColor} size="md"/>}
title={formatMessage(messages.me)}
key='me'
selected={this.state.selectedTab === 'yellowTab'}
onPress={() => {
this.setState({
selectedTab: 'yellowTab',
});
dispatch(routerRedux.push('/user/user'));
}}
>
{tabBarChildren.props.params.type=='user' ? tabBarChildren:null}
</TabBarItem>
</TabBar>複製程式碼
根據傳入元件的props.params.type判斷是否渲染tab頁內容。
簡單3步,大功告成,這樣既可實現通過react-router-redux控制路由跳轉,進一步控制相應的元件渲染,詳細程式碼可以檢視相應的檔案。
番外篇:
下面解釋下,在router.js中為什麼使用<Route path='/customer/:type' component={Customer}/>
type 引數?
TabBar標準使用姿勢是:
<TabBar>
<TabBar.Item><Component1 /></TabBar.Item>
<TabBar.Item><Component2 /></TabBar.Item>
</TabBar>複製程式碼
這樣在切換不同tab項的時候,其他的元件也會渲染,只是給隱藏了起來,就像這樣:
為了避免切換時其他tab頁的元件渲染,所以在路由中引入了type引數,通過傳入的type引數控制不同tab頁內容的渲染。
覺得有幫助就來個Star :)
這裡是我de個人部落格