vue-router
防跳牆控制由於在實際開發中,從本身的角度來看,發現能夠經過地址欄輸入地址,即可以進入本沒有權限的網頁。而咱們通常只是操做登陸頁面,其餘頁面不多考慮,此刻特來嘗試解決一下html
vue-router
使用思路
vue
<el-row class="tac"> <el-col :span="6"> <h5>默認顏色</h5> <el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose"> <el-submenu index="1"> <template slot="title"> <i class="el-icon-location"></i> <span>導航一</span> </template> <el-menu-item-group> <router-link to="/nav_menu/nav_menu_one"> <el-menu-item index="1-1">選項1</el-menu-item> </router-link> <router-link to="/nav_menu/nav_menu_two"> <el-menu-item index="1-2">選項2</el-menu-item> </router-link> <router-link to="/nav_menu/nav_menu_three"> <el-menu-item index="1-3">選項3</el-menu-item> </router-link> </el-menu-item-group> </el-submenu> </el-menu> </el-col> <el-col :span="6"> <router-view /> </el-col> </el-row>
效果圖
vue-router
經過請求後,獲取用戶可顯示的菜單欄 (假設指定選項2沒法顯示)測試
js優化
data() { return { user: {} } }, created() { this.getUserInfo() }, methods: { /** * 用戶信息 */ getUserInfo() { // 假設用戶信息 const USER_INFO = ['one', 'three'] //開始進行添加 for (let item of USER_INFO) { this.user[item] = true } }, }
html 對每一個連接添加
v-if="user.**"
能夠進行指定顯示this
<el-menu-item-group> <router-link to="/nav_menu/nav_menu_one" v-if="user.one"> <el-menu-item index="1-1">選項1</el-menu-item> </router-link> <router-link to="/nav_menu/nav_menu_two" v-if="user.two"> <el-menu-item index="1-2">選項2</el-menu-item> </router-link> <router-link to="/nav_menu/nav_menu_three" v-if="user.three"> <el-menu-item index="1-3">選項3</el-menu-item> </router-link> </el-menu-item-group>
可是這樣並不能防止跳牆,假設在地址欄中輸入指定的地址
spa
能夠看到,本不該該顯示選項2的,結果依舊能夠顯示code
再對路由進行加工處理component
利用
meta
進行處理meta: { flag: ** }
router
{ path: '/nav_menu', name: 'NavMenu', component: () => import('./../components/NavMenu.vue'), children: [ { path: 'nav_menu_one', meta: {flag: 'one'}, component: () => import('./../components/NavMenuOne.vue') }, { path: 'nav_menu_two', meta: {flag: 'two'}, component: () => import('./../components/NavMenuTwo.vue') }, { path: 'nav_menu_three', meta: {flag: 'three'}, component: () => import('./../components/NavMenuThree.vue')}, ] },
業務邏輯處理
router.beforeEach((to, from, next) => { // 假設顯示的數據 const USER_MENU = ['one', 'three'] // --------------------------------------- if (USER_MENU.includes(to.meta.flag)) { next() } else { if (to.path === '/error') { next() } else { next('/error') } } })
至此,咱們的要求就暫時完成了
v-if
,目前沒有想到更好的替代最後但願能拋磚引玉,能有更優的解決方案