Vue Global Reload
vue-admin-element的全局按钮添加
有天业务测试来找我,说希望在列表页加一个刷新按钮-。-
其实这个页面的各个生命周期钩子里都加了刷新操作的回调函数,除此之外,table-row中的全部button也绑定了相同的方法—为的就是希望实时刷新结果(恨不能挂个websocket上去)
所以我很诧异,为啥还要单独添加一个独立于各种区块的按钮呢?她说就觉得方便···
众所周知,我是一个爱惜页面整洁性的人,所以我准备加一个全局刷新按钮,就在odin后台的顶部!
同时也因为这个项目的侧边栏渲染是基于比如oom模块:
src/router/modules/oom.js
中的
import Layout from '@/layout'
const oomRouter = {
path: '/oom',
component: Layout,
redirect: '/oom/index',
name: 'oom自动化分析',
// hidden: true,
meta: {
title: 'oom自动化分析',
icon: 'tree-table',
roles: ['admin']
// affix: true
},
children: [
{
path: 'index',
component: () => import('@/views/oom/index'),
name: 'oom-index',
// hidden: true,
meta: { title: '管理首页', icon: 'guide', noCache: true }
},
{
path: 'list',
component: () => import('@/views/oom/list'),
name: 'oom-list',
// hidden: true,
meta: { title: '任务列表', icon: 'nested', noCache: true }
}
]
}
export default oomRouter
所以我明显需要在Layout中添加元素和方法,而进去发现它是以组件的方式使用Navbar的,所以在Navbar.vue
中的
<div class="right-menu">
<template v-if="device!=='mobile'">
<search
id="header-search"
class="right-menu-item"
/>
<div
class="right-menu-item hover-effect"
style="font-size: 22px;"
@click.stop="refresh()"
><i class="el-icon-refresh" /></div>
.
.
.
之后注入依赖,最后加入我的刷新图标,并绑定了refresh()
方法
export default {
inject: ['reload'],
.
.
.
methods: {
refresh() {
// this.$router.go(0)
this.reload()
}
.
.
.
这里的this.reload()
需要用到provide / inject
的知识了,简单来说就是provide / inject这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
!!!
那么我要在哪个祖先组件中注入呢?显然是App.vue
<template>
<div id="app">
<router-view v-if="isRouterAlive" />
</div>
</template>
<script>
export default {
name: 'App',
provide() {
return {
reload: this.reload
}
},
data() {
return {
isRouterAlive: true
}
},
methods: {
reload() {
this.isRouterAlive = false
this.$nextTick(() => {
this.isRouterAlive = true
})
}
}
}
</script>
reload
方法只是触发了一下<router-view v-if="isRouterAlive" />
的隐藏与显示的切换,但是这样就可以触发vue的重新渲染,并且不会整体刷新,也会重新触发生命周期函数,这样就实现了全局按钮的刷新操作啦!!!