router: Don't call middleware and asyncData on query changes

This commit is contained in:
Sébastien Chopin 2017-11-01 16:44:57 +01:00
parent 2c8023bde9
commit 6e44afedb8

View File

@ -97,13 +97,11 @@ function mapTransitions(Components, to, from) {
} }
async function loadAsyncComponents (to, from, next) { async function loadAsyncComponents (to, from, next) {
// Check if route hash changed (this._hashChanged) // Check if route path changed (this._pathChanged)
const fromPath = from.fullPath.split('#')[0] this._pathChanged = from.path !== to.path
const toPath = to.fullPath.split('#')[0]
this._hashChanged = fromPath === toPath
<% if (loading) { %> <% if (loading) { %>
if (!this._hashChanged && this.$loading.start) { if (this._pathChanged && this.$loading.start) {
this.$loading.start() this.$loading.start()
} }
<% } %> <% } %>
@ -173,7 +171,7 @@ function callMiddleware (Components, context, layout) {
} }
async function render (to, from, next) { async function render (to, from, next) {
if (this._hashChanged) return next() if (this._pathChanged === false) return next()
// nextCalled is true when redirected // nextCalled is true when redirected
let nextCalled = false let nextCalled = false
@ -258,7 +256,7 @@ async function render (to, from, next) {
await Promise.all(Components.map((Component, i) => { await Promise.all(Components.map((Component, i) => {
// Check if only children route changed // Check if only children route changed
Component._path = compile(to.matched[i].path)(to.params) Component._path = compile(to.matched[i].path)(to.params)
if (!this._hadError && this._isMounted && Component._path === _lastPaths[i] && (i + 1) !== Components.length) { if (!this._hadError && this._isMounted && Component._path === _lastPaths[i]) {
return Promise.resolve() return Promise.resolve()
} }
@ -347,7 +345,7 @@ function showNextPage(to) {
// When navigating on a different route but the same component is used, Vue.js // When navigating on a different route but the same component is used, Vue.js
// Will not update the instance data, so we have to update $data ourselves // Will not update the instance data, so we have to update $data ourselves
function fixPrepatch (to, from) { function fixPrepatch (to, from) {
if (this._hashChanged) return if (this._pathChanged === false) return
Vue.nextTick(() => { Vue.nextTick(() => {
const instances = getChangedComponentsInstances(to, from) const instances = getChangedComponentsInstances(to, from)