【DAY44】动态样式与局部路由守卫的实现

文章介绍了如何在Vue.js应用中根据当前路由动态设置组件样式,利用`currenttab`变量和`:class`指令实现。同时,展示了如何使用路由守卫和Vuex进行状态管理,确保在非登录和注册页面显示Header组件,并实时更新当前路由信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态样式:

 将列表项的类设置为“others”和“active”中的一个,具体取决于currenttab变量是否等于“home”。

Myheader.vue:

 <li :class="['others', currenttab ==='home'?'active':'']" @click="handleclick('home')">
                <i class="el-icon-s-home"></i>
                首页
            </li>

click调用handleclick方法:

 handleclick(value){
            this.onchange(value)
        }

在该方法内部,有一个调用 onchange 方法的语句,并将 value 参数作为参数传递给它。onchange 方法可能在同一 Vue.js 组件中或其父组件中定义

app.vue:

<div v-if="CurrentRouter!='/Login'&&CurrentRouter!='/Register'">
      <!-- 显示名为 “MyHeader” 的组件,并传递两个 prop 值(即当前选项卡和选项卡改变事件)给该组件。 -->
      <MyHeader :currenttab="currenttab" :onchange="onchange" />
    </div>

当前路由不是 “/Login” 或 “/Register” 时显示一个名为 “MyHeader” 的组件,并传递两个 prop 值(即当前选项卡和选项卡改变事件)给该组件。

methods:{
    onchange(value){
      this.currenttab=value
    }
  }

局部路由守卫

假设要让header组件在进入非登录与注册界面时显示,而进入登录与注册界面时不显示,需要用到局部路由守卫的思想

App.vue

<div v-if="CurrentRouter!='/Login'&&CurrentRouter!='/Register'">

通过对CurrentRouter的值的查询来判断是否显示Myheader标签。而CurrentRouter值的计算需要

在路由内进行判断,将当前路由的去向存入CurrentRouter

在这里我们使用Vuex中的store库,实现状态的响应式更新

vue.use(Vuex)
//全局的Vuex创建
const store=new Vuex.Store({
    state:{
        //具体路径是字符串
        //表示当前路由的信息
        currentroute:''
    },
    mutations:{
        //更改state中数据的方法
        //state表示状态对象,value是提交过来的对象
        updateRoute(state,value){
        //将value.path的值赋给state.currentroute,实现store中值的更新
           state.currentroute=value.path
        }
    },
}

在 Vuex 的 Store 中,数据的更新必须通过 mutation 来进行。Mutation 是 Vuex 中专门用于修改 Store 中数据的方法,主要作用是封装对 Store 中 state 的修改,强制通过 mutation 修改 state,而不能直接对其进行赋值。

具体来说,Mutation 的作用是为了保证 Store 中的 state 状态的响应式更新机制。即,当 state 发生变化时,会通知到 Vuex 中所有使用该 state 的组件自动更新状态。如果直接修改 state 而不通过 mutation,那么这种响应式的更新机制就无法保证,组件也就不再自动更新状态。

index.js

router.beforeEach((to, from, next) => {

这段代码是 Vue Router 中的一个全局前置路由守卫。在 Vue Router 中,使用 router.beforeEach 注册全局的前置路由守卫函数,这个函数会在每一个路由跳转之前被调用。

  • to 表示即将要进入的目标路由对象。
  • from 表示当前所在的路由对象。
  • next 是一个函数,调用 next() 表示可以顺利进入到目标路由,调用 next(false) 表示不进入目标路由,调用 next('/') 或者其他路径表示跳转到指定的路由。

store.commit("updateRoute",to)

这段代码的作用是提交一个 mutation,用于更新 Store 中的某个状态数据

app.vue

computed: {
    CurrentRouter() {
      // console.log(store)
      return store.state.currentroute
    }
  },
  //路由守卫
  mounted() {
    //在页面渲染时获取当前路径
    this.CurrentRouter = this.$router.currentRoute.path
    // console.log(this.$router.currentRoute.path)
  }

这个组件引用了一个 Vuex Store 实例,通过计算属性函数 CurrentRouter 来获取 Store 中的 currentroute 状态,用于保存当前路由的路径。

接着,在组件的 mounted 生命周期函数中,通过 $router.currentRoute.path 属性来获取当前路径信息,并将其更新到组件的 CurrentRouter 数据属性中。由于组件中的数据更新会自动触发视图的更新,因此这个数据的变化将会同步到组件的视图中,从而达到更新组件状态的目的。

 Vuex 中的状态数据是响应式的,只有在通过 Vue 组件模板或者计算属性访问该状态数据时,Vue 才会自动追踪该状态数据的变化,并更新组件的视图。如果没有计算属性或者模板中的引用,即使我们修改了 currentroute 的值,组件的视图也不会自动更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值