taro-material
Version:
Mini Program components that implement Google's Material Design.
182 lines (168 loc) • 5.53 kB
JavaScript
import Taro, { Component } from '@tarojs/taro';
import { View, Image } from '@tarojs/components';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import RMBadge from '../Badge';
import RMIcon from '../Icon';
import RMTypography from '../Typography';
import theme from '../styles/theme';
import './BottomNavigation.scss';
const objectToString = style => {
if (typeof style === 'object') {
let styleStr = '';
Object.keys(style).forEach(key => {
const lowerCaseKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();
styleStr += `${lowerCaseKey}:${style[key]};`;
});
return styleStr;
}
return style;
};
class RMBottomNavigation extends Component {
// state = {
// isIPhoneX: false,
// };
componentDidMount() {
// const curEnv = Taro.getEnv();
// if (curEnv === Taro.ENV_TYPE.WEAPP && Taro.getSystemInfoSync().model.indexOf('iPhone X') >= 0) {
// this.setState({ isIPhoneX: true });
// }
}
handleClick(i) {
this.props.onClick(i, ...arguments);
}
/**
* 合并 style
* @param {Object|String} style1
* @param {Object|String} style2
* @returns {String}
*/
mergeStyle(style1, style2) {
return objectToString(style1) + objectToString(style2);
}
render() {
const {
customStyle,
className,
fixed,
backgroundColor,
actions,
current,
color,
size,
iconSize,
fontSize,
selectedColor,
} = this.props;
// const { isIPhoneX } = this.state;
const defaultStyle = `color: ${color};`;
const selectedStyle = `color: ${selectedColor};`;
const titleStyle = `font-size: ${fontSize}px;`;
const rootStyle = `background-color: ${backgroundColor};`;
return (
<View
className={classNames(
{
'at-tab-bar': true,
'at-tab-bar--fixed': fixed,
// 'at-tab-bar--ipx': isIPhoneX,
},
className,
)}
style={this.mergeStyle(rootStyle, customStyle)}
>
{actions.map((item, i) => {
const { badge = {} } = item;
return (
<View
className="at-tab-bar__item"
style={current === i ? selectedStyle : defaultStyle}
key={item.title}
onClick={this.handleClick.bind(this, i)}
>
{item.iconType || item.image ? (
<RMBadge
variant={badge.variant || 'text'}
value={badge.value}
maxValue={badge.maxValue}
>
<View
className="at-tab-bar__icon"
style={{
...{ fontSize: `${size || iconSize}px` },
...{ color: current === i ? selectedStyle : defaultStyle },
width: `${size || iconSize}px`,
height: `${size || iconSize}px`,
}}
>
{item.image && (
<Image
style={{
width: '100%',
height: '100%',
// background: theme.palette.background.paper,
}}
src={current === i && item.activeImage ? item.activeImage : item.image}
/>
)}
{!item.image && item.iconType && (
<RMIcon prefixClass={item.iconPrefixClass} fontSize="inherit" color="inherit">
{current === i && item.selectedIconType
? item.selectedIconType
: item.iconType}
</RMIcon>
)}
</View>
</RMBadge>
) : null}
<View>
<RMBadge
variant={item.iconType || item.image ? 'text' : badge.variant}
value={item.iconType || item.image ? '' : badge.value}
maxValue={item.iconType || item.image ? 0 : badge.maxValue}
>
<View className="at-tab-bar__title" style={titleStyle}>
<RMTypography className="caption" color="inherit" fontSize="inherit">
{item.title}
</RMTypography>
</View>
</RMBadge>
</View>
</View>
);
})}
</View>
);
}
}
RMBottomNavigation.defaultProps = {
customStyle: '',
className: '',
fixed: false,
backgroundColor: theme.palette.background.paper,
current: 0,
iconSize: 28,
fontSize: 10,
size: 28,
color: theme.palette.text.secondary,
selectedColor: theme.palette.primary.main,
scroll: false,
actions: [],
onClick: () => {},
};
RMBottomNavigation.propTypes = {
customStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
className: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
fixed: PropTypes.bool,
backgroundColor: PropTypes.string,
current: PropTypes.number,
iconSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
size: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
color: PropTypes.string,
selectedColor: PropTypes.string,
scroll: PropTypes.bool,
actions: PropTypes.array,
onClick: PropTypes.func,
};
export default RMBottomNavigation;