首页 > 其他分享 >「Vue系列」之Vue2实现当前组件重新加载

「Vue系列」之Vue2实现当前组件重新加载

时间:2022-12-12 14:55:22浏览次数:56  
标签:nextTick Vue provide reload inject Vue2 组件 加载 页面

 

遇到问题的场景:
需要把当前组件完全还原成初始化状态,不要页面全部刷新
例如:重置按钮,只刷新当前加载组件
其他办法:
使用vue-router重新定向到当前页面,页面不刷新
使用window-reload() 页面全部刷新,用户体验太差

解决方法:
使用v-if provide inject和this.$nextTick()【版本限制 vue2.2.0】

原理:
使用v-if控制router-view的显示或隐藏(v-if会把事件监听器和自组件适当的销毁或者重建)
使用provide / inject组合解决自组件层级比较深的问题
使用this.$nextTick()实现页面异步刷新

provide / inject
就是父组件中使用provide提供变量(对象或者是一个函数),在子组件中通过inject来注入变量
不管层级有多深,并在起上下游关系成立的时间始终生效

this.$nextTick()
当dom发生变化,更新后执行的回调

实际代码:
在App.vue里面,声明reload方法,然后通过provide把reload方法注入,使用bol值控制router-view隐藏(销毁),再通过this.$nextTick()在dom更新之后利用bol控制router-view重新加载,实现页面刷新的效果

<template>
  <div id="app">
    <router-view v-if="isRouterShow"/>
  </div>
</template>
<script>
export default {
  name: 'App',
  provide () {
    return {
      reload: this.reload
    }
  },
  data () {
    return {
      isRouterShow: true
    }
  },
  methods: {
    async reload () {
      this.isRouterShow = false
      await this.$nextTick()
      this.isRouterShow = true
    }
  }
}
</script>


在子组件里面
使用inject注入App.vue提供的reload依赖,然后在需要的地方直接调用this.reload()方法即可

export default {
   inject: ['reload'],
   watch: {
       '$route.query.index'(){
           this.reload()
       }
   }
 }

当路由从

door?index=0&dateName=normal

变到如下情况时,就会重载当前页面

door?index=1&dateName=normal

这样在路由变化的时候,就会更新当前页面了



Vue提倡数据驱动dom,但是存在特殊情况,如果有更好的解决方法,请多多指教!

标签:nextTick,Vue,provide,reload,inject,Vue2,组件,加载,页面
From: https://www.cnblogs.com/liyunxi/p/16976028.html

相关文章

  • vue3 封装t点击左右箭头实现内容滑动组件
    1、组件<template><divclass="switch-tab"><divclass="switch-tab-left"@click="leftClick"><el-icon:size="24"color="rgba(99,149,255,1)"><A......
  • 项目启动报错: Vue 报错error:0308010C:digital envelope routines::unsupported
      Vue报错error:0308010C:digitalenveloperoutines::unsupported查了好多,找出原因:因为我刚装了最新的node版本18.12.1出现这个错误是因为 node.jsV17版本中最......
  • 随笔(六)『Vue项目 引入 阿里巴巴图标』
    1、进入阿里巴巴图标官网:https://www.iconfont.cn/2、随意选个图标库3、把需要的图标添加入库(购物车)4、进入购物车,下载代码5、在项目中创建文件夹:src/icon,把下载好......
  • vue视频会议录屏并保存mp4格式到本地
    项目中,在视频会议中需要添加一个录屏功能主要是利用newMediaRecorder()来实现屏幕录制功能。//录制屏幕asyncscreenRecording(){//提示用户去选择和......
  • Vue3.0文档学习心得--响应式核心
    1.ref():接受一个内部值,返回一个响应式的、可更改的ref对象.此对象只有一个指向其内部值的属性 .value。使用实例:constcount=ref(0) console.log(count.value)//......
  • Vue响应式系统原理并实现一个双向绑定
    这一章就着重讲两个点:响应式系统如何收集依赖响应式系统如何更新视图我们知道通过Object.defineProperty做了数据劫持,当数据改变的时候,get方法收集依赖,进而set方法调用......
  • Vue实战必会的几个技巧
    键盘事件在js中我们通常通过绑定一个事件,去获取按键的编码,再通过event中的keyCode属性去获得编码如果我们需要实现固定的键才能触发事件时就需要不断的判断,其实很......
  • Vue响应式依赖收集原理分析-vue高级必备
    背景在Vue的初始化阶段,_init方法执行的时候,会执行initState(vm),它的定义在src/core/instance/state.js中。在初始化data和propsoption时我们注意initProps......
  • vue源码分析-v-model的本质
    双向数据绑定这个概念或者大家并不陌生,视图影响数据,数据同样影响视图,两者间有双向依赖的关系。在响应式系统构建的上,中,下篇我已经对数据影响视图的原理详细阐述清楚了。而......
  • vue源码分析-事件机制
    这个系列讲到这里,Vue基本核心的东西已经分析完,但是Vue之所以强大,离不开它提供给用户的一些实用功能,开发者可以更偏向于业务逻辑而非基本功能的实现。例如,在日常开发中,我们......