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.