diff --git a/src/drawer/__test__/index.test.jsx b/src/drawer/__test__/index.test.jsx index 4ea6f006e..8a7857ad1 100644 --- a/src/drawer/__test__/index.test.jsx +++ b/src/drawer/__test__/index.test.jsx @@ -1,6 +1,6 @@ import { config, mount } from '@vue/test-utils'; import { describe, it, expect, vi } from 'vitest'; -import drawer from '../drawer.vue'; +import drawer from '../drawer'; import { ref, h } from 'vue'; import { AppIcon } from 'tdesign-icons-vue-next'; diff --git a/src/drawer/drawer.tsx b/src/drawer/drawer.tsx new file mode 100644 index 000000000..24a8d377b --- /dev/null +++ b/src/drawer/drawer.tsx @@ -0,0 +1,98 @@ +import { ref, watch, toRefs, computed, defineComponent, getCurrentInstance, h } from 'vue'; +import TPopup from '../popup'; +import config from '../config'; +import { renderTNode, TNode } from '../shared'; +import DrawerProps from './props'; +import { DrawerItem } from './type'; +import { useContent, useTNodeJSX } from '@/hooks/tnode'; +import { usePrefixClass } from '@/hooks/useClass'; + +const { prefix } = config; +const name = `${prefix}-drawer`; + +export default defineComponent({ + name, + components: { TPopup, TNode }, + props: DrawerProps, + emits: ['update:visible', 'itemClick', 'overlayClick'], + setup(props, context) { + const renderTNodeJSX = useTNodeJSX(); + const currentInstance = getCurrentInstance(); + const drawerClass = usePrefixClass('drawer'); + const { attach, visible, placement, showOverlay } = toRefs(props); + const open = ref(visible.value || false); + + watch(open, () => { + context.emit('update:visible', open.value); + }); + + watch(visible, () => { + open.value = visible.value; + }); + + const onItemClick = (index: number, item: DrawerItem, context: { e: MouseEvent }) => { + props.onItemClick?.(index, item, context); + }; + + const onVisibleChange = (visible: boolean) => { + if (showOverlay.value) { + props.onOverlayClick?.({ visible }); + } + }; + + const onClose = () => { + props.onClose?.('overlay'); + }; + + return () => { + const { attach, zIndex, closeOnOverlayClick, destroyOnClose, items } = props; + const renderTitleNode = () => { + const titleNode = renderTNodeJSX('title'); + if (!titleNode) { + return null; + } + return
{titleNode}
; + }; + const renderFooterNode = () => { + const footerNode = renderTNodeJSX('footer'); + if (!footerNode) { + return null; + } + return
{footerNode}
; + }; + return ( + +
+ {renderTitleNode()} + {renderTNodeJSX('default')} + +
+ {(items || []).map((item, index) => ( +
onItemClick(index, item, { e })} + > + {item.icon && {item.icon(h)}} +
{item.title}
+
+ ))} +
+ + {renderFooterNode()} +
+
+ ); + }; + }, +}); diff --git a/src/drawer/drawer.vue b/src/drawer/drawer.vue deleted file mode 100644 index 6d773f0f0..000000000 --- a/src/drawer/drawer.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - diff --git a/src/drawer/index.ts b/src/drawer/index.ts index 6993407e5..e45567a1f 100644 --- a/src/drawer/index.ts +++ b/src/drawer/index.ts @@ -1,4 +1,4 @@ -import _Drawer from './drawer.vue'; +import _Drawer from './drawer'; import { withInstall, WithInstallType } from '../shared'; import './style'; diff --git a/src/drawer/plugin.ts b/src/drawer/plugin.ts index d1aec43b1..fde3efc9b 100644 --- a/src/drawer/plugin.ts +++ b/src/drawer/plugin.ts @@ -1,5 +1,5 @@ import { createApp, App, h, ref, nextTick } from 'vue'; -import vueDrawer from './drawer.vue'; +import vueDrawer from './drawer'; import { WithInstallType, isBrowser } from '../shared'; import { TdDrawerProps } from './type';