taro-material
Version:
Mini Program components that implement Google's Material Design.
127 lines (116 loc) • 4.14 kB
JavaScript
import Nerv from "nervjs";
import Taro from "@tarojs/taro-h5";
import { View, Image, Switch, Text } from '@tarojs/components';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import _isFunction from 'lodash/isFunction';
import AtComponent from "../../../common/component";
export default class AtListItem extends AtComponent {
handleClick = (...args) => {
if (_isFunction(this.props.onClick) && !this.props.disabled) {
this.props.onClick(...args);
}
};
handleSwitchClick(e) {
e.stopPropagation();
}
handleSwitchChange = (...args) => {
if (_isFunction(this.props.onSwitchChange) && !this.props.disabled) {
this.props.onSwitchChange(...args);
}
};
render() {
const {
note,
arrow,
title,
thumb,
iconInfo,
disabled,
isSwitch,
extraText,
hasBorder,
extraThumb,
switchColor,
switchIsCheck
} = this.props;
const rootClass = classNames('at-list__item', {
'at-list__item--thumb': thumb,
'at-list__item--multiple': note,
'at-list__item--disabled': disabled,
'at-list__item--no-border': !hasBorder
}, this.props.className);
const iconClass = classNames(iconInfo.prefixClass || 'at-icon', {
[`${iconInfo.prefixClass || 'at-icon'}-${iconInfo.value}`]: iconInfo.value
}, iconInfo.className);
return <View className={rootClass} onClick={this.handleClick}>
<View className="at-list__item-container">
{thumb && <View className="at-list__item-thumb item-thumb">
<Image className="item-thumb__info" mode="scaleToFill" src={thumb} />
</View>}
{iconInfo.value && <View className="at-list__item-icon item-icon">
<Text className={iconClass} style={this.mergeStyle({
color: iconInfo.color || '',
fontSize: `${iconInfo.size || 24}px`
}, iconInfo.customStyle)}></Text>
</View>}
<View className="at-list__item-content item-content">
<View className="item-content__info">
<View className="item-content__info-title">{title}</View>
{note && <View className="item-content__info-note">{note}</View>}
</View>
</View>
<View className="at-list__item-extra item-extra">
{extraText && <View className="item-extra__info">{extraText}</View>}
{extraThumb && !extraText && <View className="item-extra__image">
<Image className="item-extra__image-info" mode="aspectFit" src={extraThumb} />
</View>}
{isSwitch && !extraThumb && !extraText && <View className="item-extra__switch" onClick={this.handleSwitchClick}>
<Switch color={switchColor} disabled={disabled} checked={switchIsCheck} onChange={this.handleSwitchChange} />
</View>}
{arrow ? <View className="item-extra__icon">
<Text className={`at-icon item-extra__icon-arrow at-icon-chevron-${arrow}`} />
</View> : null}
</View>
</View>
</View>;
}
}
AtListItem.defaultProps = {
note: '',
disabled: false,
title: '',
thumb: '',
isSwitch: false,
hasBorder: true,
switchColor: '#6190E8',
switchIsCheck: false,
extraText: '',
extraThumb: '',
iconInfo: {},
onSwitchChange: () => {},
onClick: () => {}
};
AtListItem.propTypes = {
note: PropTypes.string,
disabled: PropTypes.bool,
title: PropTypes.string,
thumb: PropTypes.string,
onClick: PropTypes.func,
isSwitch: PropTypes.bool,
hasBorder: PropTypes.bool,
switchColor: PropTypes.string,
switchIsCheck: PropTypes.bool,
extraText: PropTypes.string,
extraThumb: PropTypes.string,
onSwitchChange: PropTypes.func,
arrow: PropTypes.oneOf(['up', 'down', 'right']),
iconInfo: PropTypes.shape({
size: PropTypes.number,
value: PropTypes.string,
color: PropTypes.string,
prefixClass: PropTypes.string,
customStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
className: PropTypes.oneOfType([PropTypes.array, PropTypes.string])
})
};