UNPKG

weigou

Version:

weigou components

208 lines (180 loc) 6.6 kB
import Taro, { Component } from '@tarojs/taro'; import { View, Image } from '@tarojs/components'; import './index.scss'; /**图片引入 */ import back_black from "../../ui-images/back-black.png"; import back_white from "../../ui-images/back-white.png"; import home_balck from "../../ui-images/home-black.png"; import home_white from "../../ui-images/home-white.png"; export default class NavBar extends Component { constructor(props) { super(props); this.state = { /**状态栏高度 */ statusNavHeight: null, /**导航栏高度 */ navBarHeight: null, totalHeight: null, dataList: [ { type: 'backBlackIcon', url: back_black, fn: "back" }, { type: 'backWhiteIcon', url: back_white, fn: "back" }, { type: 'homeBlackIcon', url: home_balck, fn: "home" }, { type: 'homeWhiteIcon', url: home_white, fn: "home" }, ] }; } componentWillMount() { this.setWeappNavbar(); } back() { Taro.navigateBack({ delta: 1 }); } home() { Taro.reLaunch({ url: this.props.homeUrl }); } /**因为taro静态渲染,对动态方法不能识别,所以单独写个方法来判断 */ goPageFn(item) { item.fn === "back" ? this.back() : this.home(); } config = { component: true }; /**如果是小程序就需要计算导航栏高度 */ setWeappNavbar() { if (process.env.TARO_ENV === 'h5') return; let sysinfo = Taro.getSystemInfoSync(); let menuButtonObject = Taro.getMenuButtonBoundingClientRect(); let statusHeight = sysinfo.statusBarHeight; let navHeight = menuButtonObject.height + (menuButtonObject.top - statusHeight) * 2; let statusNavHeight = `height:${statusHeight}px;`; let navBarHeight = `height:${navHeight}px;top:${statusHeight}px;`; let totalHeight = `height:${navHeight + statusHeight}px`; this.setState({ statusNavHeight, navBarHeight, totalHeight }); } render() { /** 小程序获取的nav高与父组件传进来的样式合并 */ let navStyle = this.state.navBarHeight + this.props.style; /** 小程序获取的status高与父组件传进来的样式合并 */ let statusStyle = this.state.statusNavHeight + this.props.style; return ( <View style={this.props.style}> {/* 小程序的状态栏 start */} { process.env.TARO_ENV === 'weapp' && <View className="wg-fixed wg-nav-top" style={statusStyle}></View> } {/* 小程序的状态栏 end */} <View className='wg-nav-bar wg-space-between' style={navStyle}> {/* 左侧icon start */} {this.state.dataList.map((item, index) => { return this.props.iconType === item.type && <Image src={item.url} className="wg-nav-icon" taroKey={index} onClick={this.goPageFn.bind(this, item)} />; })} {/* 左侧icon end */} {/* 中间标题 start*/} <View className='wg-nav-title'> {this.props.title} </View> {/* 中间标题 end*/} {/* 右侧icon start */} {process.env.TARO_ENV === 'h5' && <View className="wg-align-items wg-nav-right"> { this.props.icon_one_url && <View className="wg-icon-box wg-mr-24 wg-align-items" onClick={this.props.clickIconOne}> <Image className="wg-icon" src={this.props.icon_one_url} /> </View> } { this.props.icon_two_url && <View className="wg-icon-box wg-align-items" onClick={this.props.clickIconTwo}> {<Image className="wg-icon" src={this.props.icon_two_url} />} </View> } { this.props.share && <View className="wg-share wg-ml-24" onClick={this.props.share}>分享</View> } </View>} {/* 右侧icon end */} </View> {process.env.TARO_ENV === 'weapp' && <View style={this.state.totalHeight}></View>} {process.env.TARO_ENV === 'h5' && <View className="wg-h5"></View>} </View> ); } } NavBar.defaultProps = { /** * 支持 h5 和 小程序 **标题 */ title: "首页", /** * 支持 h5 和 小程序 ** 如果需要跳转到首页需要设置首页路径*/ homeUrl: null, /** * 支持 h5 和 小程序 * default:"background-color:white;color:#252525;" * 导航栏的一些样式,比如 字体大小,导航栏背景 **/ style: "background-color:white;color:#252525;", /** iconType icon的类型 * default:"homeBlackIcon" * 支持 h5 和 小程序 * backBlackIcon 返回按钮的图片是黑色的 * backWhiteIcon 返回按钮的图片是白色的 * homeBlackIcon 返回首页按钮的图片是黑色的 * homeWhiteIcon 返回首页按钮的图片是白色的 * */ iconType: "homeBlackIcon", /** * 只支持h5 * 分享的事件 **/ share: null, /** * 只支持h5 * 导航栏右侧的第一张icon **/ icon_one_url: null, /** * 只支持h5 * 导航栏右侧的第一张icon的点击事件 **/ clickIconOne: null, /** * 只支持h5 * 导航栏右侧的第二张icon **/ icon_two_url: null, /** * 只支持h5 * 导航栏右侧的第二张icon的点击事件 **/ clickIconTwo: null };