diff options
| author | Henry Jameson <me@hjkos.com> | 2022-03-28 23:55:26 +0300 |
|---|---|---|
| committer | Henry Jameson <me@hjkos.com> | 2022-03-28 23:55:57 +0300 |
| commit | f21dc21a83cbcf4c502b8fbf56cabac797a0b9da (patch) | |
| tree | d562e08e92fe15f095a0f05da8b419b546057a47 /src | |
| parent | 9afbb12f956434f0426a00d311406ddd8348c892 (diff) | |
properly implement resettableAsyncComponent
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/async_component_error/async_component_error.vue | 1 | ||||
| -rw-r--r-- | src/components/settings_modal/settings_modal.js | 4 | ||||
| -rw-r--r-- | src/services/resettable_async_component.js | 23 |
3 files changed, 13 insertions, 15 deletions
diff --git a/src/components/async_component_error/async_component_error.vue b/src/components/async_component_error/async_component_error.vue index b1b59638..26ab5d21 100644 --- a/src/components/async_component_error/async_component_error.vue +++ b/src/components/async_component_error/async_component_error.vue @@ -19,6 +19,7 @@ <script> export default { + emits: ['resetAsyncComponent'], methods: { retry () { this.$emit('resetAsyncComponent') diff --git a/src/components/settings_modal/settings_modal.js b/src/components/settings_modal/settings_modal.js index 82ea410e..0a72dca1 100644 --- a/src/components/settings_modal/settings_modal.js +++ b/src/components/settings_modal/settings_modal.js @@ -56,8 +56,8 @@ const SettingsModal = { SettingsModalContent: getResettableAsyncComponent( () => import('./settings_modal_content.vue'), { - loading: PanelLoading, - error: AsyncComponentError, + loadingComponent: PanelLoading, + errorComponent: AsyncComponentError, delay: 0 } ) diff --git a/src/services/resettable_async_component.js b/src/services/resettable_async_component.js index e85c540b..1c046ce7 100644 --- a/src/services/resettable_async_component.js +++ b/src/services/resettable_async_component.js @@ -1,5 +1,4 @@ -// TODO investigate if even necessary since VUE3 -import { reactive } from 'vue' +import { defineAsyncComponent, shallowReactive, h } from 'vue' /* By default async components don't have any way to recover, if component is * failed, it is failed forever. This helper tries to remedy that by recreating @@ -9,23 +8,21 @@ import { reactive } from 'vue' * actual target component itself if needs to be. */ function getResettableAsyncComponent (asyncComponent, options) { - const asyncComponentFactory = () => () => ({ - component: asyncComponent(), + const asyncComponentFactory = () => () => defineAsyncComponent({ + loader: asyncComponent, ...options }) - const observe = reactive({ c: asyncComponentFactory() }) + const observe = shallowReactive({ c: asyncComponentFactory() }) return { - functional: true, - render (createElement, { data, children }) { + render () { // emit event resetAsyncComponent to reloading - data.on = {} - data.on.resetAsyncComponent = () => { - observe.c = asyncComponentFactory() - // parent.$forceUpdate() - } - return createElement(observe.c, data, children) + return h(observe.c(), { + onResetAsyncComponent () { + observe.c = asyncComponentFactory() + } + }) } } } |
