feat: function watchQuery (#6245)

This commit is contained in:
Xin Du (Clark) 2019-08-25 10:12:59 +01:00 committed by GitHub
parent 7f542e08e5
commit 3c61830a0d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 8 deletions

View File

@ -279,6 +279,7 @@ async function render(to, from, next) {
// Get route's matched components
const matches = []
const Components = getMatchedComponents(to, matches)
const instances = getMatchedComponentsInstances(to)
// If no Components matched, generate 404
if (!Components.length) {
@ -371,6 +372,8 @@ async function render(to, from, next) {
Component._dataRefresh = true
} else if (Array.isArray(watchQuery)) {
Component._dataRefresh = watchQuery.some(key => this._diffQuery[key])
} else if (typeof watchQuery === 'function') {
Component._dataRefresh = watchQuery.apply(instances[i], [to.query, from.query])
}
}
if (!this._hadError && this._isMounted && !Component._dataRefresh) {
@ -491,18 +494,13 @@ function showNextPage(to) {
function fixPrepatch(to, ___) {
if (this._pathChanged === false && this._queryChanged === false) return
const matches = []
const instances = getMatchedComponentsInstances(to, matches)
const Components = getMatchedComponents(to, matches)
const instances = getMatchedComponentsInstances(to)
const Components = getMatchedComponents(to)
Vue.nextTick(() => {
instances.forEach((instance, i) => {
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 (
instance.constructor._dataRefresh &&
Components[i] === instance.constructor &&

View File

@ -180,6 +180,24 @@ describe('basic browser', () => {
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 () => {
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>