Vue页面手动刷新,实现导航栏激活项还原到初始状态


Posted in Javascript onAugust 06, 2020

场景描述:在页面中存在顶部导航和左侧导航,左侧导航和右侧内容区使用了命名视图实现,点击左侧导航的链接时,右侧内容区相应显示不同组件内容。问题:在当前链接手动刷新浏览器(例如:浏览器地址为/enterprise/list),顶部导航激活项还原到初始状态(这里默认是“工作台”项)。

原理:每次刷新都会重新实例化Vue,也就是会调用created方法。

<template>
 <el-menu :default-active="defaultActiveIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect" :router="true">
   <el-menu-item index="/">工作台</el-menu-item>


<el-menu-item index="/enterpriseManager">企业管理</el-menu-item>


<el-menu-item index="/orderManager">订单管理</el-menu-item>


<el-menu-item index="/systemManager">系统管理</el-menu-item>

</el-menu>
</template>
<script>
export default {
 name: 'app',
 data () {
  return {
   defaultActiveIndex: "/"
  }
 },
 created() {
  // 组件创建完后获取数据,
  // 此时 data 已经被 observed 了
  this.fetchData()
 },
 methods: {
  handleSelect(index){
   this.defaultActiveIndex = index;
  },
  jumpTo(url){
   this.defaultActiveIndex = url;
   this.$router.push(url); //用go刷新
  },
  fetchData () {
   var cur_path = this.$route.path; //获取当前路由
   var routers = this.$router.options.routes; // 获取路由对象
   var nav_type = "";
   for(var i=0; i<routers.length; i++){
    var children = routers[i].children;
    if(children){
     for(var j=0; j<children.length; j++){
      var grand_children = children[j].children;
      if(grand_children){
       for(var k=0; k<grand_children.length; k++){
        if(grand_children[k].path == cur_path){
         nav_type = routers[i].type;
         break;
        }
       }
      }
     }
    }
   }
   if(nav_type == "home"){
    this.defaultActiveIndex = "/";
   } else if(nav_type == "enterprise"){
    this.defaultActiveIndex = "/enterpriseManager";
   }
  }
 }
 watch: {
  '$route': 'fetchData'
 }
}
</script>

附上router配置格式:

export default [
{
 path: '/',
 type: 'home', //自定义type区分不同模块菜单
 name: 'home',
 redirect: '/dashboard',
 component: Home,
 menuShow: true,
 children: [
  {
   path: '/dashboard',
   component: HomeNav,
   name: 'dashboard',
   leaf: true, // 只有一个节点
   iconCls: 'icon-home', // 图标样式class
   menuShow: true,
   children: [
    { path: '/dashboard', component: Dashboard, name: '首页', menuShow: true }
   ]
  },
  {
   path: '/mySet',
   component: HomeNav,
   name: '我的设置',
   iconCls: 'el-icon-menu',
   menuShow: true,
   children: [
    { path: '/mySet/plan', component: Plan, name: '行程计划', menuShow: true },
    { path: '/mySet/maillist', component: Maillist, name: '通讯录', menuShow: true }
   ]
  }
 ]
},
{
 path: '/enterpriseManager',
 type: 'enterprise',
 name: 'enterprise',
 component: Home,
 redirect: '/enterprise/list',
 menuShow: true,
 children: [
  {
   path: '/enterpriseList',
   component: EnterpriseNav,
   name: 'enterpriseList',
   leaf: true, // 只有一个节点
   iconCls: 'icon-home', // 图标样式class
   menuShow: true,
   children: [
    { path: '/enterprise/list', component: EnterpriseList, name: '企业列表', menuShow: true }
   ]
  },
  {
   path: '/enterpriseAdd',
   component: EnterpriseNav,
   name: 'enterpriseAdd',
   leaf: true, // 只有一个节点
   iconCls: 'el-icon-menu',
   menuShow: true,
   children: [
    { path: '/enterprise/add', component: EnterpriseAdd, name: '企业添加', menuShow: true }
   ]
  },
  {
   path: '/enterpriseValidate',
   component: EnterpriseNav,
   name: 'enterpriseValidate',
   leaf: true, // 只有一个节点
   iconCls: 'el-icon-menu',
   menuShow: true,
   children: [
    { path: '/enterprise/validate', component: EnterpriseValidate, name: '企业认证', menuShow: true }
   ]
  }
 ]
}
]

补充知识:vue手动刷新视图以及其他小问题

最近把手头上一个使用angularJS+jquery各种七七八八组件写的页面拿vue+elementUI重写了一边, 真是极度丝滑, 记录一些vue和elementUI的小问题

1.如果vue中的数据结构比较庞大的话, 十分有可能会出现model更新而视图不更新/model和视图都不更新也不报错的情况, 此时需要手动刷新vue的数据, 在change或click事件中, 使用this.$forceUpdate()手动刷新视图

//像这样
 changeSef: function () {
  //手动刷新视图
  var that = this;
  that.$forceUpdate();
 },

2.在vue中使用setTimeout

//错误示范
setTimeout(bidOrderInit, 200);
//上面那样是不行的,网上查了下, 大致是说在setTimeout中this指向window对象, 
//于是乎被定时的方法中就使用不到vue的this对象了
//正确示范
//可以无视对ie的支持时
setTimeout(()=> {
 this.bidOrderInit();
}, 200);
//需要兼容ie时
setTimeout(function () {
 this.bidOrderInit();
}, 200);

以上这篇Vue页面手动刷新,实现导航栏激活项还原到初始状态就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用JavaScript页面不刷新时全选择,全删除(GridView)
Apr 14 Javascript
跟着JQuery API学Jquery 之二 属性
Apr 09 Javascript
图片上传插件jquery.uploadify详解
Nov 15 Javascript
理解javascript闭包
Dec 15 Javascript
Javascript中的对象和原型(二)
Aug 12 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
JavaScript数据结构之二叉树的遍历算法示例
Apr 13 Javascript
移动端效果之IndexList详解
Oct 20 Javascript
jQuery 实现批量提交表格多行数据的方法
Aug 09 jQuery
微信小程序之 catalog 切换实现解析
Sep 12 Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
Aug 06 #Javascript
前端开发基础javaScript的六大作用
Aug 06 #Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
Aug 06 #Javascript
解决vue-router路由拦截造成死循环问题
Aug 05 #Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 #Javascript
vue相同路由跳转强制刷新该路由组件操作
Aug 05 #Javascript
解决vue路由name同名,路由重复的问题
Aug 05 #Javascript
You might like
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
Python中处理时间的几种方法小结
2015/04/09 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
python实现关键词提取的示例讲解
2018/04/28 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
实习生自我鉴定范文
2013/12/05 职场文书
学习十八大的心得体会
2014/09/01 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
颐和园的导游词
2015/01/30 职场文书
佛光寺导游词
2015/02/10 职场文书
中国梦宣传标语口号
2015/12/26 职场文书