在Vue中实现随hash改变响应菜单高亮


Posted in Javascript onMarch 09, 2020

情景

Vue+Element 实现管理页面菜单栏,

点击菜单时 router 改变 hash 访问不同子组件。

但是改变 hash 时菜单栏展开状态和 highlight 并不会同步,

需要手动实现。

Try Try See

第一反应是通过 onhashchange 监听 hash 的变化,

 location.hash.slice(2) 推给 menu 的 default-active 即可。

此时通过手动输入 url 或者前进后退时均可正常加载对应状态,但是通过组件中的 link 访问时,menu 的状态没有改变。

加入 alert 验证发现没有触发 hashchange。

Why

Seafault 的解释是

  • Vue-Router 底层调用的是 history.pushState

查阅 MDN 发现

  • 注意 pushState() 绝对不会触发 hashchange 事件,即使新的 URL 与旧的 URL 仅哈希不同也是如此。

Solution

Vue-Router 的文档中给出两个方案

watch $route 对象
const User = {
 template: '...',
 watch: {
 $route(to, from) {
  // react to route changes...
 }
 }
}

使用 beforeRouteUpdate

const User = {
 template: '...',
 beforeRouteUpdate(to, from, next) {
 // react to route changes...
 // don't forget to call next()
 }
}

另外

原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。

知识点扩展

vue关于点击菜单高亮与组件切换

有两种

一种是 使用router-link 这种直接可以用router-link-active 来写高亮样式   组件在路由跳转后 高亮依旧存在

一种是:is的应用了     点击触发事件 事件改变currentView的值 可以直接改掉  :is  这个引入文件入口

<template>
 <div class="index">
 <div class="headTop"></div>
 <div class="nav">
  <img src="../assets/img/logo.png" alt="">
  <el-row :gutter="20">
  <el-col :span="3" @click.native="tabChange('FirstScreen')" ><div class="grid-content bg-purple">首页</div></el-col>
  <el-col :span="3" @click.native="tabChange('pagetwo')"><div class="grid-content bg-purple">场站</div></el-col>
  <el-col :span="3" @click.native="tabChange('pagethree')" ><div class="grid-content bg-purple">订舱</div></el-col>
  
  </el-row>
 </div>
 <div :is="currentView"></div>
  <!-- <div class="aaa" >asdasd</div> -->
 </div> 
</template>
 
<script>
import FirstScreen from '../views/containers/FirstScreen'
import pagetwo from '../views/containers/pagetwo'
import pagethree from '../views/containers/pagethree'
 
export default {
 name: 'index',
 components:{
 FirstScreen,
 pagetwo,
 pagethree
 },
 data () {
 return {
  FirstScreen: 'FirstScreen',
  pagetwo: 'pagetwo',
  pagethree: 'pagethree',
  currentView: 'FirstScreen',//组建切换
 
  activeIndex: '1',
  activeIndex2: '1',
  
 }
 },
 computed:{
 
 },
 created(){
 
 },
 methods:{
 tabChange(tabItem) {
  this.currentView = tabItem;
  console.log(this.currentView);
 }
 }
}
</script>

到此这篇关于在Vue中实现随hash改变响应菜单高亮的文章就介绍到这了,更多相关vue 菜单高亮内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery图片轮播的具体实现
Sep 11 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
Apr 29 Javascript
简单介绍JavaScript的变量和数据类型
Jun 03 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
Jul 04 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
Dec 13 Javascript
Angular中ng-bind和ng-model的区别实例详解
Apr 10 Javascript
JS获取并处理php数组的方法实例分析
Sep 04 Javascript
vue-router实现编程式导航的代码实例
Jan 19 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
Aug 21 Javascript
Vue分页效果与购物车功能
Dec 13 Javascript
微信小程序wxs实现吸顶效果
Jan 08 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
May 24 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
Mar 08 #Javascript
JS中的const命令你真懂它吗
Mar 08 #Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
Mar 08 #Javascript
Vue vm.$attrs使用场景详解
Mar 08 #Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
Mar 08 #Javascript
vue-cli点击实现全屏功能
Mar 07 #Javascript
vue全屏事件开发详解
Jun 17 #Javascript
You might like
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
PHP中for与foreach的区别分析
2011/03/09 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
用unescape反编码得出汉字示例
2014/04/24 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
详解JavaScript的变量
2019/04/04 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
戴尔英国官网:Dell英国
2017/05/27 全球购物
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
2015年美容师个人工作总结
2015/10/14 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
详解vue身份认证管理和租户管理
2021/05/25 Vue.js