Row.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  2. import _extends from "@babel/runtime/helpers/esm/extends";
  3. import { createVNode as _createVNode } from "vue";
  4. import { defineComponent, ref, onMounted, onBeforeUnmount, computed } from 'vue';
  5. import classNames from '../_util/classNames';
  6. import useResponsiveObserve, { responsiveArray } from '../_util/responsiveObserve';
  7. import useConfigInject from '../config-provider/hooks/useConfigInject';
  8. import useFlexGapSupport from '../_util/hooks/useFlexGapSupport';
  9. import useProvideRow from './context';
  10. import { useRowStyle } from './style';
  11. import { someType } from '../_util/type';
  12. const RowAligns = ['top', 'middle', 'bottom', 'stretch'];
  13. const RowJustify = ['start', 'end', 'center', 'space-around', 'space-between', 'space-evenly'];
  14. export const rowProps = () => ({
  15. align: someType([String, Object]),
  16. justify: someType([String, Object]),
  17. prefixCls: String,
  18. gutter: someType([Number, Array, Object], 0),
  19. wrap: {
  20. type: Boolean,
  21. default: undefined
  22. }
  23. });
  24. const ARow = defineComponent({
  25. compatConfig: {
  26. MODE: 3
  27. },
  28. name: 'ARow',
  29. inheritAttrs: false,
  30. props: rowProps(),
  31. setup(props, _ref) {
  32. let {
  33. slots,
  34. attrs
  35. } = _ref;
  36. const {
  37. prefixCls,
  38. direction
  39. } = useConfigInject('row', props);
  40. const [wrapSSR, hashId] = useRowStyle(prefixCls);
  41. let token;
  42. const responsiveObserve = useResponsiveObserve();
  43. const screens = ref({
  44. xs: true,
  45. sm: true,
  46. md: true,
  47. lg: true,
  48. xl: true,
  49. xxl: true
  50. });
  51. const curScreens = ref({
  52. xs: false,
  53. sm: false,
  54. md: false,
  55. lg: false,
  56. xl: false,
  57. xxl: false
  58. });
  59. const mergePropsByScreen = oriProp => {
  60. return computed(() => {
  61. if (typeof props[oriProp] === 'string') {
  62. return props[oriProp];
  63. }
  64. if (typeof props[oriProp] !== 'object') {
  65. return '';
  66. }
  67. for (let i = 0; i < responsiveArray.length; i++) {
  68. const breakpoint = responsiveArray[i];
  69. // if do not match, do nothing
  70. if (!curScreens.value[breakpoint]) continue;
  71. const curVal = props[oriProp][breakpoint];
  72. if (curVal !== undefined) {
  73. return curVal;
  74. }
  75. }
  76. return '';
  77. });
  78. };
  79. const mergeAlign = mergePropsByScreen('align');
  80. const mergeJustify = mergePropsByScreen('justify');
  81. const supportFlexGap = useFlexGapSupport();
  82. onMounted(() => {
  83. token = responsiveObserve.value.subscribe(screen => {
  84. curScreens.value = screen;
  85. const currentGutter = props.gutter || 0;
  86. if (!Array.isArray(currentGutter) && typeof currentGutter === 'object' || Array.isArray(currentGutter) && (typeof currentGutter[0] === 'object' || typeof currentGutter[1] === 'object')) {
  87. screens.value = screen;
  88. }
  89. });
  90. });
  91. onBeforeUnmount(() => {
  92. responsiveObserve.value.unsubscribe(token);
  93. });
  94. const gutter = computed(() => {
  95. const results = [undefined, undefined];
  96. const {
  97. gutter = 0
  98. } = props;
  99. const normalizedGutter = Array.isArray(gutter) ? gutter : [gutter, undefined];
  100. normalizedGutter.forEach((g, index) => {
  101. if (typeof g === 'object') {
  102. for (let i = 0; i < responsiveArray.length; i++) {
  103. const breakpoint = responsiveArray[i];
  104. if (screens.value[breakpoint] && g[breakpoint] !== undefined) {
  105. results[index] = g[breakpoint];
  106. break;
  107. }
  108. }
  109. } else {
  110. results[index] = g;
  111. }
  112. });
  113. return results;
  114. });
  115. useProvideRow({
  116. gutter,
  117. supportFlexGap,
  118. wrap: computed(() => props.wrap)
  119. });
  120. const classes = computed(() => classNames(prefixCls.value, {
  121. [`${prefixCls.value}-no-wrap`]: props.wrap === false,
  122. [`${prefixCls.value}-${mergeJustify.value}`]: mergeJustify.value,
  123. [`${prefixCls.value}-${mergeAlign.value}`]: mergeAlign.value,
  124. [`${prefixCls.value}-rtl`]: direction.value === 'rtl'
  125. }, attrs.class, hashId.value));
  126. const rowStyle = computed(() => {
  127. const gt = gutter.value;
  128. // Add gutter related style
  129. const style = {};
  130. const horizontalGutter = gt[0] != null && gt[0] > 0 ? `${gt[0] / -2}px` : undefined;
  131. const verticalGutter = gt[1] != null && gt[1] > 0 ? `${gt[1] / -2}px` : undefined;
  132. if (horizontalGutter) {
  133. style.marginLeft = horizontalGutter;
  134. style.marginRight = horizontalGutter;
  135. }
  136. if (supportFlexGap.value) {
  137. // Set gap direct if flex gap support
  138. style.rowGap = `${gt[1]}px`;
  139. } else if (verticalGutter) {
  140. style.marginTop = verticalGutter;
  141. style.marginBottom = verticalGutter;
  142. }
  143. return style;
  144. });
  145. return () => {
  146. var _a;
  147. return wrapSSR(_createVNode("div", _objectSpread(_objectSpread({}, attrs), {}, {
  148. "class": classes.value,
  149. "style": _extends(_extends({}, rowStyle.value), attrs.style)
  150. }), [(_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots)]));
  151. };
  152. }
  153. });
  154. export default ARow;