From e794c1edde6d77cf089ac3a986cd23a0434cfc49 Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Mon, 12 Jun 2023 12:26:48 +0200 Subject: [PATCH] feat: keepPreviousResult --- packages/docs/src/api/use-query.md | 2 + .../src/components/ChannelView.vue | 1 - .../src/components/KeepPreviousResult.vue | 115 ++++++++++++++++++ .../test-e2e-composable-vue3/src/router.ts | 4 + .../tests/e2e/specs/keepPreviousResult.cy.js | 33 +++++ .../vue-apollo-composable/src/useQuery.ts | 3 +- 6 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 packages/test-e2e-composable-vue3/src/components/KeepPreviousResult.vue create mode 100644 packages/test-e2e-composable-vue3/tests/e2e/specs/keepPreviousResult.cy.js diff --git a/packages/docs/src/api/use-query.md b/packages/docs/src/api/use-query.md index 7602746..b088a6a 100644 --- a/packages/docs/src/api/use-query.md +++ b/packages/docs/src/api/use-query.md @@ -42,6 +42,8 @@ - `throttle`: Throttle interval in ms. + - `keepPreviousResult`: (default: `false`) Whether or not to keep previous result when the query is fetch again (for example when a variable changes). This can be useful to prevent a flash of empty content. + ## Return - `result`: result data object. diff --git a/packages/test-e2e-composable-vue3/src/components/ChannelView.vue b/packages/test-e2e-composable-vue3/src/components/ChannelView.vue index afbf437..b79e2a6 100644 --- a/packages/test-e2e-composable-vue3/src/components/ChannelView.vue +++ b/packages/test-e2e-composable-vue3/src/components/ChannelView.vue @@ -34,7 +34,6 @@ export default defineComponent({ id: props.id, }), { notifyOnNetworkStatusChange: true, - keepPreviousResult: true, }) const channel = computed(() => result.value?.channel) diff --git a/packages/test-e2e-composable-vue3/src/components/KeepPreviousResult.vue b/packages/test-e2e-composable-vue3/src/components/KeepPreviousResult.vue new file mode 100644 index 0000000..1b7a6a5 --- /dev/null +++ b/packages/test-e2e-composable-vue3/src/components/KeepPreviousResult.vue @@ -0,0 +1,115 @@ + + + diff --git a/packages/test-e2e-composable-vue3/src/router.ts b/packages/test-e2e-composable-vue3/src/router.ts index ef19cb0..9bf3f14 100644 --- a/packages/test-e2e-composable-vue3/src/router.ts +++ b/packages/test-e2e-composable-vue3/src/router.ts @@ -42,5 +42,9 @@ export const router = createRouter({ path: '/on-result', component: () => import('./components/OnResult.vue'), }, + { + path: '/keep-previous-result', + component: () => import('./components/KeepPreviousResult.vue'), + }, ], }) diff --git a/packages/test-e2e-composable-vue3/tests/e2e/specs/keepPreviousResult.cy.js b/packages/test-e2e-composable-vue3/tests/e2e/specs/keepPreviousResult.cy.js new file mode 100644 index 0000000..080651e --- /dev/null +++ b/packages/test-e2e-composable-vue3/tests/e2e/specs/keepPreviousResult.cy.js @@ -0,0 +1,33 @@ +/// + +describe('keepPreviousResult', () => { + beforeEach(() => { + cy.task('db:reset') + cy.visit('/keep-previous-result') + }) + + it('keepPreviousResult disabled: should clear previous data', () => { + cy.get('.no-data').should('be.visible') + cy.get('.channel-btn').eq(0).click() + cy.get('.no-data').should('be.visible') + cy.get('.the-channel').should('contain.text', '# General') + cy.get('.no-data').should('not.exist') + cy.get('.channel-btn').eq(1).click() + cy.get('.no-data').should('be.visible') + cy.get('.the-channel').should('contain.text', '# Random') + cy.get('.no-data').should('not.exist') + }) + + it('keepPreviousResult enabled: should display previous channel', () => { + cy.get('label').contains('keepPreviousResult').get('input[type="checkbox"]').check() + cy.get('.no-data').should('be.visible') + cy.get('.channel-btn').eq(0).click() + cy.get('.no-data').should('be.visible') + cy.get('.the-channel').should('contain.text', '# General') + cy.get('.no-data').should('not.exist') + cy.get('.channel-btn').eq(1).click() + cy.get('.no-data').should('not.exist') + cy.get('.the-channel').should('contain.text', '# General') + cy.get('.the-channel').should('contain.text', '# Random') + }) +}) diff --git a/packages/vue-apollo-composable/src/useQuery.ts b/packages/vue-apollo-composable/src/useQuery.ts index 850cc44..d472cc0 100644 --- a/packages/vue-apollo-composable/src/useQuery.ts +++ b/packages/vue-apollo-composable/src/useQuery.ts @@ -44,6 +44,7 @@ export interface UseQueryOptions< throttle?: number debounce?: number prefetch?: boolean + keepPreviousResult?: boolean } interface SubscribeToMoreItem { @@ -256,7 +257,7 @@ export function useQueryImpl< // Make the cache data available to the component immediately // This prevents SSR hydration mismatches - if (!isServer && (currentOptions.value?.fetchPolicy !== 'no-cache' || currentOptions.value.notifyOnNetworkStatusChange)) { + if (!isServer && !currentOptions.value?.keepPreviousResult && (currentOptions.value?.fetchPolicy !== 'no-cache' || currentOptions.value.notifyOnNetworkStatusChange)) { const currentResult = query.value.getCurrentResult(false) if (!currentResult.loading || currentResult.partial || currentOptions.value?.notifyOnNetworkStatusChange) {