Skip to content

Commit

Permalink
refactor(grid): use tsx
Browse files Browse the repository at this point in the history
  • Loading branch information
novlan1 committed May 25, 2024
1 parent bf67d98 commit 0beac11
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 122 deletions.
77 changes: 77 additions & 0 deletions src/grid/grid-item.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { defineComponent, getCurrentInstance, computed, inject } from 'vue';
import isObject from 'lodash/isObject';
import isString from 'lodash/isString';
import isFunction from 'lodash/isFunction';

import config from '../config';
import gridItemProps from './grid-item-props';
import { useTNodeJSX } from '../hooks/tnode';

const { prefix } = config;
const name = `${prefix}-grid-item`;

export default defineComponent({
name,
props: gridItemProps,
setup(props, context) {
const internalInstance = getCurrentInstance();
const renderTNodeJSX = useTNodeJSX();
const { column, border, align, gutter } = inject<any>('grid');

const rootStyle = computed(() => {
const percent = column.value > 0 ? `${100 / +column.value}%` : 0;
const style: Record<string, any> = {
textAlign: ['center', 'left'].includes(align.value) ? align.value : 'center',
};
if (percent !== 0) {
style.flexBasis = percent;
}
return style;
});

const size = computed(() => {
if (column.value > 4 || !column.value) return 'small';
return column.value < 4 ? 'large' : 'middle';
});

const realImage = computed(() => {
if (isString(props.image)) return { src: props.image };
if (isObject(props.image) && !isFunction(props.image) && !context.slots.image) {
return props.image;
}
return null;
});

const gridItemClasses = computed(() => [
`${name}`,
`${name}--${props.layout}`,
{ [`${name}--bordered`]: border, [`${name}--surround`]: border && gutter },
]);

return () => {
const renderImage = () =>
realImage.value ? <t-image shape="round" {...realImage.value} /> : renderTNodeJSX('image');

return (
<div class={gridItemClasses.value} style={rootStyle.value}>
<div class={`${name}__image ${name}__image--${size.value}`}>
{props.badge ? (
<t-badge {...(props.badge as Object)}>
{realImage.value ? <t-image shape="round" {...realImage.value} /> : renderTNodeJSX('image')}
</t-badge>
) : (
renderImage()
)}
</div>

<div class={`${name}__content ${name}__content--${props.layout}`}>
<div class={`${name}__title ${name}__title--${size.value}`}>{renderTNodeJSX('text')}</div>
<div class={`${name}__description ${name}__description--${props.layout}`}>
{renderTNodeJSX('description')}
</div>
</div>
</div>
);
};
},
});
96 changes: 0 additions & 96 deletions src/grid/grid-item.vue

This file was deleted.

38 changes: 14 additions & 24 deletions src/grid/grid.vue → src/grid/grid.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,3 @@
<template>
<div
:class="[
`${name}`,
{
[`${name}--card`]: theme === 'card',
[`${name}--auto-size`]: column === 0,
[`${name}--bordered`]: border && !gutter,
},
]"
:style="rootStyle"
>
<slot />
</div>
</template>

<script lang="ts">
import { defineComponent, provide, toRefs, computed } from 'vue';

import config from '../config';
Expand All @@ -26,7 +9,7 @@ const name = `${prefix}-grid`;
export default defineComponent({
name,
props: gridProps,
setup(props) {
setup(props, { slots }) {
const { column, gutter, border, align } = toRefs(props);
const rootStyle = computed(() => {
if (column.value === 0) return [];
Expand All @@ -46,11 +29,18 @@ export default defineComponent({
gutter,
});

return {
name,
column,
rootStyle,
};
const classes = computed(() => [
`${name}`,
{
[`${name}--card`]: props.theme === 'card',
[`${name}--auto-size`]: props.column === 0,
[`${name}--bordered`]: border && !gutter,
},
]);
return () => (
<div class={classes.value} style={rootStyle.value}>
{slots.default?.()}
</div>
);
},
});
</script>
4 changes: 2 additions & 2 deletions src/grid/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import LocalGrid from './grid.vue';
import LocalGridItem from './grid-item.vue';
import LocalGrid from './grid';
import LocalGridItem from './grid-item';
import { withInstall, WithInstallType } from '../shared';

import { TdGridItemProps, TdGridProps } from './type';
Expand Down

0 comments on commit 0beac11

Please sign in to comment.