You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.4 KiB
TypeScript
127 lines
3.4 KiB
TypeScript
import { Component } from "react";
|
|
import classnames from "classnames";
|
|
import Taro from "@tarojs/taro";
|
|
|
|
import { Block, View, Image } from "@tarojs/components";
|
|
import { back } from "@/utils/traoAPI";
|
|
|
|
import "./navbar.less";
|
|
|
|
export default class Navbar extends Component<any, any> {
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.state = {
|
|
name: "导航组件",
|
|
statusBarHeight: 40, // 状态栏高度
|
|
navigationBarHeight: 0, // 导航栏高度
|
|
navHeight: 40,
|
|
};
|
|
this.initData();
|
|
}
|
|
|
|
async onLoad() {
|
|
// // 状态栏高度
|
|
}
|
|
componentDidMount() {}
|
|
|
|
componentWillUnmount() {}
|
|
|
|
componentDidShow() {}
|
|
|
|
componentDidHide() {}
|
|
|
|
async initData() {
|
|
this.setStatusBar();
|
|
}
|
|
|
|
back = () => {
|
|
back();
|
|
};
|
|
|
|
setStatusBar() {
|
|
Taro.getSystemInfoAsync({
|
|
success: (res) => {
|
|
const statusBarHeight = res.statusBarHeight || 0;
|
|
// 获取微信胶囊的位置信息 width,height,top,right,left,bottom
|
|
const custom = Taro.getMenuButtonBoundingClientRect();
|
|
// 导航栏高度(标题栏高度) = 胶囊高度 + (顶部距离 - 状态栏高度) * 2
|
|
const navigationBarHeight =
|
|
custom.height + (custom.top - statusBarHeight) * 2;
|
|
// 总体高度 = 状态栏高度 + 导航栏高度
|
|
const navHeight = navigationBarHeight + statusBarHeight;
|
|
|
|
this.setState({
|
|
statusBarHeight,
|
|
navigationBarHeight,
|
|
navHeight,
|
|
});
|
|
},
|
|
});
|
|
}
|
|
|
|
render() {
|
|
let { isBack, leftSlot, titleSlot, transparent, isWhite } = this.props;
|
|
let { statusBarHeight, navigationBarHeight, navHeight } = this.state;
|
|
const statusBarHeightRpx = statusBarHeight * 2;
|
|
const navigationBarHeightRpx = navigationBarHeight * 2;
|
|
const navHeightRpx = navHeight * 2;
|
|
return (
|
|
<Block>
|
|
<View
|
|
className="nav_box"
|
|
style={{
|
|
height: navigationBarHeightRpx + "rpx",
|
|
lineHeight: navigationBarHeightRpx + "rpx",
|
|
paddingTop: statusBarHeightRpx + "rpx",
|
|
background: transparent ? "transparent" : "#fff",
|
|
}}
|
|
>
|
|
<View className="back">
|
|
{isBack && (
|
|
<View
|
|
// className="at-icon at-icon-chevron-left"
|
|
className="back-btn"
|
|
onClick={this.back}
|
|
>
|
|
<Image
|
|
className="back-img"
|
|
src={require("../../img/left.png")}
|
|
mode="widthFix"
|
|
/>
|
|
</View>
|
|
)}
|
|
{leftSlot}
|
|
</View>
|
|
<View
|
|
className={classnames("logo", {
|
|
"logo-title": titleSlot,
|
|
})}
|
|
>
|
|
{titleSlot ? (
|
|
titleSlot
|
|
) : isWhite ? (
|
|
<Image
|
|
style="width: 238rpx;height:29rpx"
|
|
src={require("../../img/logo/logo-w.png")}
|
|
mode="widthFix"
|
|
/>
|
|
) : (
|
|
<Image
|
|
style="width: 238rpx;height:29rpx"
|
|
src={require("../../img/logo/logo-b.png")}
|
|
mode="widthFix"
|
|
/>
|
|
)}
|
|
</View>
|
|
<View className="back" />
|
|
</View>
|
|
<View
|
|
className="nav_top_padding"
|
|
style={{ paddingBottom: navHeightRpx + "rpx" }}
|
|
/>
|
|
</Block>
|
|
);
|
|
}
|
|
}
|