import React, { Component } from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; const breakPoints = ['xxs', 'xs', 's', 'm', 'l', 'xl']; /** * Grid.Col * @order 2 */ export default class Col extends Component { static isNextCol = true; static propTypes = { prefix: PropTypes.string, pure: PropTypes.bool, rtl: PropTypes.bool, className: PropTypes.string, /** * 列内容 */ children: PropTypes.node, /** * 列宽度

**可选值**:
1, 2, 3, ..., 22, 23, 24 */ span: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), /** * 固定列宽度,宽度值为20 * 栅格数

**可选值**:
1, 2, 3, ..., 28, 29, 30 */ fixedSpan: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), /** * (不支持IE9浏览器)列偏移

**可选值**:
1, 2, 3, ..., 22, 23, 24 */ offset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), /** * (不支持IE9浏览器)固定列偏移,宽度值为20 * 栅格数

**可选值**:
1, 2, 3, ..., 28, 29, 30 */ fixedOffset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), /** * (不支持IE9浏览器)多列垂直方向对齐方式,可覆盖Row的align属性 */ align: PropTypes.oneOf([ 'top', 'center', 'bottom', 'baseline', 'stretch', ]), /** * 列在不同断点下的显示与隐藏

**可选值**:
true(在所有断点下隐藏)
false(在所有断点下显示)
'xs'(在 xs 断点下隐藏)
['xxs', 'xs', 's', 'm', 'l', 'xl'](在 xxs, xs, s, m, l, xl 断点下隐藏) */ hidden: PropTypes.oneOfType([ PropTypes.bool, PropTypes.string, PropTypes.array, ]), /** * >=320px,响应式栅格,可为栅格数(span)或一个包含栅格数(span)和偏移栅格数(offset)对象 */ xxs: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.object, ]), /** * >=480px,响应式栅格,可为栅格数(span)或一个包含栅格数(span)和偏移栅格数(offset)对象 */ xs: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.object, ]), /** * >=720px,响应式栅格,可为栅格数(span)或一个包含栅格数(span)和偏移栅格数(offset)对象 */ s: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.object, ]), /** * >=990px,响应式栅格,可为栅格数(span)或一个包含栅格数(span)和偏移栅格数(offset)对象 */ m: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.object, ]), /** * >=1200px,响应式栅格,可为栅格数(span)或一个包含栅格数(span)和偏移栅格数(offset)对象 */ l: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.object, ]), /** * >=1500px,响应式栅格,可为栅格数(span)或一个包含栅格数(span)和偏移栅格数(offset)对象 */ xl: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.object, ]), /** * 指定以何种元素渲染该节点,默认为 'div' */ component: PropTypes.oneOfType([PropTypes.string, PropTypes.func]), }; static defaultProps = { prefix: 'next-', pure: false, component: 'div', }; render() { /* eslint-disable no-unused-vars */ const { prefix, pure, span, offset, fixedSpan, fixedOffset, hidden, align, xxs, xs, s, m, l, xl, component: Tag, className, children, rtl, ...others } = this.props; /* eslint-enable no-unused-vars */ const pointClassObj = breakPoints.reduce((ret, point) => { let pointProps = {}; if (typeof this.props[point] === 'object') { pointProps = this.props[point]; } else { pointProps.span = this.props[point]; } ret[`${prefix}col-${point}-${pointProps.span}`] = !!pointProps.span; ret[ `${prefix}col-${point}-offset-${pointProps.offset}` ] = !!pointProps.offset; return ret; }, {}); let hiddenClassObj; if (hidden === true) { hiddenClassObj = { [`${prefix}col-hidden`]: true }; } else if (typeof hidden === 'string') { hiddenClassObj = { [`${prefix}col-${hidden}-hidden`]: !!hidden }; } else if (Array.isArray(hidden)) { hiddenClassObj = hidden.reduce((ret, point) => { ret[`${prefix}col-${point}-hidden`] = !!point; return ret; }, {}); } const classes = cx({ [`${prefix}col`]: true, [`${prefix}col-${span}`]: !!span, [`${prefix}col-fixed-${fixedSpan}`]: !!fixedSpan, [`${prefix}col-offset-${offset}`]: !!offset, [`${prefix}col-offset-fixed-${fixedOffset}`]: !!fixedOffset, [`${prefix}col-${align}`]: !!align, ...pointClassObj, ...hiddenClassObj, [className]: className, }); return ( {children} ); } }