【vue】使用provide,inject来刷新页面

本文探讨如何通过调整提供和注入机制,解决页面刷新导致的空白期问题,提供流畅的用户体验,同时优化数据重载方法。

问题:使用其他方式刷新当前页面有时会出现一段时间的空白,用户体验不好(利用这些方式来重新加载数据也不好)

provide代码:

//被控制页面
<template>
  <div id="app">
    <router-view v-if="isRouterAlive" />
  </div>
</template>

<script>
export default  {
  name:  'App',
  provide(){
    return {
      //方法定义在provide中传给inject
      reload: this.reload
    }
  },
  data(){
    return {
      isRouterAlive: true
    }
  },
  methods:{
    //定义刷新方法
    reload(){
      this.isRouterAlive = false;
      this.$nextTick(() => {
        this.isRouterAlive = true;
      });
    }
  }
}
</script>

inject代码:

//控制页面
<template>
  <!--此处控制刷新-->
  <div @click="handleClick"></div>
</template>

<script>
export default {
  inject:['reload'],
  methods:{
    handleClick(){
      // 重新加载当前页面
      this.reload();
    }
  }
};
</script>

provide和inject可以跨组件传递变量和方法

Vue 项目中,实现请求接口数据后自动刷新页面或重新渲染数据,可以通过多种方式来实现,具体取决于业务需求数据更新的频率。 ### 使用 `provide/inject` 实现组件间通信并触发刷新 如果希望在某个操作完成后自动刷新页面内容,可以使用 `provide` `inject` 实现跨组件通信。例如,在 `App.vue` 中定义一个 `reload` 方法,并通过 `provide` 提供给子组件使用。该方法通过控制 `router-view` 的 `v-if` 状态来实现组件的重新加载。 ```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` 方法来触发页面刷新,从而重新渲染数据[^2]。 ### 使用定时器实现接口轮询与数据刷新 在某些场景下,需要定期从后台获取新数据并刷新页面内容。此时可以使用 `setInterval` 或封装一个通用的定时刷新函数来实现。为了避免定时器叠加导致的页面卡顿问题,应在每次调用前清除已有的定时器。 ```javascript // utils/publicFun.js export function refresh(callback, firstExecution = true, time = 1000 * 5) { let timer = null; const intervalFn = () => { if (!firstExecution) { callback(); } else { firstExecution = false; } timer = setTimeout(intervalFn, time); }; timer = setTimeout(intervalFn, firstExecution ? time : 0); return () => clearTimeout(timer); } ``` 在组件中调用该函数,并在数据请求完成后执行页面刷新逻辑。同时,应在组件销毁时清除定时器以避免内存泄漏[^1]。 ```vue <script> import { refresh } from '@/utils/publicFun'; export default { data() { return { inverterMonTimer: null }; }, mounted() { if (this.inverterMonTimer) { clearInterval(this.inverterMonTimer); this.inverterMonTimer = null; } this.inverterMonTimer = refresh(() => { this.fetchData(); }, false, 5000); }, methods: { fetchData() { // 请求接口数据 // 数据获取完成后可调用 this.$root.reload() 触发页面刷新 } }, beforeDestroy() { if (this.inverterMonTimer) { this.inverterMonTimer(); } } }; </script> ``` ### 使用 `window.location.reload()` 或 `this.$router.go(0)` 强制刷新页面 如果数据更新后需要完全重新加载整个页面,可以直接使用 `window.location.reload()` 或 Vue Router 提供的 `this.$router.go(0)` 方法[^2]。 ```javascript // 强制刷新页面 window.location.reload(); // 或者使用 Vue Router 的 go 方法 this.$router.go(0); ``` 这种方式适用于需要完全重新加载页面的场景,但会带来额外的性能开销。 ### 总结 在 Vue 中实现请求接口数据后自动刷新页面,可以通过组件通信机制(如 `provide/inject`)结合 `v-if` 控制组件重新渲染,也可以使用定时器轮询接口并手动触发刷新。若需完全重新加载页面,则可使用 `window.location.reload()` 或 `this.$router.go(0)`。在实现过程中应注意定时器的管理,避免重复创建导致页面卡顿。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值