| <template> | 
|     <div class="box"> | 
|         <div class="box_h" style="height: 49px;" :style="store.state.type ? 'padding-bottom: 15px;' : ''"></div> | 
|         <div class="box_tar" style="height: 49px;" :style="store.state.type ? 'padding-bottom: 15px;' : ''"> | 
|             <div class="box_tar_item" v-for="(item, i) in Menu" :key="i" @click.stop="jump(item.path)"> | 
|                 <div class="box_tar_item_position" v-if="item.isCode"> | 
|                     <img class="box_tar_item_code" :src="item.isActive ? item.activeIcom : item.icon" alt="" /> | 
|                     <span :style="{ color: item.isActive ? '#222222' : '#666666' }">{{item.name}}</span> | 
|                 </div> | 
|                 <div class="box_tar_item_normal" v-else> | 
|                     <van-badge :content="store.state.upcomingNum.d" max="99" v-if="item.path === '/index' && store.state.upcomingNum.d > 0"> | 
|                         <img :src="item.isActive ? item.activeIcom : item.icon" alt="" /> | 
|                     </van-badge> | 
|                     <img :src="item.isActive ? item.activeIcom : item.icon" alt="" v-else /> | 
|                     <span :style="{ color: item.isActive ? '#222222' : '#666666' }">{{item.name}}</span> | 
|                 </div> | 
|             </div> | 
|         </div> | 
|         <!--    扫码组件   --> | 
|         <v-ScanCode | 
|             :openCode="openCode" | 
|             :infos="['第一次扫码', '第二次扫码']" | 
|             @closePopup="closePopup" | 
|             @onDecode="onDecode"> | 
|         </v-ScanCode> | 
|     </div> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
|     import { ref, reactive, watch, nextTick, onMounted } from 'vue' | 
|     import { useRoute, useRouter } from "vue-router"; | 
|     import { useStore } from "vuex" | 
|     import { MenuVerification } from '@/interface' | 
|   | 
|     const store = useStore() | 
|   | 
|     let datas = ref<string[]>([]) | 
|   | 
|     const openCode = ref<boolean>(false) | 
|   | 
|     const route = useRoute() | 
|   | 
|     const router = useRouter() | 
|   | 
|     const Menu = reactive<Array<MenuVerification>>([ | 
|         { | 
|             icon: require('@/assets/icon/nav_daiban@2x.png'), | 
|             activeIcom: require('@/assets/icon/nav_daiban_sel@2x.png'), | 
|             path: '/index', | 
|             isActive: false, | 
|             name: '待办' | 
|         }, | 
|         { | 
|             icon: require('@/assets/icon/nav_gongzuotai@2x.png'), | 
|             activeIcom: require('@/assets/icon/nav_gongzuotai_sel@2x.png'), | 
|             path: '/workbench', | 
|             isActive: false, | 
|             name: '工作台' | 
|         }, | 
|         // { | 
|         //     icon: require('@/assets/icon/nav_saoma@2x.png'), | 
|         //     activeIcom: require('@/assets/icon/nav_saoma@2x.png'), | 
|         //     path: '', | 
|         //     isActive: false, | 
|         //     isCode: true, | 
|         //     name: '扫码' | 
|         // }, | 
|         // { | 
|         //     icon: require('@/assets/icon/nav_kanban@2x.png'), | 
|         //     activeIcom: require('@/assets/icon/nav_kanban_sel@2x.png'), | 
|         //     path: '/bulletinboard', | 
|         //     isActive: false, | 
|         //     name: '看板' | 
|         // }, | 
|         { | 
|             icon: require('@/assets/icon/nav_wode@2x.png'), | 
|             activeIcom: require('@/assets/icon/nav_wode_sel@2x.png'), | 
|             path: '/my', | 
|             isActive: false, | 
|             name: '我的' | 
|         } | 
|     ]) | 
|   | 
|     const jump = (path: string): void => { | 
|         if (path === '') { | 
|             openCode.value = true | 
|             return | 
|         } | 
|         router.push({ path }) | 
|     } | 
|   | 
|     // 关闭扫码组件 | 
|     const closePopup = (): void => { | 
|         openCode.value = false | 
|     } | 
|   | 
|     // 获取扫码值 | 
|     const onDecode = (data: string[]): void => { | 
|         console.log(data) | 
|         datas.value = data | 
|         nextTick(() => { | 
|             openCode.value = false | 
|         }) | 
|     } | 
|   | 
|     // 监听函数 | 
|     watch(() => route.path,(news, old): void => { | 
|         Menu.forEach(item => { | 
|             item.isActive = item.path === news; | 
|         }) | 
|     },{ immediate: true }) | 
|   | 
|     onMounted(() =>{ | 
|         store.dispatch('getUpcomingNum') | 
|     }) | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
| .box { | 
|     .box_tar { | 
|         width: 100%; | 
|         display: flex; | 
|         background: white; | 
|         position: fixed; | 
|         bottom: 0; | 
|         left: 0; | 
|         box-shadow: 0px -2px 0px 0px rgba(238, 238, 238, 0.9); | 
|         .box_tar_item { | 
|             flex: 1; | 
|             height: 100%; | 
|             display: flex; | 
|             align-items: center; | 
|             justify-content: center; | 
|             flex-direction: column; | 
|             position: relative; | 
|             .box_tar_item_normal { | 
|                 display: flex; | 
|                 align-items: center; | 
|                 justify-content: center; | 
|                 flex-direction: column; | 
|                 .box_tar_item_code { | 
|                     width: 88px; | 
|                     height: 88px; | 
|                 } | 
|                 img { | 
|                     width: 44px; | 
|                     height: 44px; | 
|                 } | 
|                 span { | 
|                     font-size: 20px; | 
|                     font-weight: 400; | 
|                     color: #666666; | 
|                     text-shadow: 0px -2px 0px rgba(238, 238, 238, 0.9); | 
|                 } | 
|             } | 
|             .box_tar_item_position { | 
|                 display: flex; | 
|                 flex-direction: column; | 
|                 align-items: center; | 
|                 position: absolute; | 
|                 top: -30px; | 
|                 z-index: 9; | 
|                 .box_tar_item_code { | 
|                     width: 88px; | 
|                     height: 88px; | 
|                 } | 
|                 img { | 
|                     width: 26px; | 
|                     height: 26px; | 
|                 } | 
|                 span { | 
|                     font-size: 20px; | 
|                     font-weight: 400; | 
|                     color: #666666; | 
|                     padding-bottom: 12px; | 
|                     text-shadow: 0px -2px 0px rgba(238, 238, 238, 0.9); | 
|                 } | 
|             } | 
|         } | 
|     } | 
| } | 
| </style> |