เรามี router.reload ใน vue-router หรือไม่?


95

ฉันเห็นในคำขอดึงนี้:

  • เพิ่ม router.reload()

    โหลดซ้ำด้วยเส้นทางปัจจุบันและเรียก data hook อีกครั้ง

แต่เมื่อฉันลองออกคำสั่งต่อไปนี้จากส่วนประกอบ Vue:

this.$router.reload()

ฉันได้รับข้อผิดพลาดนี้:

Uncaught TypeError: this.$router.reload is not a function

ฉันค้นหาในเอกสารแต่ไม่พบสิ่งที่เกี่ยวข้อง vue / vue-router ให้บริการบางอย่างเช่นนี้หรือไม่?

เวอร์ชันซอฟต์แวร์ที่ฉันสนใจ ได้แก่ :

"vue": "^2.1.0",
"vue-router": "^2.0.3",

ปล. ฉันรู้ว่าlocation.reload()เป็นทางเลือกหนึ่ง แต่ฉันกำลังมองหาตัวเลือก Vue ดั้งเดิม

คำตอบ:


138

this.$router.go()ไม่ว่าสิ่งนี้; หากไม่ได้ระบุอาร์กิวเมนต์เราเตอร์จะนำทางไปยังตำแหน่งปัจจุบันรีเฟรชเพจ

หมายเหตุ: ปัจจุบันการดำเนินงานของเราเตอร์และส่วนประกอบประวัติศาสตร์ไม่ได้ทำเครื่องหมายพระรามเป็นตัวเลือก แต่ IMVHO มันเป็นทั้งข้อผิดพลาดหรือละเลยในส่วนของอีวานคุณของเนื่องจากข้อมูลจำเพาะชัดเจนให้มัน ฉันได้ยื่นรายงานปัญหาเกี่ยวกับเรื่องนี้แล้ว หากคุณกังวลจริงๆเกี่ยวกับคำอธิบายประกอบ TS ในปัจจุบันให้ใช้สิ่งที่เทียบเท่าthis.$router.go(0)

เกี่ยวกับ 'เหตุใดจึงเป็นเช่นนั้น': goส่งผ่านอาร์กิวเมนต์ไปwindow.history.goภายในดังนั้นจึงเท่ากับwindows.history.go()- ซึ่งในทางกลับกันจะโหลดหน้าซ้ำตามเอกสาร MDN

