Чи може vue-router відкрити посилання в новій вкладці?


96

У мене є підсумкова сторінка та детальна підсторінка. Всі маршрути реалізовані за допомогою vue-router(v 0.7.x) за допомогою програмної навігації, як це:

this.$router.go({ path: "/link/to/page" })

Однак, коли я переходжу зі сторінки резюме на підсторінку, мені потрібно відкрити підсторінку в новій вкладці так само, як це було б зробити, додавши _target="blank"до <a>тегу.

Чи є спосіб зробити це?


3
Я не думаю, що це можливо з маршрутизатором vue, ви можете витягти та побудувати свою URL-адресу, а потім скористатися window.open (url, '_blank')
Deepak

1
Так, офіційно кажуть, що це неможливо. Дякую.
Tang Jiong

є відповідь нижче, яка працює, ви повинні прийняти це як відповідь на ваше запитання, чи не вважаєте ви?
Андрес Феліпе,

Відповіді:


169

Я думаю, що ви можете зробити щось подібне:

let routeData = this.$router.resolve({name: 'routeName', query: {data: "someData"}});
window.open(routeData.href, '_blank');

це спрацювало для мене. Дякую.


4
Мені це здається найкращим способом. Ви все ще використовуєте маршрутизатор $ для побудови URL-адреси, не маючи при цьому з’єднання якогось хакі-рядка, а потім за допомогою вікна відкриваєте нову вкладку. +1
Джон Сміт,

2
Це найбільш повне рішення, якщо URL-адреса маршруту, до якого ви намагаєтесь отримати доступ, змінюється таким чином, тримає вас у стані. приємно!
Ніцанкін

3
На жаль, цей метод отримує блокування за допомогою певного блокувальника спливаючих вікон браузера
Photonic

Це найкраща відповідь ІМО
kaleazy

1
@Rafel, Можу чи я просити вас , щоб подивитися на Vue.JS питання , пов'язаний з вихідним кодом в GitHub книги «Full-Stack Vue.js 2 і Laravel 5» по Anthone Гор тут stackoverflow.com/questions/59245577 /… ? Особливо подивіться на розділ «ЗМЕНИТИ: ОП»?
Істіаке Ахмед

122

Здається, це тепер можливо в новіших версіях (Vue Router 3.0.1):

<router-link :to="{ name: 'fooRoute'}" target="_blank">
  Link Text
</router-link>

Здається, ви не можете передавати параметри? просто відкрийте саме посилання. Правильно?
Отримує

@Gotts ви також можете передавати параметри та параметри запитів. Код повинен робити це, наведено нижче <router-link: to = "{name: 'fooRoute', params: {param_var: 'id_parameter'}, query: {query_var: 'query_params'}}" target = "_ blank" > Текст посилання </router-link>
Пушкар Широдкар

Зверніть увагу, що це для <маршрутизатора>, він не працює програмно this.$router.push().
jplindstrom

22

Для тих, хто цікавиться, відповідь - ні. Дивіться відповідну проблему на github.

Питання: Чи може vue-маршрутизатор відкрити посилання в новій вкладці попрограмматично

В: Ні. Використовуйте звичайне посилання.


12
Дякую, насправді питання відкрито мною.
Tang Jiong

5
Тепер можна додати target="_blank"до <router-link>тегу в v3 stackoverflow.com/a/49654382/2678454
thanksd

Вважаю це дуже корисним замість побудови повної URL-адреси та використання window.open
Sainath SR

14

У випадку, якщо ви визначаєте свій маршрут, як той, що заданий у питанні (шлях: '/ посилання / на / сторінку'):

import Vue from 'vue'
import Router from 'vue-router'
import MyComponent from '@/components/MyComponent.vue';

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/link/to/page',
      component: MyComponent
    }
  ]
})

Ви можете визначити URL-адресу на сторінці підсумків та відкрити підсторінку, як показано нижче:

<script>
export default {
  methods: {
    popup() {
      let route = this.$router.resolve({path: '/link/to/page'});
      // let route = this.$router.resolve('/link/to/page'); // This also works.
      window.open(route.href, '_blank');
    }
  }
};
</script>

Звичайно, якщо ви дали своєму маршруту назву, ви можете визначити URL-адресу за назвою:

routes: [
  {
    path: '/link/to/page',
    component: MyComponent,
    name: 'subPage'
  }
]

...

let route = this.$router.resolve({name: 'subPage'});

Список літератури:


10

Десь у вашому проекті, як правило, main.js або router.js

import Router from 'vue-router'

Router.prototype.open = function (routeObject) {
  const {href} = this.resolve(routeObject)
  window.open(href, '_blank')
}

У вашому компоненті:

<div @click="$router.open({name: 'User', params: {ID: 123}})">Open in new tab</div>

Не голосування проти, але, можливо, це приємно для Vue3? Оскільки консоль / реєстрація цього. $ Router.open повертається для мене невизначеним
Dexygen

Цей підхід не рекомендується, оскільки він мутує прототип. Ви не можете записати його, оскільки це не є частиною специфікації.
adi518


4

Просто напишіть цей код у своєму файлі маршрутизації:

{
  name: 'Google',
  path: '/google',
  beforeEnter() {                    
                window.open("http://www.google.com", 
                '_blank');
            }
}

4

Це спрацювало для мене-

let routeData = this.$router.resolve(
{
  path: '/resources/c-m-communities', 
  query: {'dataParameter': 'parameterValue'}
});
window.open(routeData.href, '_blank');

Я змінив відповідь @Rafael_Andrs_Cspedes_Basterio


3

Якщо ви зацікавлені тільки на відносні шляхи , як: /dashboard, і /aboutт.д., інші відповіді.

Якщо ви хочете відкрити абсолютний шлях, наприклад: https://www.google.comдо нової вкладки, ви повинні знати, що маршрутизатор Vue НЕ призначений для їх обробки.

Однак вони, схоже, розглядають це як запит функції. # 1280 . Але поки вони цього не зроблять,



Ось невелика хитрість, яку ви можете зробити, щоб обробляти зовнішні посилання за допомогою vue-router.

  • Перейдіть до конфігурації маршрутизатора (ймовірно router.js) і додайте цей код:
/* Vue Router is not meant to handle absolute urls. */
/* So whenever we want to deal with those, we can use this.$router.absUrl(url) */
Router.prototype.absUrl = function(url, newTab = true) {
  const link = document.createElement('a')
  link.href = url
  link.target = newTab ? '_blank' : ''
  if (newTab) link.rel = 'noopener noreferrer' // IMPORTANT to add this
  link.click()
}

Тепер, коли ми маємо справу з абсолютними URL-адресами, ми маємо рішення. Наприклад, щоб відкрити Google на новій вкладці

this.$router.absUrl('https://www.google.com)

Пам'ятайте, що кожного разу, коли ми відкриваємо іншу сторінку на новій вкладці, МИ ПОВИННІ використовувати noopener noreferrer.

Детальніше читайте тут

або тут


мені добре працює майже на всіх пристроях, крім мобільних телефонів, де нове вікно не відкривається!
javascript110899

0

Це працює для мене:

У HTML-шаблоні: <a target="_blank" :href="url" @click.stop>your_name</a>

У змонтованому (): this.url = `${window.location.origin}/your_page_name`;


0

Найпростіший спосіб зробити це за допомогою прив'язки тегом буде такий:

<a :href="$router.resolve({name: 'posts.show', params: {post: post.id}}).href" target="_blank">
    Open Post in new tab
</a>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.