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

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>
);
}
}