หมายเหตุ: เนื่องจากการดำเนินการนี้เป็นการรีโหลดแบบ "ซอฟต์" บนเดสก์ท็อปปกติ (ไม่ใช่แบบพกพา) Firefox อาจมีสิ่งแปลก ๆ มากมายปรากฏขึ้นหากคุณใช้งาน แต่ในความเป็นจริงแล้วคุณต้องการการรีโหลดจริง การใช้window.location.reload(true);( https://developer.mozilla.org/en-US/docs/Web/API/Location/reload ) ที่ OP กล่าวถึงแทนอาจช่วยได้ - มันช่วยแก้ปัญหาของฉันใน FF ได้อย่างแน่นอน


4
ใช่มันกำลังทำการรีเฟรชหน้าไม่ใช่การโหลดคอมโพเนนต์
EscapeNetscape

<span @click = "() => {this. $ router.go ()}" class = "btn btn-lg btn-danger">
Vsevolod Azovsky

7
โปรดทราบว่า$router.go()ยอมรับพารามิเตอร์หนึ่งตัวดังนั้นคุณควรใช้เป็น$router.go(0)หมายถึงเลื่อนหน้าเป็นศูนย์ย้อนกลับไปในประวัติศาสตร์
Dan

1
@Dan FWIW ฉันจะบอกว่าทั้งgithub.com/vuejs/vue-router/blob/dev/src/index.js#L175และการใช้งาน (เช่นgithub.com/vuejs/vue-router/blob/ dev / src / history / html5.js # L40 ) อย่าทำเครื่องหมายพารามิเตอร์ว่าเป็นทางเลือกอาจเป็นข้อบกพร่องหรือการละเว้นในส่วนของ Evan You เนื่องจากข้อมูลจำเพาะอนุญาตอย่างชัดเจน (ดูdeveloper.mozilla.org/en-US/ เอกสาร / เว็บ / API / ประวัติ / go # พารามิเตอร์ ) ฉันได้ส่งรายงานข้อบกพร่องเกี่ยวกับเรื่องนี้ไปที่ @ github.com/vuejs/vue-router/issues/3065แล้ว

window.location.reload(forceReload)ดูเหมือนจะเลิกใช้แล้ว แต่window.location.reload()ก็โอเค
เฮนอน

43

วิธีแก้ไขที่ง่ายที่สุดคือเพิ่ม a: key attribute ให้กับ:

<router-view :key="$route.fullPath"></router-view>

เนื่องจาก Vue Router ไม่สังเกตเห็นการเปลี่ยนแปลงใด ๆ หากมีการแก้ไขส่วนประกอบเดียวกัน เมื่อใช้คีย์การเปลี่ยนแปลงเส้นทางใด ๆ จะทริกเกอร์การโหลดองค์ประกอบซ้ำด้วยข้อมูลใหม่


1
vuejs.org/v2/api/#keyในเอกสารอย่างเป็นทางการจะอธิบายกลไกของแอตทริบิวต์พิเศษที่สำคัญโดยอ้อมใน vue
Ian Pinto

1
สิ่งนี้จะไม่ได้ผลเนื่องจากในสถานการณ์จำลอง OP กำลังพูดถึงเส้นทางแบบเต็มจะไม่เปลี่ยนแปลง
Nick Coad

27
this.$router.go(this.$router.currentRoute)

เอกสาร Vue-Router:

ฉันตรวจสอบ vue-router repo บน GitHub และดูเหมือนว่าจะไม่มีreload()วิธีการอีกต่อไป แต่ในไฟล์เดียวกันมี: currentRouteobject

ที่มา: vue-router / src / index.js
เอกสาร: docs

get currentRoute (): ?Route {
    return this.history && this.history.current
  }

ตอนนี้คุณสามารถใช้this.$router.go(this.$router.currentRoute)สำหรับรีโหลดเส้นทางปัจจุบัน

ง่ายตัวอย่างเช่น

เวอร์ชันสำหรับคำตอบนี้:

"vue": "^2.1.0",
"vue-router": "^2.1.1"

1
สิ่งนี้จะไม่รีเฟรชข้อมูลใด ๆ ในSafari
jilen

7
มีวิธีโหลดคอมโพเนนต์ซ้ำโดยไม่ต้องรีเฟรชหน้าหรือไม่? เส้นทางควรจะเหมือนกันสมมติว่า "/ users" แต่เมื่อฉันคลิกที่ปุ่มรีเฟรชมันจะต้องรีเฟรชทั้งหน้าโดยไม่ต้องโหลดหน้าซ้ำ
Rajeshwar

6

ใช้router.go(0)ถ้าคุณใช้ typescript และจะถามอาร์กิวเมนต์สำหรับวิธี go


4

router.js

routes: [
{
  path: '/',
  component: test,
  meta: {
    reload: true,
  },
}]

main.js

import router from './router';

new Vue({
  render: h => h(App),
  router,
  watch:{
    '$route' (to) {
       if(to.currentRoute.meta.reload==true){window.location.reload()}
   }
 }).$mount('#app')

2

เป็นการโหลดซ้ำของฉัน เนื่องจากเบราว์เซอร์บางตัวแปลกมาก location.reloadไม่สามารถโหลดซ้ำได้

methods:{
   reload: function(){
      this.isRouterAlive = false
      setTimeout(()=>{
         this.isRouterAlive = true
      },0)
   }
}
<router-view v-if="isRouterAlive"/>

1

แก้ไขเส้นทางไปยัง URL และไปที่หน้าต่างด้วย Javascript

        let r = this.$router.resolve({
        name: this.$route.name, // put your route information in
        params: this.$route.params, // put your route information in
        query: this.$route.query // put your route information in
      });
      window.location.assign(r.href)

วิธีนี้จะแทนที่ URL และทำให้เพจทำการร้องขอแบบเต็ม (รีเฟรช) แทนที่จะใช้ Vue.router $ router.go ใช้งานไม่ได้เหมือนกันสำหรับฉันแม้ว่าในทางทฤษฎีควรจะเป็น


1
`<router-link :to='`/products`' @click.native="$router.go()" class="sub-link"></router-link>`

ฉันได้ลองโหลดหน้าปัจจุบันซ้ำแล้ว



-1
function removeHash () { 
    history.pushState("", document.title, window.location.pathname
                                          + window.location.search);
}


App.$router.replace({name:"my-route", hash: '#update'})
App.$router.replace({name:"my-route", hash: ' ', params: {a: 100} })
setTimeout(removeHash, 0)

หมายเหตุ:

  1. และ#ต้องมีค่าหลังจากนั้น
  2. แฮชเส้นทางที่สองคือช่องว่างไม่ใช่สตริงว่าง
  3. setTimeoutไม่ใช่$nextTickเพื่อรักษาความสะอาด url

-2

สำหรับการแสดงผลคุณสามารถใช้ในองค์ประกอบหลัก

<template>
  <div v-if="renderComponent">content</div>
</template>
<script>
export default {
   data() {
      return {
        renderComponent: true,
      };
    },
    methods: {
      forceRerender() {
        // Remove my-component from the DOM
        this.renderComponent = false;

        this.$nextTick(() => {
          // Add the component back in
          this.renderComponent = true;
        });
      }
    }
}
</script>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.