mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-23 14:15:13 +00:00
feat(vue-app): function watchQuery (#6297)
This commit is contained in:
parent
ad57c1e527
commit
e9c4bcfee2
@ -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 &&
|
||||||
|
@ -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')
|
||||||
|
|
||||||
|
24
test/fixtures/basic/pages/scroll-to-top/watch-query-fn.vue
vendored
Normal file
24
test/fixtures/basic/pages/scroll-to-top/watch-query-fn.vue
vendored
Normal 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>
|
Loading…
Reference in New Issue
Block a user