vue中利用provide和inject實現頁面重新整理(無白屏)過載元件
阿新 • • 發佈:2020-09-21
1.場景
在處理列表時,常常有刪除一條資料或者新增資料之後需要重新重新整理當前頁面的需求。
2.遇到的問題
1. 用vue-router重新路由到當前頁面,頁面是不進行重新整理的
2.採用window.reload(),或者router.go(0)重新整理時,整個瀏覽器進行了重新載入,閃爍,體驗不好
3.解決方法
provide / inject組合
作用:允許一個祖先元件向其所有子孫後代注入一個依賴,不論元件層次有多深,並在起上下游關係成立的時間裡始終生效。
使用 provide和inject
這對選項需要一起使用,以允許一個祖先元件向其所有子孫後代注入一個依賴,不論元件層次有多深,並在起上下游關係成立的時間裡始終生效。 vi設計http://www.maiqicn.com 辦公資源網站大全https://www.wode007.com
簡單來說就是子孫元件可以訪問到祖先的物件方法。
在App.vue檔案裡寫入provide的方法
<!--頁面級Vue元件-->
<template>
<div id="app">
<keep-alive>
<router-view v-if="isRouterAlive"></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(function () {
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>