我有一个使用vue创建的单页应用程序,并且导航链接都使用router-link
标签完成。我的老板想在导航栏中添加一些项目,但要禁用它们,以便人们可以一眼看到即将推出的某些功能。但是我不知道如何完全禁用路由器链接!
preventDefault
不执行任何操作,@click.native.prevent="stopClick()"
不执行任何操作(我尝试将其发送给函数以查看是否会阻止单击,但尽管进行了阻止,但它只是调用了该函数并仍然进行路由),添加了disabled
类并设置pointer-events: none;
的css规则无效。我不确定还有什么尝试,这是使禁用的链接成为普通文本而不是路由器链接的唯一方法吗?
答案 0 :(得分:5)
今天仍然没有本机解决方案。但是在vue-router存储库中有一个开放的PR:https://github.com/vuejs/vue-router/pull/2098。
一种解决方法是使用:
<router-link
:disabled="!whateverActivatesThisLink"
:event="whateverActivatesThisLink ? 'click' : ''"
to="/link"
>
/link
</router-link>
答案 1 :(得分:3)
我认为没有合适的解决方案,因为路由器链接没有disabled
属性,但是一个窍门是使用tag="button"
来添加所需的属性,如下所示:
<router-link
to="/link"
tag="button"
:disabled="true"
>
Link
</router-link>
答案 2 :(得分:2)
没有内置任何内容,probably won't ever be。也就是说,对我来说最有用的是使用CSS。
<router-link to="/my-route" :class="{ disabled: someBoolean }" />
.disabled {
opacity: 0.5;
pointer-events: none;
}
不透明度使它看起来已禁用,而pointer-events: none;
使其不可用,因此您无需同时处理:hover
样式或设置cursor
样式。
答案 3 :(得分:2)
只需设置 to=""
,链接就不会去任何地方。
答案 4 :(得分:2)
诀窍是在捕获阶段处理事件并阻止它向上传播。
<router-link
to="/path"
@click.native.capture.stop
>
Go to page
</router-link>
或命令式:
<router-link
to="/path"
@click.native.capture="handleClick"
>
Go to page
</router-link>
function handleClick(event) {
if (passesSomeCheck) event.stopPropagation();
}
如果您想从 Vue Router 获取解析路径以在没有 SPA 导航的情况下强制页面加载,这可能非常有用。
function handleClick(event) {
if (loadWithoutSpa) {
event.stopPropagation();
window.location.href = event.currentTarget.href;
};
}
<router-link
to="/path"
event
>
Go to page
</router-link>
<a>
标签<a :href="$router.resolve(route)">
Go to page
</a>
其中 route 可以与您传递给 to
上的 router-link
道具完全相同。
答案 5 :(得分:0)
要防止点击,您可以像这样直接访问router-link元素的事件属性(并且您可以使用本机点击来做其他事情):
<router-link
:event="clickable ? 'click' : ''"
@click.native="!clickable ? doOtherThing : ''" > Link </router-link>
答案 6 :(得分:0)
您可以为每个路由设置路由保护
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
//here you can set if condition
if (conditionTrue) {
//redirect to other route
next({path: '/bar'});
} else {
next();
}
}
}
]
})
或者您可以全局设置
routes: [
{path: '/foo', component: Foo, meta:{conditionalRoute: true}}
];
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.conditionalRoute)) {
// this route requires condition/permission to be accessed
if (!checkCondition ) {
//check condition is false
next({ path: '/'});
} else {
//check condition is true
next();
}
} else {
next(); // Don't forget next
}
})
有关更多信息: https://router.vuejs.org/guide/advanced/navigation-guards.html#global-before-guards
答案 7 :(得分:0)
您可以使用
<router-link
:is="isDisabled ? 'span' : 'router-link'"
to="/link"
>
/link
</router-link>
答案 8 :(得分:0)
使用 boolean
变量 status
确定链接是否处于活动状态,并将链接 (ctalink
) 作为变量传递。
无意中发现 nuxt-link
实现在更新时中断,因此根据经验,这同样有效。
<router-link
v-slot="{ navigate }"
:to="ctalink"
custom
>
<div @click="status ? navigate(ctalink) : null">
<div :class="status ? 'text-green' : 'text-gray'">
Click me when active
</div>
</div>
</router-link>
答案 9 :(得分:0)
对我来说,下面的代码很有魅力。这是我在我的应用程序中使用 nuxt
和 tailwind
的真实代码。
<nuxt-link
v-slot="{ navigate }"
:to="`lesson/${lesson.lesson_id}`"
append
custom
>
<button
class="focus:outline-none"
:class="{
'text-gray-500 cursor-default': !lesson.released,
}"
:disabled="!lesson.released"
@click="navigate"
>
{{ lesson.title }}
</button>
</nuxt-link>
答案 10 :(得分:0)
你可以试试:
<router-link
:event="whateverActivatesThisLink ? 'click' : ''"
>
Go to page
</router-link>
或者用计算编写更干净的代码:
<router-link
:event="handleWhatEverEvent"
>
Go to page
</router-link>
computed: {
handleWhatEverEvent() {
return this.whateverActivatesThisLink ? 'click' : '';
}
}