vue-roter dispose de 3 modes : 1. Le mode Hash, qui utilise la valeur de hachage de l'URL pour le routage et prend en charge tous les navigateurs ; le routage implémenté dans ce mode ajoute ""#"+nom de la route" après le lien. 2. Le mode Historique, implémenté par l'objet historique fourni par h5, repose sur l'API H5 History et la configuration du serveur. 3. Le mode abstrait prend en charge tous les environnements d'exécution JS, tels que le serveur Node. S'il s'avère qu'il n'y a pas d'API de navigateur, la route sera automatiquement forcée dans ce mode.
L'environnement d'exploitation de ce tutoriel : système windows7, version vue3, ordinateur DELL G3.
Vue-router est un plug-in de routage pour le framework vue.
Selon le site officiel de vue-router, on voit clairement qu'il y a 3 valeurs de modede vue-router
hash
histoire
abstrait
Parmi eux, le hachage et l'historique sont la base de l'application SPA d'une seule page.
Parlons d'abord de la conclusion : le routage des applications spa a 2 modes, hachage et historique, et le routage vue a 3 modes, un plus abstrait que spa.
Modifiez le mode de routage via le paramètre mode dans vue-router :
const router = new VueRouter({ mode: 'history', routes: [...] })
Comment l'implémenter spécifiquement ? Tout d'abord, nous téléchargeons le code source de vue-router et extrayons le traitement du mode
class vueRouter { constructor(options) { let mode = options.mode || 'hash' this.fallback = mode === 'history' && !supportsPushState && options.fallback !== false if (this.fallback) { mode = 'hash' } if (!inBrowser) { mode = 'abstract' } this.mode = mode switch (mode) { case 'history': this.history = new HTML5History(this, options.base) break case 'hash': this.history = new HashHistory(this, options.base, this.fallback) break case 'abstract': this.history = new AbstractHistory(this, options.base) break default: if (process.env.NODE_ENV !== 'production') { assert(false, `invalid mode: ${mode}`) } } } }
Vous pouvez voir que le mode de hachage est utilisé par défaut. Lorsqu'il est défini sur historique, si la méthode d'historique n'est pas prise en charge, l'utilisation du mode de hachage sera également forcée. Lorsqu'il n'est pas dans un environnement de navigateur, tel qu'un nœud, le mode abstrait est directement forcé à utiliser.
Mode hachage
const handleRoutingEvent = () => { const current = this.current if (!ensureSlash()) { return } this.transitionTo(getHash(), route => { if (supportsScroll) { handleScroll(this.router, route, current, true) } if (!supportsPushState) { replaceHash(route.fullPath) } }) } const eventType = supportsPushState ? 'popstate' : 'hashchange' window.addEventListener( eventType, handleRoutingEvent ) this.listeners.push(() => { window.removeEventListener(eventType, handleRoutingEvent) })
Tout d'abord, nous utilisons également window.addEventListener("hashchange", fun) pour surveiller les changements de routage, puis utilisons la méthode transitionTo pour mettre à jour la vue
push (location: RawLocation, onComplete?: Function, onAbort?: Function) { const { current: fromRoute } = this this.transitionTo( location, route => { pushHash(route.fullPath) handleScroll(this.router, route, fromRoute, false) onComplete && onComplete(route) }, onAbort ) } replace (location: RawLocation, onComplete?: Function, onAbort?: Function) { const { current: fromRoute } = this this.transitionTo( location, route => { replaceHash(route.fullPath) handleScroll(this.router, route, fromRoute, false) onComplete && onComplete(route) }, onAbort ) }
Les deux principales API de vue-router, push et replace, traitez également simplement le hachage, puis appelez La méthode transitionTo met à jour le mode view
history mode
window.onpopstate = function(e) { alert(2); } let stateObj = { foo: "bar", }; history.pushState(stateObj, "page 2", "bar.html");
Cela fera apparaître la barre d'adresse du navigateur sous la forme
, mais cela n'entraînera pas le chargement de bar.html par le navigateur ni même la vérification si bar.html existe. Autrement dit, même si l'URL du navigateur change, il ne renverra pas immédiatement la demande au serveur. C'est également la base pour laquelle l'application spa met à jour la vue mais ne demande pas à nouveau la page. Ensuite, nous continuons à examiner le traitement du code source vue-router de /src/history/html5.js :const handleRoutingEvent = () => { const current = this.current // Avoiding first `popstate` event dispatched in some browsers but first // history route not updated since async guard at the same time. const location = getLocation(this.base) if (this.current === START && location === this._startLocation) { return } this.transitionTo(location, route => { if (supportsScroll) { handleScroll(router, route, current, true) } }) } window.addEventListener('popstate', handleRoutingEvent) this.listeners.push(() => { window.removeEventListener('popstate', handleRoutingEvent) })
mozilla.org/bar.html
La logique de traitement est similaire au hachage, utilisez window.addEventListener("popstate", fun) pour surveiller les changements de routage, puis utilisez la méthode transitionTo pour mettre à jour la vue.
Les méthodes telles que push et replace ne seront pas présentées en détail. mode abstrait
constructor (router: Router, base: ?string) { super(router, base) this.stack = [] this.index = -1 }
Définissez d'abord deux variables, une pile pour enregistrer l'enregistrement de l'appel et un index pour enregistrer la position actuelle du pointeur
push (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.transitionTo( location, route => { this.stack = this.stack.slice(0, this.index + 1).concat(route) this.index++ onComplete && onComplete(route) }, onAbort ) } replace (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.transitionTo( location, route => { this.stack = this.stack.slice(0, this.index).concat(route) onComplete && onComplete(route) }, onAbort ) }
Les méthodes push et replac utilisent également les variables stack et index pour simuler les enregistrements d'appels historiques du navigateur.
Résumé
hash s'utilise de la même manière que l'historique. La route dans hash contient #, mais elle est simple à utiliser et ne nécessite pas la coopération du serveur D'un point de vue technique, c'est le mode le plus simple à configurer. que c'est également le paramètre par défaut pour le hachage. La raison du mode
historique nécessite que le serveur coopère pour gérer 404 situations, mais il n'y a pas de # dans la route, ce qui est plus beau que le hachage.
Le mode abstrait prend en charge tous les environnements d'exécution JavaScript, tels que le côté serveur Node.js. S'il s'avère qu'il n'y a pas d'API de navigateur, le routage sera automatiquement forcé dans ce mode.
Le mode abstrait n'utilise pas l'API du navigateur et peut être placé dans un environnement de nœud ou une application de bureau. Il s'agit d'une extension complète et de capacités pour les applications de spa.
【Tutoriels vidéo associés recommandés : Tutoriel vidéo Vue, Démarrer avec le front-end Web】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!