vue点击当前路由刷新

背景

这里的当前路由刷新当然不是简单的当前页面的刷新。如果使用

  • location.reload()
  • this.$router.go(0)

其实最终效果都是刷新了当前浏览器页面,就像你手动F5的效果,这当然不是我们想要的效果,会有闪屏,用户体验不够友好(你试试就知道了)。我们想要的效果应该是下图所示的亚子(就像在走前端路由那样):
在这里插入图片描述

实现方案

方案一:provide / inject

这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效。虽然官方给出了下面的警告,但是只要不滥用,还是可以拿来解决实际问题的。

provide 和 inject 主要在开发高阶插件/组件库时使用。并不推荐用于普通应用程序代码中。

provide选项是一个对象或返回一个对象的函数,该对象包含可注入其子孙的property。
inject选项是一个字符串数组或对象(对象的key是本地的绑定名,value是注入的内容)
这里的实际问题我们如何通过这两组属性来实现呢?
首先在App.vue文件中注入我们的provider

// App.vue
<template>
  <div id="app">
    <Layout class="full-height">
      <TopMenu />
      <Content class="framework-content">
        <router-view v-if="isRouterAlive"></router-view>
      </Content>
    </Layout>
  </div>
</template>

<script>
import TopMenu from '@/widget/TopMenu'
export default {
  components: {
    TopMenu
  },
  provide () {
	return {
	  reloadRouter: this.reloadRouter
	}
  },
  data () {
    return {
	  isRouterAlive: true
    }
  },
  methods: {
	reloadRouter () {
		this.isRouterAlive = false
		this.$nextTick(() => this.isRouterAlive = true)
	}
  }
}
</script>

注意:我们的左菜单在router-view内容中的

// 路由文件 router.js
{
	path: '/xxx/xxx',
	component: LeftMenu,
	children: [{
		path: 'home'
		component: () => import('../xxx/xxx')
	}]
},
// LeftMenu.vue
<template>
	<Layout class="left-menu full-height">
    <template v-if="leftMenuInfo">
      <Sider>
        <div class="title">
          <Icon :type="leftMenuInfo.titleIcon" size="24" />
          <span class="name">{{leftMenuInfo.titleText}}</span>
        </div>
        <Menu
          ref="menuRef"
          @on-select="handleSelect">
          ...
        </Menu>
      </Sider>
      <Content class="sidebar-right">
        <Breadcrumb v-if="breadcrum.length">
          ...
        </Breadcrumb>
        <div class="content">
          <router-view></router-view>
        </div>
      </Content>
    </template>
    <template v-else>
      <router-view></router-view>
    </template>
	</Layout>
</template>
<script>
export default {
  inject: ['reloadRouter'],
	data() {
		return {}
  },
	methods: {
		handleSelect(name) {
	     if (this.$route.path === name) {
	     	// 如果当前点击的路由就是当前路由
	       this.reloadRouter()
	     } else {
	       this.$router.push(name)
	     }
		}
	}
}
</script>

方案二:空白页中转

// router.js
/* 空白页 */
{
	path: '/refresh',
	component: () => import('../pages/refresh')
},
// refresh.vue
<template>
  
</template>

<script>
export default {
  beforeRouteEnter (to, from, next) {
    next(vm => vm.$router.replace(from.path))
  }
}
</script>
// LeftMenu.vue
handleSelect(name) {
   if (this.$route.path === name) {
      this.$router.replace('/refresh')
      // this.reloadRouter() // provide/inject方案
    } else {
      this.$router.push(name)
    }
}

原理其实就是当点击当前路由时,就跳转到空白页,在空白页对路由进行监控,当进入到空白页时就跳转到之前跳过来的页面去,以此实现实现当前页面的跳转。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值