chore: Update main.css and main.ts, add data-loaders.[id].vue and update index-page.vue
All checks were successful
CI / cache-and-install (push) Successful in 1m9s
All checks were successful
CI / cache-and-install (push) Successful in 1m9s
This commit is contained in:
@ -7,6 +7,7 @@
|
|||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
a,
|
a,
|
||||||
.green {
|
.green {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@ -16,6 +17,7 @@ a,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media (hover: hover) {
|
@media (hover: hover) {
|
||||||
|
button:hover,
|
||||||
a:hover {
|
a:hover {
|
||||||
background-color: hsla(160, 100%, 37%, 0.2);
|
background-color: hsla(160, 100%, 37%, 0.2);
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,12 @@ import { createPinia } from 'pinia';
|
|||||||
|
|
||||||
import App from './App.vue';
|
import App from './App.vue';
|
||||||
import { router } from './router';
|
import { router } from './router';
|
||||||
|
import { DataLoaderPlugin } from 'unplugin-vue-router/data-loaders';
|
||||||
|
|
||||||
createApp(App).use(createPinia()).use(router).mount('#app');
|
createApp(App)
|
||||||
|
.use(createPinia())
|
||||||
|
// Register the plugin before the router
|
||||||
|
.use(DataLoaderPlugin, { router })
|
||||||
|
// adding the router will trigger the initial navigation
|
||||||
|
.use(router)
|
||||||
|
.mount('#app');
|
||||||
|
69
src/pages/data-loaders.[id].vue
Normal file
69
src/pages/data-loaders.[id].vue
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
// https://uvr.esm.is/data-loaders/rfc.html
|
||||||
|
|
||||||
|
import { defineBasicLoader } from 'unplugin-vue-router/data-loaders/basic';
|
||||||
|
|
||||||
|
export const usePageData = defineBasicLoader(
|
||||||
|
'DataLoadersId',
|
||||||
|
async (...args) => {
|
||||||
|
console.log('[DefineLoaderFn]', 'args :>> ', args);
|
||||||
|
const [route] = args;
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||||
|
return { idFromPreviousPage: route.params.id, someOtherData: 'someOtherData' };
|
||||||
|
},
|
||||||
|
{
|
||||||
|
lazy: false,
|
||||||
|
// - `immediate`: the data is committed as soon as it is loaded.
|
||||||
|
// - `after-load`: the data is committed after all non-lazy loaders have finished loading.
|
||||||
|
// - `immediate`:数据在加载后立即提交。
|
||||||
|
// - `after-load`:数据在所有非惰性加载器加载完成后提交。
|
||||||
|
commit: 'immediate',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
definePage({
|
||||||
|
meta: {
|
||||||
|
metaKey: 'metaValue',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const {
|
||||||
|
data: pageData, // the data returned by the loader
|
||||||
|
isLoading, // a boolean indicating if the loader is fetching data
|
||||||
|
error, // an error object if the loader failed
|
||||||
|
reload, // a function to refetch the data without navigating
|
||||||
|
} = usePageData();
|
||||||
|
|
||||||
|
watch(
|
||||||
|
pageData,
|
||||||
|
(pageDataVal) => {
|
||||||
|
let message = [`[watch]`, `pageDataVal :>> `, pageDataVal];
|
||||||
|
if (pageDataVal === undefined) {
|
||||||
|
// hot updated 会造成 pageDataVal 为 undefined
|
||||||
|
console.warn(message);
|
||||||
|
} else {
|
||||||
|
console.debug(message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<h1>Data Loaders</h1>
|
||||||
|
<div flex="~ row">
|
||||||
|
<button @click="$router.back()">Back</button>
|
||||||
|
<button @click="reload()">Reload</button>
|
||||||
|
</div>
|
||||||
|
<main>
|
||||||
|
<p v-if="isLoading">Loading...</p>
|
||||||
|
<template v-else-if="error">
|
||||||
|
<p>{{ error.message }}</p>
|
||||||
|
<button @click="reload()">Retry</button>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<p>{{ pageData }}</p>
|
||||||
|
</template>
|
||||||
|
</main>
|
||||||
|
</template>
|
@ -1,6 +1,4 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { router } from '@/router';
|
|
||||||
|
|
||||||
definePage({
|
definePage({
|
||||||
alias: '/',
|
alias: '/',
|
||||||
});
|
});
|
||||||
@ -8,4 +6,5 @@ definePage({
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<h1>Index Page</h1>
|
<h1>Index Page</h1>
|
||||||
|
<router-link :to="{ name: 'DataLoadersId', params: { id: 520 } }">Data Loaders</router-link>
|
||||||
</template>
|
</template>
|
||||||
|
1
typed-router.d.ts
vendored
1
typed-router.d.ts
vendored
@ -18,6 +18,7 @@ declare module 'vue-router/auto-routes' {
|
|||||||
* Route name map generated by unplugin-vue-router
|
* Route name map generated by unplugin-vue-router
|
||||||
*/
|
*/
|
||||||
export interface RouteNamedMap {
|
export interface RouteNamedMap {
|
||||||
|
'DataLoadersId': RouteRecordInfo<'DataLoadersId', '/data-loaders/:id', { id: ParamValue<true> }, { id: ParamValue<false> }>,
|
||||||
'IndexPage': RouteRecordInfo<'IndexPage', '/index-page', Record<never, never>, Record<never, never>>,
|
'IndexPage': RouteRecordInfo<'IndexPage', '/index-page', Record<never, never>, Record<never, never>>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user