taro-material
Version:
Mini Program components that implement Google's Material Design.
135 lines (123 loc) • 4.91 kB
JavaScript
import Nerv from "nervjs";
import Taro from "@tarojs/taro-h5";
import { View, Text } from '@tarojs/components';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import isObject from 'lodash/isObject';
import AtComponent from "../../common/component";
export default class AtNavBar extends AtComponent {
constructor() {
super(...arguments);
if (process.env.NODE_ENV === 'test') {
Taro.initPxTransform({ designWidth: 750 });
}
}
handleClickLeftView() {
this.props.onClickLeftIcon(...arguments);
}
handleClickSt() {
this.props.onClickRgIconSt(...arguments);
}
handleClickNd() {
this.props.onClickRgIconNd(...arguments);
}
render() {
const {
customStyle,
className,
color,
fixed,
border,
leftIconType,
leftText,
title,
rightFirstIconType,
rightSecondIconType
} = this.props;
const linkStyle = { color };
const defaultIconInfo = {
customStyle: '',
className: '',
prefixClass: 'at-icon',
value: '',
color: '',
size: 24
};
const leftIconInfo = isObject(leftIconType) ? { ...defaultIconInfo, ...leftIconType } : { ...defaultIconInfo, value: leftIconType };
const leftIconClass = classNames(leftIconInfo.prefixClass, {
[`${leftIconInfo.prefixClass}-${leftIconInfo.value}`]: leftIconInfo.value
}, leftIconInfo.className);
const rightFirstIconInfo = isObject(rightFirstIconType) ? { ...defaultIconInfo, ...rightFirstIconType } : { ...defaultIconInfo, value: rightFirstIconType };
const rightFirstIconClass = classNames(rightFirstIconInfo.prefixClass, {
[`${rightFirstIconInfo.prefixClass}-${rightFirstIconInfo.value}`]: rightFirstIconInfo.value
}, rightFirstIconInfo.className);
const rightSecondIconInfo = isObject(rightSecondIconType) ? { ...defaultIconInfo, ...rightSecondIconType } : { ...defaultIconInfo, value: rightSecondIconType };
const rightSecondIconClass = classNames(rightSecondIconInfo.prefixClass, {
[`${rightSecondIconInfo.prefixClass}-${rightSecondIconInfo.value}`]: rightSecondIconInfo.value
}, rightSecondIconInfo.className);
return <View className={classNames({
'at-nav-bar': true,
'at-nav-bar--fixed': fixed,
'at-nav-bar--no-border': !border
}, className)} style={customStyle}>
<View className="at-nav-bar__left-view" onClick={this.handleClickLeftView.bind(this)} style={linkStyle}>
{leftIconType && <Text className={leftIconClass} style={this.mergeStyle({
color: leftIconInfo.color,
fontSize: `${Taro.pxTransform(parseInt(leftIconInfo.size) * 2)}`
}, leftIconInfo.customStyle)} />}
<Text className="at-nav-bar__text">{leftText}</Text>
</View>
<View className="at-nav-bar__title">{title}</View>
<View className="at-nav-bar__right-view">
<View className={classNames({
'at-nav-bar__container': true,
'at-nav-bar__container--hide': !rightSecondIconType
})} style={linkStyle} onClick={this.handleClickNd.bind(this)}>
{rightSecondIconType && <Text className={rightSecondIconClass} style={this.mergeStyle({
color: rightSecondIconInfo.color,
fontSize: `${Taro.pxTransform(parseInt(rightSecondIconInfo.size) * 2)}`
}, rightSecondIconInfo.customStyle)} />}
</View>
<View className={classNames({
'at-nav-bar__container': true,
'at-nav-bar__container--hide': !rightFirstIconType
})} style={linkStyle} onClick={this.handleClickSt.bind(this)}>
{rightFirstIconType && <Text className={rightFirstIconClass} style={this.mergeStyle({
color: rightFirstIconInfo.color,
fontSize: `${Taro.pxTransform(parseInt(rightFirstIconInfo.size) * 2)}`
}, rightFirstIconInfo.customStyle)} />}
</View>
</View>
</View>;
}
}
AtNavBar.defaultProps = {
customStyle: '',
className: '',
fixed: false,
border: true,
color: '',
leftIconType: '',
leftText: '',
title: '',
rightFirstIconType: '',
rightSecondIconType: '',
onClickLeftIcon: () => {},
onClickRgIconSt: () => {},
onClickRgIconNd: () => {}
};
AtNavBar.propTypes = {
customStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
className: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
fixed: PropTypes.bool,
border: PropTypes.bool,
color: PropTypes.string,
leftIconType: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
leftText: PropTypes.string,
title: PropTypes.string,
rightFirstIconType: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
rightSecondIconType: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
onClickLeftIcon: PropTypes.func,
onClickRgIconSt: PropTypes.func,
onClickRgIconNd: PropTypes.func
};