如何禁用vuejs路由器链接?

时间:2020-04-23 20:33:45

标签: javascript vue.js vue-router routerlink

我有一个使用vue创建的单页应用程序,并且导航链接都使用router-link标签完成。我的老板想在导航栏中添加一些项目,但要禁用它们,以便人们可以一眼看到即将推出的某些功能。但是我不知道如何完全禁用路由器链接!

preventDefault不执行任何操作,@click.native.prevent="stopClick()"不执行任何操作(我尝试将其发送给函数以查看是否会阻止单击,但尽管进行了阻止,但它只是调用了该函数并仍然进行路由),添加了disabled类并设置pointer-events: none;的css规则无效。我不确定还有什么尝试,这是使禁用的链接成为普通文本而不是路由器链接的唯一方法吗?

11 个答案:

答案 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>

方法 3:使用 <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)

路由器 v4 的更新:

使用 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>

来源:https://next.router.vuejs.org/api/#router-link-s-v-slot

答案 9 :(得分:0)

NuxtLink (Vue Router v4)

对我来说,下面的代码很有魅力。这是我在我的应用程序中使用 nuxttailwind 的真实代码。

              <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' : '';
  }
}