vue中利用provide和inject实现页面刷新(无白屏)重载组件
1.场景
在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求。
2.遇到的问题
1. 用vue-router重新路由到当前页面,页面是不进行刷新的
2.采用window.reload(),或者router.go(0)刷新时,整个浏览器进行了重新加载,闪烁,体验不好
3.解决方法
provide / inject 组合
作用:允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
使用 provide和inject
这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
简单来说就是子孙组件可以访问到祖先的对象方法。
在 App.vue 文件里写入provide的方法
<!--页面级vue组件--> <template> <div id="app" v-if="isRouterAlive"> <keep-alive> <router-view ></router-view> </keep-alive> </div> </template> <script> export default { name: 'App', provide () { // 在祖先组件中通过 provide 提供变量 return { reload: this.reload // 声明一个变量 } }, data () { return { isRouterAlive: true // 控制 router-view 是否显示达到刷新效果 } }, methods: { // provide中声明的变量 reload () { // 通过 this.isRouterAlive 控制 router-view 达到刷新效果 this.isRouterAlive = false this.$nextTick(()=> { this.isRouterAlive = true }) } } } </script> <style> </style>
然后在需要刷新的子孙组件中用inject注入 App.vue 中provide声明的变量
<template> <div class="page"> <button @click="reloadFun">刷新</button> </div> </template> <script> import vue from 'vue'; export default { inject:['reload'], // 使用 inject 注入 reload 变量 data(){ return{ } }, methods: { reloadFun(){ this.reload(); // 直接使用 } }, mounted() {} } </script> <style> </style>
转载:https://blog.csdn.net/z591102/article/details/107244569
-----------------------------------------------------------注意!!!-----------------------------------------------------------------------------------------------
注意!!!!!
这个写法错误的!!! <template> <div id="app" > <keep-alive> <router-view v-if="isRouterAlive"></router-view> </keep-alive> </div> </template>
正确的写法!!! <template> <div id="app" v-if="isRouterAlive"> <keep-alive> <router-view></router-view> </keep-alive> </div> </template>