feat: 添加暗色模式支持,重构用户数据加载逻辑
This commit is contained in:
@ -23,6 +23,11 @@
|
|||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
body {
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
}
|
||||||
#app {
|
#app {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { defineBasicLoader } from 'unplugin-vue-router/data-loaders/basic';
|
||||||
import { defineColadaLoader } from 'unplugin-vue-router/data-loaders/pinia-colada';
|
import { defineColadaLoader } from 'unplugin-vue-router/data-loaders/pinia-colada';
|
||||||
|
|
||||||
async function getUserById(id: string, { signal }: { signal?: AbortSignal }) {
|
async function getUserById(userId: string, { signal }: { signal?: AbortSignal }) {
|
||||||
console.warn('[getUserById] 被调用, id :>> ', id);
|
console.warn('[getUserById] 被调用, userId :>> ', userId);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
console.log('5s 已过', 'id :>> ', id);
|
console.log('5s 已过', 'userId :>> ', userId);
|
||||||
}, 5000);
|
}, 5000);
|
||||||
const res = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`, { signal });
|
const res = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`, { signal });
|
||||||
await new Promise((resolve) => setTimeout(resolve, 300));
|
await new Promise((resolve) => setTimeout(resolve, 300));
|
||||||
return await res.json();
|
return await res.json();
|
||||||
}
|
}
|
||||||
@ -21,6 +22,12 @@ export const useUserData = defineColadaLoader('DataLoadersIdSub1UserId', {
|
|||||||
// 保持数据“新鲜”10秒,以避免过于频繁地获取相同的数据
|
// 保持数据“新鲜”10秒,以避免过于频繁地获取相同的数据
|
||||||
staleTime: 5000,
|
staleTime: 5000,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const usePageData = defineBasicLoader('DataLoadersIdSub1UserId', async (route) => {
|
||||||
|
console.warn('[defineBasicLoader] 被调用, userId :>> ', route.params.userId);
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 777));
|
||||||
|
return { idFromPreviousPage: route.params.id, someOtherData: 'someOtherData' };
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@ -36,7 +43,7 @@ const route = useRoute('DataLoadersIdSub1UserId');
|
|||||||
<h1>Pinia Colada Loader Example</h1>
|
<h1>Pinia Colada Loader Example</h1>
|
||||||
<pre>route.params: {{ route.params }}</pre>
|
<pre>route.params: {{ route.params }}</pre>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset class="flex items-center gap-4">
|
||||||
<legend>Controls</legend>
|
<legend>Controls</legend>
|
||||||
|
|
||||||
<button @click="refresh()">Refresh</button>
|
<button @click="refresh()">Refresh</button>
|
||||||
@ -65,77 +72,112 @@ const route = useRoute('DataLoadersIdSub1UserId');
|
|||||||
<pre v-else>{{ user == null ? String(user) : user }}</pre>
|
<pre v-else>{{ user == null ? String(user) : user }}</pre>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped lang="less">
|
||||||
.green {
|
button {
|
||||||
background-color: #42b883;
|
padding: 0.5rem 1rem;
|
||||||
color: #ffffff;
|
|
||||||
border: none;
|
|
||||||
padding: 8px 16px;
|
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
background: #f5f5f5;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
margin-bottom: 16px;
|
transition: all 0.2s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #e5e5e5;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.green {
|
||||||
|
background: #4caf50;
|
||||||
|
color: white;
|
||||||
|
border-color: #45a049;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #45a049;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
background: #2a2a2a;
|
||||||
|
border-color: #444;
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.green {
|
||||||
|
background: #2e7d32;
|
||||||
|
border-color: #1b5e20;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #1b5e20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldset {
|
fieldset {
|
||||||
border: 1px solid #4a4a4a;
|
border: 1px solid #ddd;
|
||||||
padding: 16px;
|
border-radius: 6px;
|
||||||
margin: 16px 0;
|
padding: 1rem;
|
||||||
border-radius: 8px;
|
margin: 1rem 0;
|
||||||
background-color: #2a2a2a;
|
|
||||||
}
|
|
||||||
|
|
||||||
legend {
|
legend {
|
||||||
padding: 0 8px;
|
padding: 0 0.5rem;
|
||||||
color: #b3b3b3;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
@media (prefers-color-scheme: dark) {
|
||||||
margin-right: 8px;
|
border-color: #444;
|
||||||
padding: 6px 12px;
|
background: #1a1a1a;
|
||||||
border: 1px solid #4a4a4a;
|
}
|
||||||
border-radius: 4px;
|
|
||||||
cursor: pointer;
|
|
||||||
background-color: #333333;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
button:hover {
|
|
||||||
background-color: #444444;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
background-color: #1e1e1e;
|
background: #f8f8f8;
|
||||||
padding: 16px;
|
padding: 1rem;
|
||||||
border-radius: 6px;
|
border-radius: 4px;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
background: #1a1a1a;
|
||||||
color: #e0e0e0;
|
color: #e0e0e0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex.items-center {
|
||||||
|
a {
|
||||||
|
color: #2196f3;
|
||||||
|
text-decoration: none;
|
||||||
|
padding: 0.5rem;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
color: #64b5f6;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #90caf9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
background-color: #2a2a2a;
|
background: #f1f1f1;
|
||||||
padding: 2px 6px;
|
padding: 0.2rem 0.4rem;
|
||||||
border-radius: 4px;
|
border-radius: 3px;
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
background: #2a2a2a;
|
||||||
color: #e0e0e0;
|
color: #e0e0e0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
@media (prefers-color-scheme: dark) {
|
||||||
color: #42b883;
|
:deep(body) {
|
||||||
text-decoration: none;
|
background: #121212;
|
||||||
padding: 4px 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
color: #5ccfaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
color: #e0e0e0;
|
color: #e0e0e0;
|
||||||
margin-bottom: 20px;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
color: #42b883;
|
|
||||||
margin-top: 24px;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
|
import { PiniaColada } from '@pinia/colada';
|
||||||
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
|
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
|
||||||
|
|
||||||
export function setupPinia(app: import('vue').App) {
|
export function setupPinia(app: import('vue').App) {
|
||||||
app.use(createPinia().use(piniaPluginPersistedstate));
|
app.use(createPinia().use(piniaPluginPersistedstate));
|
||||||
|
app.use(PiniaColada, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
export * from './counter';
|
export * from './counter';
|
||||||
|
Reference in New Issue
Block a user