| | |
| | | @contextmenu.prevent.native="openMenu(tag, $event)" |
| | | > |
| | | {{ tag.title }} |
| | | <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> |
| | | <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)"/> |
| | | </router-link> |
| | | </scroll-pane> |
| | | <ul v-show="visible" :style="{ left: (openAside?left+170:left) + 'px', top: top + 'px' }" class="contextmenu"> |
| | |
| | | import path from 'path'; |
| | | |
| | | export default { |
| | | props:{ |
| | | openAside:{ |
| | | props: { |
| | | openAside: { |
| | | type: Boolean, |
| | | default: false |
| | | } |
| | | }, |
| | | components: { ScrollPane }, |
| | | components: {ScrollPane}, |
| | | data() { |
| | | return { |
| | | fullWidth: document.body.clientWidth, |
| | |
| | | }, |
| | | computed: { |
| | | visitedViews() { |
| | | return this.$store.state.tagsView.visitedViews; |
| | | let visitedViews = this.$store.state.tagsView.visitedViews |
| | | if (visitedViews&&visitedViews[0]&&visitedViews[0].title !== '主页') { |
| | | visitedViews.unshift({ |
| | | title: '主页', |
| | | path: '/dashboard', |
| | | query: {}, |
| | | fullPath: '/dashboard', |
| | | meta:{ |
| | | affix: true |
| | | } |
| | | }) |
| | | } |
| | | return visitedViews; |
| | | }, |
| | | routes() { |
| | | return this.$store.state.permission.routes; |
| | |
| | | fullPath: tagPath, |
| | | path: tagPath, |
| | | name: route.name, |
| | | meta: { ...route.meta }, |
| | | meta: {...route.meta}, |
| | | }); |
| | | } |
| | | if (route.children) { |
| | |
| | | }); |
| | | }, |
| | | addTags() { |
| | | const { name } = this.$route; |
| | | const {name} = this.$route; |
| | | if (name) { |
| | | this.$store.dispatch('tagsView/addView', this.$route); |
| | | } |
| | |
| | | }, |
| | | refreshSelectedTag(view) { |
| | | this.$store.dispatch('tagsView/delCachedView', view).then(() => { |
| | | const { fullPath } = view; |
| | | const {fullPath} = view; |
| | | this.$nextTick(() => { |
| | | this.$router.replace({ |
| | | path: '/redirect' + fullPath, |
| | |
| | | }); |
| | | }, |
| | | closeSelectedTag(view) { |
| | | this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => { |
| | | this.$store.dispatch('tagsView/delView', view).then(({visitedViews}) => { |
| | | if (this.isActive(view)) { |
| | | this.toLastView(visitedViews, view); |
| | | } |
| | |
| | | }); |
| | | }, |
| | | closeAllTags(view) { |
| | | this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => { |
| | | this.$store.dispatch('tagsView/delAllViews').then(({visitedViews}) => { |
| | | if (this.affixTags.some((tag) => tag.path === view.path)) { |
| | | return; |
| | | } |
| | |
| | | // you can adjust it according to your needs. |
| | | if (view.name === 'Dashboard') { |
| | | // to reload home page |
| | | this.$router.replace({ path: '/redirect' + view.fullPath }); |
| | | this.$router.replace({path: '/redirect' + view.fullPath}); |
| | | } else { |
| | | this.$router.push('/dashboard'); |
| | | } |
| | |
| | | font-size: 14px; |
| | | margin-left: 10px; |
| | | border-radius: 3px; |
| | | |
| | | &:first-of-type { |
| | | margin-left: 20px; |
| | | } |
| | | |
| | | &:last-of-type { |
| | | margin-right: 20px; |
| | | } |
| | | |
| | | &.active { |
| | | background-color: #fff; |
| | | color: #333333; |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .contextmenu { |
| | | margin: 0; |
| | | background: #fff; |
| | |
| | | font-weight: 400; |
| | | color: #333; |
| | | box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3); |
| | | |
| | | li { |
| | | margin: 0; |
| | | padding: 7px 16px; |
| | | cursor: pointer; |
| | | |
| | | &:hover { |
| | | background: #eee; |
| | | } |
| | |
| | | text-align: center; |
| | | transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
| | | transform-origin: 100% 50%; |
| | | |
| | | &:before { |
| | | transform: scale(0.6); |
| | | display: inline-block; |
| | | } |
| | | |
| | | &:hover { |
| | | background-color: #b4bccc; |
| | | color: #fff; |