[前端] Vue3实现刷新页面局部内容的示例代码

1961 0
王子 2022-10-21 15:20:24 | 显示全部楼层 |阅读模式
目录

    第一步:定义状态标识第二步、借用v-if 指令让dom节点重新渲染第三步、修改isRouterAlive 值,实现dom的重新渲染

想要实现页面的局部刷新,我们只需要实现局部组件(dom)的重新渲染。在Vue中,想要实现这一效果最简便的方式方法就是使用v-if 指令。
在Vue2中我们除了使用v-if 指令让局部dom的重新渲染,也可以新建一个空白组件,需要刷新局部页面时跳转至这个空白组件页面,然后在空白组件内的beforeRouteEnter 守卫中又跳转回原来的页面。
如下图所示,如何在Vue3.X中实现点击刷新按钮实现红框范围内的dom重新加载,并展示对应的加载状态。




由于Vue3.X中script setup 语法中组件内守卫只有onBeforeRouteUpdate 及onBeforeRouteUpdate 两个API,因此我们来借助v-if 指令使局部dom重新渲染来实现这一需求。

第一步:定义状态标识

在全局状态中定义一个isRouterAlive 标识刷新状态,根据isRouterAlive 变化来重新渲染。isLoading 标识加载状态。
  1. import { defineStore } from 'pinia'
  2. export const useAppStore = defineStore({
  3.   id: 'app',
  4.   state: () =>
  5.     ({
  6.       isRouterAlive: true,
  7.       isLoading: false
  8.     } as { isRouterAlive: boolean; isLoading: boolean })
  9. })
复制代码
第二步、借用v-if 指令让dom节点重新渲染
  1. <template>
  2.   <div class="common-layout">
  3.     <el-container>
  4.       <SideMenuView :collapse="isCollapse"></SideMenuView>
  5.       <el-container>
  6.         <NavMenuView v-model:collapse="isCollapse"></NavMenuView>
  7.         <TabsView></TabsView>
  8.         <!--核心 start-->
  9.         <el-main
  10.           v-loading="appStore.isLoading"
  11.           element-loading-text="页面加载中……"
  12.           element-loading-background="rgba(0, 0, 0, 0.8)"
  13.         >
  14.           <router-view v-if="appStore.isRouterAlive"> </router-view>
  15.         </el-main>
  16.         <!--核心 end-->
  17.         <el-footer>Footer</el-footer>
  18.       </el-container>
  19.     </el-container>
  20.   </div>
  21. </template>
  22. <script setup lang="ts">
  23. import SideMenuView from './SideMenuView.vue'
  24. import NavMenuView from './NavMenuView.vue'
  25. import TabsView from './TabsView.vue'
  26. import { useAppStore } from '@/stores/app'
  27. const appStore = useAppStore()
  28. const isCollapse = ref(false)
  29. </script>
  30. <style lang="scss" scoped>
  31. …… CSS样式
  32. </style>
复制代码
第三步、修改isRouterAlive 值,实现dom的重新渲染
  1. <template>
  2.   <div
  3.     class="tabs-item cursor-pointer arrow-down"
  4.     ref="buttonRef"
  5.     @click="onClickOutside"
  6.   >
  7.     <el-icon><ArrowDownBold /></el-icon>
  8.   </div>
  9.   <el-popover
  10.     ref="popoverRef"
  11.     trigger="hover"
  12.     virtual-triggering
  13.     :virtual-ref="buttonRef"
  14.   >
  15.     <div class="arrow-down-item" @click="handleCommand('refresh')">刷新</div>
  16.     <div class="arrow-down-item" @click="handleCommand('closeOther')">
  17.       关闭其他
  18.     </div>
  19.     <div class="arrow-down-item" @click="handleCommand('closeLeft')">
  20.       关闭左侧
  21.     </div>
  22.     <div class="arrow-down-item" @click="handleCommand('closeRight')">
  23.       关闭右侧
  24.     </div>
  25.   </el-popover>
  26. </template>
  27. <script setup lang="ts">
  28. import { CloseBold, ArrowDownBold } from '@element-plus/icons-vue'
  29. import type { MenuItem } from '@/interface/menu'
  30. import { useMenuRouterStore } from '@/stores/menu-router'
  31. import { useTabsStore } from '@/stores/tabs'
  32. import { useAppStore } from '@/stores/app'
  33. const router = useRouter()
  34. const menuRouterStore = useMenuRouterStore()
  35. const tabsStore = useTabsStore()
  36. const appStore = useAppStore()
  37. // tabs功能操作
  38. const buttonRef = ref()
  39. const popoverRef = ref()
  40. const onClickOutside = () => {
  41.   unref(popoverRef).popperRef?.delayHide?.()
  42. }
  43. const handleCommand = (command: string) => {
  44.   if (command === 'refresh') {
  45.     appStore.isLoading = true // 展示数据加载状态
  46.     appStore.isRouterAlive = false // 设置为false,卸载dom
  47.     setTimeout(() => { // 此处采用了定时器,并没有采用网上比较常见的nextTick
  48.       appStore.isRouterAlive = true // 设置为true,重新挂载dom
  49.       appStore.isLoading = false // 隐藏数据加载状态
  50.     }, 500)
  51.   } else if (command === 'closeOther') {
  52.     tabsStore.closeOther()
  53.   } else {
  54.     tabsStore.closeLeftOrRight(command)
  55.   }
  56. }
  57. // ……
  58. </script>
  59. <style lang="scss" scoped>
  60. …… CSS样式
  61. </style>
复制代码
到此这篇关于Vue3实现刷新页面局部内容的示例代码的文章就介绍到这了,更多相关Vue3 刷新页面局部内容内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行