data-loader-vue3
10
总安装量
8
周安装量
#29418
全站排名
安装命令
npx skills add https://github.com/lchrennew/data-loader-vue3 --skill data-loader-vue3
Agent 安装分布
trae
7
gemini-cli
2
amp
1
qoder
1
opencode
1
kimi-cli
1
Skill 文档
DataLoader Vue3 Component Guide
æ¤æè½æä¾å
³äº DataLoader.vue ç»ä»¶ç详ç»ä½¿ç¨æåã该ç»ä»¶ç¨äºç®å Vue 3 ä¸ç弿¥æ°æ®å è½½åºæ¯ã
æ ¸å¿åè½
- èªå¨æ°æ®å è½½ï¼ç»ä»¶æè½½æ
hashååæ¶èªå¨è§¦åloadDataã - é误å¤çï¼èªå¨æè·å¼å¸¸å¹¶æ¾ç¤ºé误信æ¯ã
- æ°æ®è¿æ»¤ï¼æ¯æ
filter彿°å¤çæ°æ®ã - ç¶æç®¡çï¼ç®¡ç loading å data ç¶æã
使ç¨åºæ¯
1. æ°åè½å¼å (/use loader)
å½ç¨æ·è¾å
¥ /use loader æè¯¢é®å¦ä½ä½¿ç¨æ¶ï¼åèæ¤é¨åã
å¼å ¥ç»ä»¶
import DataLoader from 'data-loader-vue3';
åºæ¬ä½¿ç¨
<template>
<DataLoader
:hash="queryParams"
:load-data="fetchData"
:load-data-args="queryParams"
:filter="dataFilter"
#="{ filteredData, reload, data }"
>
<div v-if="!filteredData">Loading...</div>
<div v-else>
<!-- ä½¿ç¨æ°æ® -->
<div v-for="item in filteredData" :key="item.id">
{{ item.name }}
</div>
<button @click="reload(false)">éæ°å è½½</button>
</div>
</DataLoader>
</template>
<script setup>
import { ref } from 'vue';
import DataLoader from 'data-loader-vue3';
const queryParams = ref({ page: 1 });
const fetchData = async (args) => {
// 模æ API è°ç¨
return await api.getData(args);
};
const dataFilter = (data) => {
// å¯éï¼è¿æ»¤æ°æ®
return data.list;
};
</script>
2. 代ç éæ (/migrate loader)
å½ç¨æ·è¾å
¥ /migrate loader æè¯¢é®å¦ä½ä¼åæ§ä»£ç æ¶ï¼åèæ¤é¨åãå½éå°ä½¿ç¨ watchãonMounted ææå¨ç®¡ç loading ç¶æçä¼ ç»ä»£ç æ¶ï¼åºæ¨èéæä¸º DataLoaderã
éæå (Traditional)
<script setup>
import { ref, watch, onMounted } from 'vue';
const data = ref([]);
const loading = ref(false);
const error = ref(null);
const params = ref({ id: 1 });
const fetchData = async () => {
loading.value = true;
error.value = null;
try {
data.value = await api.get(params.value);
} catch (e) {
error.value = e;
} finally {
loading.value = false;
}
};
onMounted(fetchData);
watch(params, fetchData, { deep: true });
</script>
<template>
<div v-if="loading">Loading...</div>
<div v-else-if="error">{{ error.message }}</div>
<ul v-else>
<li v-for="item in data" :key="item.id">{{ item.name }}</li>
</ul>
</template>
éæå (With DataLoader)
- ç§»é¤ï¼
loadingãerrorç¶æåéï¼onMountedï¼watchã - ä¿çï¼æ°æ®è·åé»è¾ (
fetchData) ååæ° (params)ã - æ°å¢ï¼
DataLoaderç»ä»¶å 裹ã
<script setup>
import { ref } from 'vue';
import DataLoader from 'data-loader-vue3';
const params = ref({ id: 1 });
// ä»
éå
³æ³¨æ°æ®è·åï¼æ é管ç loading/error
const fetchData = async (args) => await api.get(args);
</script>
<template>
<!-- hash ååèªå¨è§¦åéæ°å è½½ -->
<DataLoader :hash="params" :load-data="fetchData" :load-data-args="params" #="{ data }">
<ul>
<li v-for="item in data" :key="item.id">{{ item.name }}</li>
</ul>
</DataLoader>
</template>
éææ¶ç
- 代ç éåå°ï¼ç§»é¤äºæå¨ç¶æç®¡çåçå½å¨æé©åã
- é»è¾è§£è¦ï¼UI ç¶æï¼å è½½ä¸/é误ï¼ç±ç»ä»¶ç»ä¸å¤çï¼ä¸å¡é»è¾åªå ³æ³¨æ°æ®è·åã
- ç«æå¤çï¼
DataLoaderå é¨éè¿ hash æ ¡éªèªå¨å¤çäºè¯·æ±ç«æé®é¢ã
API åè
Props
| 屿§å | ç±»å | å¿ å¡« | é»è®¤å¼ | 说æ |
|---|---|---|---|---|
hash |
Any | æ¯ | – | æ°æ®çæ¬æ è¯ï¼ååæ¶è§¦åéè½½ |
loadData |
Function | æ¯ | – | 弿¥å è½½å½æ°ï¼éè¿å Promise |
loadDataArgs |
Any | å¦ | undefined |
ä¼ ç» loadData çåæ° |
filter |
Function | å¦ | undefined |
æ°æ®è¿æ»¤å¨å½æ° |
reloaderName |
String | å¦ | 'reload' |
æ³¨å ¥ï¼Provideï¼ç»åç»ä»¶çéè½½å½æ°åç§° |
Events
loaded(data, hash, filteredData): æ°æ®å è½½æåæ¶è§¦å
Dependency Injection
ç»ä»¶éè¿ provide å䏿ä¾éè½½å½æ°ï¼åç»ä»¶å¯ä»¥éè¿ inject(reloaderName) è·åã
- Default Key:
'reload' - Value:
(loaded: any) => void(å slot ä¸ç reload 彿°)
Slots (Default)
é»è®¤ææ§½æä¾ä»¥ä¸å±æ§ï¼Scoped Propsï¼ï¼
data: åå§æ°æ®filtered-data: ç»è¿filterå¤çåçæ°æ®ï¼å¦ææ²¡æ filter åçäº dataï¼loaded: å½åæ°æ®æ¯å¦å¹é hash (Boolean)reload($loaded: any): éæ°å è½½/è®¾ç½®ç¶æå½æ°ãè°ç¨reload(false)å¯å¼ºå¶å·æ°ã
注æäºé¡¹
- é误å¤ç:
loadDataä¸ç任使åºå¼å¸¸é½ä¼è¢«æè·å¹¶æ¾ç¤ºä¸ºé误æç¤ºã - ååºå¼: ä¿®æ¹
hash屿§ä¼èªå¨è§¦åéæ°å è½½ï¼æ éæå¨è°ç¨reloadã