1、问题描述:
其一、需求为: 无论是通过路由组件形成的平台管理系统,还是通过文件配置形成的平台管理系统,都存在通过切换左侧的导航栏而使右侧的页面切换的业务需求;
其二、问题描述为: A、步骤一: 切换左侧不同的导航栏,右侧页面能展示对应的 .vue 文件,且加载都没有问题(即:页面可以加载,对应的接口也可以加载);
B、步骤二: 但要在左侧点击相同页面的导航栏(即:已经展示该页面,再点击左侧相同菜单,右侧页面不再重新加载,当然也没进行刷新操作);
C、步骤三: 想要的效果为:无论点击哪个导航栏菜单,右侧页面都想要被重新加载;
2、问题分析:
猜测重复点击相同页面的导航栏时,页面应该没有销毁和重新加载;
3、问题解决:
其一、点击导航菜单操作过程(即:现存的问题):
A、点击左侧导航栏执行 clickTarget() 函数:
B、子组件暴露 navigate() 方法及传 lvl3.target 参数:
C、父组件引入并触发 navigate() 方法:
// 并通过 curtarget 的值,在 KnsContent 组件中加载;
D、通过不同的 curtarget 来加载不同且独立的 vue 组件:
E、存在的问题:
重复点击左侧导航栏的菜单(即:点击左侧导航相同菜单),右侧页面不重新加载,但左侧切换不同的菜单,右侧页面加载就没有问题;
其二、修改的操作为(即:解决问题):
A、父组件引入并触发 navigate() 方法中,添加销毁和重加载操作:
// 当然,此时的 isActived 是已经定义过的;
B、通过不同的 curtarget 来加载不同且独立的 vue 组件中,添加 v-if 的操作:
// v-if 可以来控制组件的加载与销毁(即:v-if 为 true 时,页面(即:.vue 组件)就加载;而为 false 时,页面(即:.vue 组件)就销毁;)
C、此时需求就能满足:
修改上述位置代码后,就解决了:点击左侧相同菜单,右侧页面不重新加载的问题;
其三、解决过程剖析:
A、设置 isActived 的初始值为: true
因为项目刚运行打开时,右侧的页面要加载对应的 .vue 组件; 而若此时 isActived 的初始值为 false,那么右侧页面对应的 .vue 组件将会是空的;
B、nextTick() 方法的剖析:
在触发 navigate() 方法,执行语句:isActived.value = false 后, KnsContent 组件就会执行 v-if 的销毁动作并渲染和更新 DOM,而 nextTick() 方法就是要拿到最新的 DOM 后,立即执行 isActived.value = true 操作,然后 KnsContent 组件就再次被加载(即: v-if 为 true 的操作)并再次更新 DOM;
C、达到目的效果:
在 nextTick() 方法的使用下,就是实现了:点击左侧相同菜单,右侧页面也重新加载;