feat(vue-app): function watchQuery (#6297)

This commit is contained in:
Xin Du (Clark) 2019-08-31 19:23:11 +01:00 committed by GitHub
parent ad57c1e527
commit e9c4bcfee2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 8 deletions

View File

@ -356,6 +356,7 @@ async function render(to, from, next) {
return next() return next()
} }
let instances
// Call asyncData & fetch hooks on components matched by the route. // Call asyncData & fetch hooks on components matched by the route.
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
@ -371,6 +372,11 @@ async function render(to, from, next) {
Component._dataRefresh = true Component._dataRefresh = true
} else if (Array.isArray(watchQuery)) { } else if (Array.isArray(watchQuery)) {
Component._dataRefresh = watchQuery.some(key => this._diffQuery[key]) Component._dataRefresh = watchQuery.some(key => this._diffQuery[key])
} else if (typeof watchQuery === 'function') {
if (!instances) {
instances = getMatchedComponentsInstances(to)
}
Component._dataRefresh = watchQuery.apply(instances[i], [to.query, from.query])
} }
} }
if (!this._hadError && this._isMounted && !Component._dataRefresh) { if (!this._hadError && this._isMounted && !Component._dataRefresh) {
@ -491,18 +497,13 @@ function showNextPage(to) {
function fixPrepatch(to, ___) { function fixPrepatch(to, ___) {
if (this._pathChanged === false && this._queryChanged === false) return if (this._pathChanged === false && this._queryChanged === false) return
const matches = [] const instances = getMatchedComponentsInstances(to)
const instances = getMatchedComponentsInstances(to, matches) const Components = getMatchedComponents(to)
const Components = getMatchedComponents(to, matches)
Vue.nextTick(() => { Vue.nextTick(() => {
instances.forEach((instance, i) => { instances.forEach((instance, i) => {
if (!instance || instance._isDestroyed) return if (!instance || instance._isDestroyed) return
// if (
// !this._queryChanged &&
// to.matched[matches[i]].path.indexOf(':') === -1 &&
// to.matched[matches[i]].path.indexOf('*') === -1
// ) return // If not a dynamic route, skip
if ( if (
instance.constructor._dataRefresh && instance.constructor._dataRefresh &&
Components[i] === instance.constructor && Components[i] === instance.constructor &&

View File

@ -180,6 +180,24 @@ describe('basic browser', () => {
page.close() page.close()
}) })
test('/scroll-to-top in the same page with watchQuery function', async () => {
const page = await browser.page(url('/scroll-to-top/watch-query-fn'))
await page.evaluate(() => window.scrollBy(0, window.innerHeight))
await page.nuxt.navigate('/scroll-to-top/watch-query-fn?other=1')
let pageYOffset = await page.evaluate(() => window.pageYOffset)
expect(pageYOffset).toBeGreaterThan(0)
await page.nuxt.go(-1)
pageYOffset = await page.evaluate(() => window.pageYOffset)
expect(pageYOffset).toBeGreaterThan(0)
await page.nuxt.navigate('/scroll-to-top/watch-query-fn?test=1')
pageYOffset = await page.evaluate(() => window.pageYOffset)
expect(pageYOffset).toBe(0)
await page.nuxt.go(-1)
pageYOffset = await page.evaluate(() => window.pageYOffset)
expect(pageYOffset).toBe(0)
page.close()
})
test('/validate should display a 404', async () => { test('/validate should display a 404', async () => {
await page.nuxt.navigate('/validate') await page.nuxt.navigate('/validate')

View File

@ -0,0 +1,24 @@
<template>
<div>
<NuxtLink to="/scroll-to-top/watch-query-fn?test=1">
go to the same page with other test
</NuxtLink>
<NuxtLink to="/scroll-to-top/watch-query-fn?other=1">
go to the same page with param other
</NuxtLink>
</div>
</template>
<script>
export default {
watchQuery (newQuery, oldQuery) {
return newQuery.test
}
}
</script>
<style>
div {
margin-top: 1500px;
}
</style>