Browse Source

feat: modal pro 组件

lvkun996 3 years ago
parent
commit
8d1021b688
6 changed files with 122 additions and 16 deletions
  1. 1 0
      package.json
  2. 77 3
      src/components/ModalPro/index.vue
  3. 10 10
      src/layout/navbar.vue
  4. 6 0
      src/pages/Iot/index.vue
  5. 1 3
      src/store/router.ts
  6. 27 0
      yarn.lock

+ 1 - 0
package.json

@@ -10,6 +10,7 @@
   },
   "dependencies": {
     "@ant-design/icons-vue": "^6.1.0",
+    "@vueuse/core": "^9.13.0",
     "ant-design-vue": "^3.3.0-beta.4",
     "babel-plugin-import": "^1.13.6",
     "core-js": "^3.8.3",

+ 77 - 3
src/components/ModalPro/index.vue

@@ -1,11 +1,85 @@
 <template>
-
-  <a-row></a-row>
-
+  <a-modal
+    :visible="true"
+    ref="modalRef"
+    :wrap-style="{ overflow: 'hidden' }"
+  >
+    <template #title>
+      <div ref="modalTitleRef" style="width: 100%; cursor: move">{{title}}</div>
+    </template>
+    <template #modalRender="{ originVNode }">
+      <div :style="transformStyle">
+        <component :is="originVNode" />
+      </div>
+    </template>
+  </a-modal>
 </template>
 
 <script lang="ts" setup >
+import { useDraggable } from '@vueuse/core'
+import { ref, watch, watchEffect, computed, CSSProperties } from 'vue'
+
+export interface ModalProPorps {
+  visible: boolean,
+  title: string
+}
+
+const emit = defineEmits(['close'])
+
+const props = defineProps<ModalProPorps>()
+
+//  拖拽相关的代码
+const modalTitleRef = ref()
+
+const { x, y, isDragging } = useDraggable(modalTitleRef)
+
+const startX = ref<number>(0)
+const startY = ref<number>(0)
+const startedDrag = ref(false)
+const transformX = ref(0)
+const transformY = ref(0)
+const preTransformX = ref(0)
+const preTransformY = ref(0)
+const dragRect = ref({ left: 0, right: 0, top: 0, bottom: 0 })
+watch([x, y], () => {
+  if (!startedDrag.value) {
+    startX.value = x.value
+    startY.value = y.value
+    const bodyRect = document.body.getBoundingClientRect()
+    const titleRect = modalTitleRef.value.getBoundingClientRect()
+    dragRect.value.right = bodyRect.width - titleRect.width
+    dragRect.value.bottom = bodyRect.height - titleRect.height
+    preTransformX.value = transformX.value
+    preTransformY.value = transformY.value
+  }
+  startedDrag.value = true
+})
+
+watch(isDragging, () => {
+  if (!isDragging) {
+    startedDrag.value = false
+  }
+})
+
+watchEffect(() => {
+  if (startedDrag.value) {
+    transformX.value =
+          preTransformX.value +
+          Math.min(Math.max(dragRect.value.left, x.value), dragRect.value.right) -
+          startX.value
+    transformY.value =
+          preTransformY.value +
+          Math.min(Math.max(dragRect.value.top, y.value), dragRect.value.bottom) -
+          startY.value
+  }
+})
 
+const transformStyle = computed<CSSProperties>(() => {
+  return {
+    transform: `translate(${transformX.value}px, ${transformY.value}px)`
+  }
+})
+//  拖拽相关的代码
 </script>
 
 <style>

+ 10 - 10
src/layout/navbar.vue

@@ -45,15 +45,15 @@ const changeRouter = (path: string) => appRouter.changeNavbar(path)
 
 <style lang="less" scoped >
 .header {
-  width: 100vw;
-  display: flex;
-  height: 50px;
-  .logo {
-    width: 170px;
-    color: #fff;
-  }
-  .ant-menu {
-    height: 50px;
-  }
+  // width: 100vw;
+  // display: flex;
+  // height: 50px;
+  // .logo {
+  //   width: 170px;
+  //   color: #fff;
+  // }
+  // .ant-menu {
+  //   height: 50px;
+  // }
 }
 </style>

+ 6 - 0
src/pages/Iot/index.vue

@@ -1,5 +1,11 @@
 <template>
   <div class="iot" >
     iot
+    <ModalPro />
   </div>
 </template>
+
+<script setup lang="ts" >
+import ModalPro from '@/components/ModalPro/index.vue'
+// import {}  from '@vue'
+</script>

+ 1 - 3
src/store/router.ts

@@ -60,12 +60,10 @@ export const useAppRouter = defineStore(ConstantStore.ROUTER, () => {
   watch(
     () => RootRouter.currentRoute.value.path,
     () => {
-      console.log('RootRouter.currentRoute.value.path:', RootRouter.currentRoute.value)
-
       appRouter.sider = {
         route: RootRouter.getRoutes().find(item => item.path === appRouter.navbar!.selectPath)?.children as ROUTER.RoutesProps[],
         selectPath: RootRouter.currentRoute.value.path,
-        openKeys: [RootRouter.currentRoute.value.matched[1].path]
+        openKeys: RootRouter.currentRoute.value.matched.map(item => item.path)
       }
       setAppRouterState(appRouter)
       emitter.emit(Emitter.NAVBAR)

+ 27 - 0
yarn.lock

@@ -1346,6 +1346,11 @@
   dependencies:
     "@types/node" "*"
 
+"@types/web-bluetooth@^0.0.16":
+  version "0.0.16"
+  resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8"
+  integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
+
 "@types/webpack-env@^1.15.2":
   version "1.18.0"
   resolved "https://registry.npmmirror.com/@types/webpack-env/-/webpack-env-1.18.0.tgz#ed6ecaa8e5ed5dfe8b2b3d00181702c9925f13fb"
@@ -1841,6 +1846,28 @@
   resolved "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a"
   integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==
 
+"@vueuse/core@^9.13.0":
+  version "9.13.0"
+  resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4"
+  integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==
+  dependencies:
+    "@types/web-bluetooth" "^0.0.16"
+    "@vueuse/metadata" "9.13.0"
+    "@vueuse/shared" "9.13.0"
+    vue-demi "*"
+
+"@vueuse/metadata@9.13.0":
+  version "9.13.0"
+  resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff"
+  integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==
+
+"@vueuse/shared@9.13.0":
+  version "9.13.0"
+  resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9"
+  integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==
+  dependencies:
+    vue-demi "*"
+
 "@webassemblyjs/ast@1.11.1":
   version "1.11.1"
   resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"