这节课我们来开发一下右侧操作功能和右键操作功能。
首先我们先来开发一下右侧的操作功能,我们用到tabs的右侧的插槽来处理这一部分的代码。
代码如下:
<script lang="ts" setup>
import type { DropdownOption } from 'naive-ui'
const dropdownOptions = computed<DropdownOption[]>(() => [
{
label: '关闭当前',
key: 'closeCurrent,
// 如果当前只剩下一页的话,我们是不允许关闭的,所以我们就通过计算属性的方式
// 来处理
disabled: tabList.value?.length === 1,
},
{
label: '刷新当前页',
key: 'refreshCurrent',
},
])
const handleMenuChange = (key: string) => {
if (key === 'closeCurrent')
// closeTab()
else if (key === 'refreshCurrent')
// refresh()
}
</script>
...
<template #suffix>
<div class="pr-16px">
<n-dropdown
trigger="click"
:options="dropdownOptions"
@select="handleMenuChange"
>
<n-icon size="16">
<MoreOutlined />
</n-icon>
</n-dropdown>
</div>
</template>
...
接下来我们就要实现这个关闭当前页签和刷新当前页签的功能
首先我们先来实现一下关闭页签的功能。
我们在multi-tab-state.ts中
const closeTab = (path?: string) => {
// 判断path是否存在,如果不存在就关闭当前页
if (!path)
path = current.value
// 如果当前页面是最后一个页面,就不能进行关闭
if (tabList.value?.length === 1) {
// 这里是可以支持多语言的,可以自己去实现
message?.info('这是最后一个标签,无法被关闭')
return
}
// 获取当前页面的索引地址
const currentIndex = tabList.value.findIndex(item => item.path === path)
// 判断当前页面是否不是当前选中的页面,如果不是就直接删除
if (path !== current.value) {
state.tabList.splice(currentIndex, 1)
return
}
// 如果删除的是当前页面,那么我们就需要处理一下,
// 如果删除的是当前页面的话,我们需要跳转到指定的目标页面
// 我们需要判断当前是不是在第一页,如果不是正常跳转到上一个页签。
const targetIndex = currentIndex === 0 ? currentIndex + 1 : currentIndex - 1
router.replace(state.tabList[targetIndex].route).then(() => {
// 完成跳转后再删除跳转前的页签
state.tabList.splice(currentIndex, 1)
}).catch()
}
首先我们想要实现刷新页面的话, 我们在这里一版本会通过重定向的方式进行实现,所以我们必须先要有一个支持重定向的页面,所以我们先来创建一下这个页面。
在pages下创建一个redirect的文件夹同时创建一个index.vue的文件。
然后我们在静态路由配置。
在routes中的static-routes.ts中增加路由部分。
{
// 我们配置一个路由,通过动态路由参数的方式进行配置,我们命名动态路由参数的名称为path
path: '/redirect/:path(.*)',
component: () => import('~/pages/redirect/index.vue'),
},
{
path: '/:pathMatch(.*)',
component: () => import('~/pages/exception/error.vue'),
},
然后改造一下我们的重定向页面部分
<script lang="ts" setup>
// 这一部分在配置完成路由后再实现
const router = useRouter()
const path = router.currentRoute.value.params?.path
if (path)
router.replace(`/${path}`)
else
router.replace('/')
</script>
<template>
<div />
</template>
然后我们再multi-tab-state.ts中增加一个方法
const refresh = (path?: string) => {
if (!path)
path = current.value
router.replace({
path: `/redirect${path}`,
}).catch().then(() => {
// TODO
})
}
最后我们在multi-tab中的index.vue进行配置
const handleMenuChange = (key: string) => {
if (key === 'closeCurrent')
closeTab()
else if (key === 'refreshCurrent')
refresh()
}
最后我们进行测试