क्या हमारे पास v.- राउटर में राऊटर है।


101

मैं इस पुल अनुरोध में देखता हूं :

  • एक जोड़ें router.reload()

    वर्तमान पथ के साथ पुनः लोड करें और डेटा हुक को फिर से कॉल करें

लेकिन जब मैं एक Vue घटक से निम्न आदेश जारी करने का प्रयास करता हूं:

this.$router.reload()

मुझे यह त्रुटि मिली:

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

मैंने डॉक्स में खोज की , लेकिन प्रासंगिक कुछ भी नहीं पाया। क्या vue / vue- राउटर प्रदाता इस तरह से कुछ कार्यक्षमता प्रदान करता है?

सॉफ्टवेयर संस्करणों में मेरी दिलचस्पी है:

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

पुनश्च। मुझे पता location.reload()है कि विकल्पों में से एक है, लेकिन मैं एक देशी Vue विकल्प की तलाश कर रहा हूं।

जवाबों:


145

this.$router.go()ठीक यही करता है; यदि कोई तर्क निर्दिष्ट नहीं किया जाता है, तो राउटर पृष्ठ को ताज़ा करते हुए वर्तमान स्थान पर पहुँच जाता है।

ध्यान दें: राउटर का वर्तमान कार्यान्वयन और इसके इतिहास घटक परम को वैकल्पिक के रूप में चिह्नित नहीं करते हैं, लेकिन IMVHO यह या तो एक बग है या इवान यू के हिस्से पर एक चूक है, क्योंकि कल्पना स्पष्ट रूप से इसकी अनुमति देती हैमैंने इसके बारे में एक समस्या रिपोर्ट दर्ज की है। यदि आप वर्तमान टीएस एनोटेशन से वास्तव में चिंतित हैं, तो बस समकक्ष का उपयोग करेंthis.$router.go(0)

जैसा कि 'ऐसा क्यों है': goआंतरिक रूप से अपने तर्कों को पास करता है window.history.go, इसलिए इसके बराबर windows.history.go()- जो, बदले में, पृष्ठ को पुनः लोड करता है, जैसा कि एमडीएन डॉक्टर के अनुसार ।

नोट: चूंकि यह नियमित डेस्कटॉप (गैर-पोर्टेबल) फ़ायरफ़ॉक्स पर "सॉफ्ट" रीलोड को निष्पादित करता है, यदि आप इसका उपयोग करते हैं तो अजीब विचित्रता का एक गुच्छा दिखाई दे सकता है, लेकिन वास्तव में आपको एक सच्चे लोड की आवश्यकता होती है; इसके बजाय ओपी द्वारा उल्लिखित window.location.reload(true);( https://developer.mozilla.org/en-US/docs/Web/API/Location/reload ) का उपयोग करने से मदद मिल सकती है - यह निश्चित रूप से एफएफ पर मेरी समस्याओं को हल करता है।


4
हां, यह एक पेज रिफ्रेश कर रहा है न कि कंपोनेंट रीलोड।
एस्केपनेटस्केप

<span @click = "() => {यह। $ राऊटर .go ()}" क्लास = "btn btn-lg btn-danger">
Vsevolod Azovsky

9
ध्यान दें कि $router.go()एक पैरामीटर को स्वीकार करता है, इसलिए आपको इसका उपयोग करना चाहिए $router.go(0), जिसका अर्थ है कि इतिहास में शून्य पृष्ठ वापस नेविगेट करें
दान

1
@ डान एफडब्ल्यूआईडब्ल्यू, मैं इस तथ्य को कहूंगा कि दोनों github.com/vuejs/vue-router/blob/dev/src/index.js#L175 और यह कार्यान्वयन है (उदाहरण github.com/uejj/vue-router/blob/ देव / src / इतिहास / html5.js # L40 ) वैकल्पिक के रूप में परम को चिह्नित नहीं करते हैं या तो इवान आप के हिस्से में एक बग या एक चूक है, क्योंकि कल्पना स्पष्ट रूप से इसकी अनुमति देती है (देखें डेवलपर.mozilla.org/en-US/ डॉक्स / वेब / एपीआई / इतिहास / # पैरामीटर्स )। मैंने इसके बारे में बग रिपोर्ट दर्ज की है @ github.com/vuejs/vue-router/issues/3065 , हालांकि।

window.location.reload(forceReload)लगता है पदावनत किया जा सकता है, लेकिन window.location.reload()ठीक है।
हेनन

46

सबसे सरल उपाय यह है:

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

ऐसा इसलिए है क्योंकि Vue Router किसी भी बदलाव को नोटिस नहीं करता है यदि उसी घटक को संबोधित किया जा रहा है। कुंजी के साथ, पथ में कोई भी परिवर्तन नए डेटा के साथ घटक के पुनः लोड को ट्रिगर करेगा।


1
vuejs.org/v2/api/#key आधिकारिक डॉक्स में अप्रत्यक्ष रूप से महत्वपूर्ण विशेष गुण के तंत्र की व्याख्या करता है।
इयान पिंटो

2
यह काम नहीं करेगा, क्योंकि परिदृश्य में ओपी चर्चा कर रहा है कि पूर्ण पथ नहीं बदलेगा।
निक कॉड

मेरे लिए बहुत अच्छा काम किया। इस जवाब को उकेरा।
14:22 बजे ak22

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

Vue-Router डॉक्स:

मैंने गिटहब पर वी-राउटर रेपो की जाँच की और ऐसा लगता है कि कोई reload()विधि नहीं है । लेकिन एक ही फाइल में: currentRouteऑब्जेक्ट है।

स्रोत: vue-router / src / index.js
डॉक्स: डॉक्स

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
क्या पेज को रिफ्रेश किए बिना सिर्फ कंपोनेंट को फिर से लोड करने का एक तरीका है? मार्ग समान होना चाहिए, मान लें कि '/ उपयोगकर्ता' हैं। लेकिन जब मैं रिफ्रेश बटन पर क्लिक करता हूं, तो उसे पृष्ठ को फिर से लोड किए बिना, पूरे पृष्ठ को रीफ्रेश करना पड़ता है।
राजेश्वर

7

का प्रयोग करें router.go(0)अगर आप टाइपप्रति का उपयोग, और यह जाने विधि के लिए बहस पूछ रहा है।


5

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 के लिए मार्ग को हल करें और जावास्क्रिप्ट के साथ विंडो को नेविगेट करें।

        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 पर निर्भर करने के बजाय पूर्ण अनुरोध (रिफ्रेश) करने का कारण बनती है। $ राऊटर.ओगो मेरे लिए उतना ही काम नहीं करता है जबकि यह सैद्धांतिक रूप से माना जाता है।


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यूआरएल को साफ रखने के लिए नहीं ।

-1

रेंडरर के लिए आप मूल घटक में उपयोग कर सकते हैं

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.