UNPKG

taro-material

Version:

Mini Program components that implement Google's Material Design.

87 lines (79 loc) 3.22 kB
import Nerv from "nervjs"; import Taro from "@tarojs/taro-h5"; import { View, Text, Image } from '@tarojs/components'; import _chunk from 'lodash/chunk'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import _isObject from 'lodash/isObject'; import _isFunction from 'lodash/isFunction'; import AtComponent from "../../common/component"; export default class AtGrid extends AtComponent { handleClick = (item, index, row, ...arg) => { const { onClick, columnNum } = this.props; if (_isFunction(onClick)) { /* prettier-ignore */ const clickIndex = row * columnNum + index; onClick(item, clickIndex, ...arg); } }; render() { const { data, mode, columnNum, hasBorder } = this.props; if (Array.isArray(data) && data.length === 0) { return null; } const gridGroup = _chunk(data, columnNum); const bodyClass = classNames(['at-grid__flex-item', 'at-grid-item', `at-grid-item--${mode}`], { 'at-grid-item--no-border': !hasBorder }); return <View className={classNames('at-grid', this.props.className)}> {gridGroup.map((item, i) => <View className="at-grid__flex" key={i}> {item.map((childItem, index) => <View key={index} className={classNames(bodyClass, { 'at-grid-item--last': index === columnNum - 1 })} onClick={this.handleClick.bind(this, childItem, index, i)} style={{ flex: `0 0 ${100 / columnNum}%` }}> <View className="at-grid-item__content"> <View className="at-grid-item__content-inner"> <View className="content-inner__icon"> {childItem.image && <Image className="content-inner__img" src={childItem.image} mode="scaleToFill" />} {_isObject(childItem.iconInfo) && !childItem.image && <Text className={classNames(childItem.iconInfo.prefixClass || 'at-icon', { [`${childItem.iconInfo.prefixClass || 'at-icon'}-${childItem.iconInfo.value}`]: childItem.iconInfo.value }, childItem.iconInfo.className)} style={this.mergeStyle({ color: childItem.iconInfo.color, fontSize: `${childItem.iconInfo.size || 24}px` }, childItem.iconInfo.customStyle)} />} </View> <Text className="content-inner__text"> {childItem.value} </Text> </View> </View> </View>)} </View>)} </View>; } } AtGrid.defaultProps = { data: [], columnNum: 3, mode: 'square', hasBorder: true }; AtGrid.propTypes = { mode: PropTypes.string, onClick: PropTypes.func, hasBorder: PropTypes.bool, columnNum: PropTypes.number, data: PropTypes.arrayOf(PropTypes.shape({ image: PropTypes.string, value: PropTypes.string, 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]) }) })) };