Vue中使用vuex实现el-tab的路由跳转以及样式回显

一、给vue中引入vuex

npm install vuex --save

二、使用vuex中store

1.引入vuex以及store

找到vue项目中的main.js文件引入store

// 引入vuex
import Vuex from 'vuex'
// 引入store (后面我们需要自建这个文件)
import store from './store'
// 使用vuex
Vue.use(Vuex)

new Vue({
  router,
  // 加入store
  store,
  render: h => h(App)
}).$mount('#app')

2.创建store文件夹

在项目的src下创建store文件夹

在这里插入图片描述

创建index.js 与 tab.js文件
在这里插入图片描述

3. 书写index.js

import Vue from 'vue'
import Vuex from 'vuex'
import tab from '../store/tab'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    tabs
  }
})

4.书写tab.js文件

/**
 * 数据源  相当于组件中的data
 * @type {{state: {tabList: [], currentMenu: {}, menu: []}}}
 */
const state = {
  tabList: []
}

/**
 * 组件中的方法 methods
 * @type {{selectMenu(*, *=): void, closeTab(*, *): void}}
 */
const mutations = {
  selectMenu (state, val) {
    state.currentMenu = val
    const result = state.tabList.findIndex(item => item.path === val.path)
    result === -1 ? state.tabList.push(val) : ''
  },
  closeTab (state, val) {
    const result = state.tabList.findIndex(item => item.path === val.path)
    state.tabList.splice(result, 1)
  }
}

export default {
  state,
  mutations
}

三、页面使用

1.如何做到样式回显

首先了解el-menu标签回显选中样式控制的属性

default-active // default-active属性的值与导航中el-menu-item中的菜单选中index属性赋值的路径相同即可做的样式选中回显

在了解一下el-tab标签回显选中样式控制的属性

v-model //v-model属性的值与el-tab-pane中的name属性相同即可做的样式选中回显

这样我们知道当我们点击导航栏时,我们至少需要获取到的数据

{
  message: '导航名称',
  path: '导航路径',
  name: 'name标识'
}

2.el-menu传值

我们需要给导航栏一个单击事件 触发事件时将值传递给我们tab中的state中的tabList集合添加值

// 这里的menuList就是根据上个步骤中做的假数据进行循环赋值
<el-menu
  :default-active="defaultActiveValue"
  background-color="#545c64"
  text-color="#fff"
  router
  active-text-color="#ffd04b">
  <el-submenu :index="item.path" v-for="item in menuList" :key="item.message">
    <template slot="title">
      <i :class="item.icon"></i>
      <span>{{ item.message }}</span>
    </template>
    <!-- menuClick()单击事件拿到我们需要的值 -->
    <el-menu-item :index="child.path" v-for="child in item.children" :key="child.path" @click="menuClick(child)">
      <i :class="child.icon"></i>
      {{ child.message }}
    </el-menu-item>
  </el-submenu>
</el-menu>
<script>
export default {
  data() {
    return {
      menuList: [{假数据},{假数据}]
    }
  },
  methods: {
    // 导航栏单机事件
    menuClick (child) {
      // selectMenu使我们在tab.js中定义的方法 用于添加进tab中tabList集合方法
      this.$store.commit('selectMenu', child)
    }
  }
}
</script>

3.el-tabs的传值与回调

<el-main>
  <el-tabs v-model="editableTabsValue" type="card">
  <!-- tabs是我们从tab.js中拿到的tabsList -->
    <el-tab-pane
      v-for="item in tabs"
      :name="item.name"
      :key="item.path"
      :label="item.message">
    </el-tab-pane>
  </el-tabs>
  <!-- 路由跳转页签 -->
  <router-view></router-view>
</el-main>

export default {
// 引入vuex中的mapSta
 import { mapState } from 'vuex'
 // 使用computed监听
  computed: {
  // 用ES6的对象扩展符合并computed 拿到tabList
    ...mapState({
      tabs: state => state.tabs.tabList
    })
  }
}
<el-main>
<!-- remove关闭方法 changTab选中tab页签事件  -->
  <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab" @tab-click="changTab">
  <!-- tabs是我们从tab.js中拿到的tabsList -->
    <el-tab-pane
      v-for="item in tabs"
      :name="item.name"
      :key="item.path"
      :label="item.message">
    </el-tab-pane>
  </el-tabs>
  <!-- 路由跳转页签 -->
  <router-view></router-view>
</el-main>

export default {
// 引入vuex中的mapSta
 import { mapState } from 'vuex'
 // 使用computed监听
  computed: {
  // 用ES6的对象扩展符合并computed 拿到tabList
    ...mapState({
      tabs: state => state.tabs.tabList
    })
  },
  methods: {
  // tab关闭方法
    removeTab (targetName) {
	  // 关闭事件只能拿到当前关闭tab当前的name属性
	  // 通过遍历tab拿到对应的对象
      const tab = this.tabs.find(item => item.name === targetName)
      // tab.js中的删除方法
      this.$store.commit('closeTab', tab)
    },
    // tab点击选中事件
    changTab (data) {
      // 拿到当前tab页签的数据 根据name拿到对象
      const tab = this.tabs.find(item => item.name === data.name)
      this.$router.push(tab.path)
      this.$store.commit('selectMenu', tab)
      // defaultActiveValue 与 tab.path相等 导航栏选中样式回显
      this.defaultActiveValue = tab.path
    }
  }
}

最后将我们在上面第2步中menuClick方法加入代码 让tab也拿到样式回显

this.editableTabsValue = child.name
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国家级著名CV工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值