diff --git a/src/menu/menu-item-props.ts b/src/menu/menu-item-props.ts index 4babf9de9..3cf780dc5 100644 --- a/src/menu/menu-item-props.ts +++ b/src/menu/menu-item-props.ts @@ -18,7 +18,7 @@ export default { }, /** 是否禁用菜单项展开/收起/跳转等功能 */ disabled: Boolean, - /** 跳转链接 */ + /** 跳转链接,菜单项渲染为a标签,当routerLink为true时将使用Router进行路由跳转 */ href: { type: String, default: '', @@ -33,6 +33,10 @@ export default { router: { type: Object as PropType, }, + /** + * 菜单项内容是否渲染为使用Router进行跳转的a标签,当且仅当 Router 存在时,该 API 有效 + */ + routerLink: Boolean, /** 链接或路由跳转方式 */ target: { type: String as PropType, diff --git a/src/menu/menu-item.tsx b/src/menu/menu-item.tsx index 2c0ea8b0e..5ca3f59d8 100644 --- a/src/menu/menu-item.tsx +++ b/src/menu/menu-item.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-nested-ternary */ import { defineComponent, computed, inject, onMounted, } from '@vue/composition-api'; @@ -40,10 +41,10 @@ export default defineComponent({ menu.select(props.value); ctx.emit('click'); - if (props.to) { + if (props.to || (props.routerLink && props.href)) { const router = props.router || (ctx.root as Record).$router; const methods: string = props.replace ? 'replace' : 'push'; - router[methods](props.to).catch((err: Error) => { + router[methods](props.to || props.href).catch((err: Error) => { // vue-router 3.1.0+ push/replace cause NavigationDuplicated error // https://github.com/vuejs/vue-router/issues/2872 // 当前path和目标path相同时,会抛出NavigationDuplicated的错误 @@ -76,6 +77,8 @@ export default defineComponent({ }; }, render() { + const router = this.router || this.$router; + const liContent = (
  • ).ripple} @@ -83,15 +86,30 @@ export default defineComponent({ onClick={this.handleClick} > {renderTNodeJSX(this, 'icon')} - {this.href ? ( - + {this.routerLink ? ( + e.preventDefault()} + > + {renderContent(this, 'default', 'content')} + + ) : this.href ? ( + this.disabled && e.preventDefault()} + > {renderContent(this, 'default', 'content')} ) : ( - {renderContent(this, 'default', 'content')} + {renderContent(this, 'default', 'content')} )}
  • ); + // 菜单收起,且只有本身为一级菜单才需要显示 tooltip if (this.collapsed && /tmenu/i.test(this.$parent.$vnode?.tag)) { return ( diff --git a/src/menu/type.ts b/src/menu/type.ts index b35896695..b115ee065 100644 --- a/src/menu/type.ts +++ b/src/menu/type.ts @@ -157,7 +157,7 @@ export interface TdMenuItemProps { */ disabled?: boolean; /** - * 跳转链接 + * 跳转链接,菜单项渲染为a标签,当routerLink为true时将使用Router进行路由跳转 * @default '' */ href?: string; @@ -174,6 +174,10 @@ export interface TdMenuItemProps { * 路由对象。如果项目存在 Router,则默认使用 Router。 */ router?: Record; + /** + * 菜单项内容是否渲染为使用Router进行跳转的a标签,当且仅当 Router 存在时,该 API 有效 + */ + routerLink?: boolean; /** * 链接或路由跳转方式 */