Vue-router bir bağlantıyı yeni bir sekmede açabilir mi?


97

Bir özet sayfam ve bir detay alt sayfam var. Tüm rotalar, aşağıdaki vue-routergibi programlı gezinme kullanılarak (v 0.7.x) ile uygulanır :

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

Ancak özet sayfasından alt sayfaya yönlendirdiğimde, alt sayfayı tıpkı _target="blank"bir <a>etikete ekleyerek yapacağım gibi yeni bir sekmede açmam gerekiyor .

Bunu yapmanın bir yolu var mı?


3
Bunun vue yönlendirici ile mümkün olduğunu sanmıyorum, url'nizi çıkarabilir ve oluşturabilir ve ardından window.open (url, '_blank') kullanabilirsiniz
— Deepak

1
Evet, resmen bunun imkansız olduğunu söylüyorlar. Teşekkür ederim.
— Tang Jiong

Aşağıda işe yarayan bir cevap var, bunu sorunuzun cevabı olarak kabul etmelisiniz, değil mi?
— Andres Felipe

Yanıtlar:


169

Bunun gibi bir şey yapabileceğinizi düşünüyorum:

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

benim için çalıştı. Teşekkürler.


4
Bu bana en iyi yol gibi görünüyor. Bazı kesilmiş dizeleri bir araya getirmek zorunda kalmadan url'yi oluşturmak için hala $ yönlendiriciyi, ardından yeni sekmeyi açmak için pencereyi kullanın. +1
— John Smith

2
Erişmeye çalıştığınız rotanın url'si bu şekilde değişirse, bu en eksiksiz çözümdür. Güzel!
— Nitzankin

3
Ne yazık ki bu yöntem bazı varsayılan tarayıcı açılır pencere engelleyicisi tarafından engelleniyor
— Photonic

Bu en iyi cevap IMO
— kaleazy

1
@Rafel, Anthone Gore'un 'Full-Stack Vue.js 2 ve Laravel 5' kitabının github'ındaki kaynak koduyla ilgili bir Vue.JS sorusuna göz atmanızı isteyebilir miyim? Stackoverflow.com/questions/59245577 /… ? OP'nin DÜZENLEME: bölümüne özellikle bir göz atın.
— Istiaque Ahmed

124

Yeni sürümlerde artık bu mümkün gibi görünüyor (Vue Router 3.0.1):

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

Yine de parametreleri geçirebilecek gibi görünmüyor musunuz? sadece bağlantının kendisini açın. Doğru?
— Gotts

@Gotts ayrıca params ve queryparams de geçebilirsiniz. Bunu yapmak için kod aşağıda verilmiştir <router-link: to = "{name: 'fooRoute', params: {param_var: 'id_parameter'}, query: {query_var: 'query_params'}}" target = "_ blank" > Bağlantı Metni </router-link>
— Pushkar Shirodkar

Bunun <router-link> için olduğunu ve programlı olarak çalışmadığını unutmayın this.$router.push().
— jplindstrom

22

Merak edenler için cevap hayırdır. Github'da ilgili konuya bakın .

S: Yeni sekme programında bağlantı yönlendirici açılabilir mi?

C: Hayır. Normal bir bağlantı kullanın.


12
Teşekkür ederim, aslında konu benim tarafımdan açıldı.
— Tang Jiong

5
Artık v3 stackoverflow.com/a/49654382/2678454'tetarget="_blank" bir <router-link>etikete eklemek mümkün
— teşekkürlerd

Tam URL'yi oluşturmak ve window.open kullanmak yerine bunu çok yararlı buldum
— Sainath SR

14

Rotanızı soruda sorulduğu gibi tanımlamanız durumunda (yol: '/ link / to / page'):

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
    }
  ]
})

Özet sayfanızdaki URL'yi çözebilir ve alt sayfanızı aşağıdaki gibi açabilirsiniz:

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

Elbette rotanıza bir ad verdiyseniz, URL'yi ada göre çözebilirsiniz:

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

...

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

Referanslar:


11

Projenizde bir yerde, genellikle main.js veya router.js

import Router from 'vue-router'

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

Bileşeninizde:

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

Olumsuz oylama değil, ama belki Vue3 için iyidir? Çünkü bu. $ Router.open konsol / günlüğe kaydediliyor, benim için tanımsız olarak dönüyor
— Dexygen

Bu yaklaşım, prototipi mutasyona uğrattığı için önerilmez. Günlüğe kaydedemezsiniz çünkü şartnamenin bir parçası değildir.
— adi518

4

Bence en iyi yol şunları kullanmaktır:

window.open("yourURL", '_blank');

🚀 * uçup gider *


2
Yeterince uzakta değil
— Dexygen

4

Bu kodu yönlendirme dosyanıza yazmanız yeterlidir:

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

4

Bu benim için çalıştı

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

@Rafael_Andrs_Cspedes_Basterio cevabını değiştirdim


3

Eğer gibi göreli yollar üzerinde SADECE ilgilenen varsa: /dashboard, /aboutvb, diğer yanıtlara bakın.

https://www.google.comYeni bir sekme gibi mutlak bir yol açmak istiyorsanız , Vue Router'ın bunları idare etmek için OLMADIĞINI bilmelisiniz.

Ancak, bunu bir özellik isteği olarak görüyorlar. 1280 . Ama bunu yapana kadar,



İşte harici bağlantıları vue-router ile yönetmek için yapabileceğiniz küçük bir numara.

  • Yönlendirici yapılandırmasına gidin (muhtemelen router.js) ve şu kodu ekleyin:
/* 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()
}

Şimdi, ne zaman mutlak URL'lerle uğraşsak bir çözümümüz var. Örneğin, google'ı yeni bir sekmede açmak için

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

Yeni bir sekmede başka bir sayfa açtığımızda kullanmamız GEREKİR noopener noreferrer.

Daha fazlasını buradan okuyun

Veya burada


yeni pencerenin açılmadığı cep telefonları dışında neredeyse tüm cihazlarda benim için iyi çalışıyor!
— javascript110899

0

Bu benim için çalışıyor:

HTML şablonunda: <a target="_blank" :href="url" @click.stop>your_name</a>

Takılı (): this.url = `${window.location.origin}/your_page_name`;


0

Bir bağlantı etiketi kullanarak bunu yapmanın en basit yolu şudur:

<a :href="$router.resolve({name: 'posts.show', params: {post: post.id}}).href" target="_blank">
    Open Post in new tab
</a>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.