vue-composable-creator
3
总安装量
3
周安装量
#59453
全站排名
安装命令
npx skills add https://github.com/wot-ui/wot-starter --skill vue-composable-creator
Agent 安装分布
openclaw
3
claude-code
3
github-copilot
3
codex
3
kimi-cli
3
gemini-cli
3
Skill 文档
Vue Composable å建å¨
å¿«éå建符å wot-starter 项ç®è§èç Vue 3 ç»åå¼å½æ°ã
ç®å½ç»æ
src/composables/
âââ types/ # ç±»åå®ä¹ç®å½
â âââ theme.ts
âââ useGlobalToast.ts # å
¨å± Toast
âââ useGlobalMessage.ts # å
¨å± Message
âââ useGlobalLoading.ts # å
¨å± Loading
âââ useTheme.ts # 主é¢ç®¡ç
âââ useManualTheme.ts # æå¨ä¸»é¢ç®¡ç
âââ useTabbar.ts # TabBar æ§å¶
âââ use{Name}.ts # æ°å»ºç composable
Composable 模æ¿
åºç¡æ¨¡æ¿
// src/composables/use{Name}.ts
import { ref, computed, onMounted, onUnmounted } from 'vue'
/**
* {æè¿°è¿ä¸ª composable çç¨é}
* @returns {è¿åå¼æè¿°}
*/
export function use{Name}() {
// ååºå¼ç¶æ
const state = ref<StateType>(initialValue)
const loading = ref(false)
// 计ç®å±æ§
const computedValue = computed(() => {
return state.value
})
// æ¹æ³
function doSomething() {
// ä¸å¡é»è¾
}
async function asyncAction() {
loading.value = true
try {
// 弿¥æä½
} finally {
loading.value = false
}
}
// çå½å¨æ
onMounted(() => {
// åå§å
})
onUnmounted(() => {
// æ¸
ç
})
return {
state,
loading,
computedValue,
doSomething,
asyncAction,
}
}
ç»å Pinia Store
// src/composables/use{Name}.ts
import { computed } from 'vue'
import { storeToRefs } from 'pinia'
export function use{Name}() {
const store = use{Name}Store()
// ä½¿ç¨ storeToRefs ä¿æååºæ§
const { data, loading } = storeToRefs(store)
// å°è£
action
async function refresh() {
await store.fetchData()
}
return {
data,
loading,
refresh,
}
}
另忰ç Composable
// src/composables/use{Name}.ts
interface Use{Name}Options {
immediate?: boolean
onSuccess?: (data: any) => void
onError?: (error: Error) => void
}
export function use{Name}(options: Use{Name}Options = {}) {
const { immediate = true, onSuccess, onError } = options
const data = ref<DataType | null>(null)
const loading = ref(false)
const error = ref<Error | null>(null)
async function execute() {
loading.value = true
error.value = null
try {
const result = await fetchData()
data.value = result
onSuccess?.(result)
} catch (err) {
error.value = err as Error
onError?.(err as Error)
} finally {
loading.value = false
}
}
if (immediate) {
execute()
}
return {
data,
loading,
error,
execute,
}
}
项ç®ç¤ºä¾åè
useGlobalToast
// å
¨å± Toast æç¤º
export const useGlobalToast = defineStore('global-toast', {
actions: {
show(option: ToastOptions | string) { /* ... */ },
success(option: ToastOptions | string) { /* ... */ },
error(option: ToastOptions | string) { /* ... */ },
info(option: ToastOptions | string) { /* ... */ },
warning(option: ToastOptions | string) { /* ... */ },
close() { /* ... */ },
},
})
useTheme
// 主é¢ç®¡ç
export function useTheme() {
const store = useThemeStore()
return {
theme: computed(() => store.theme),
isDark: computed(() => store.isDark),
themeVars: computed(() => store.themeVars),
}
}
ä½¿ç¨æ¹å¼
<script setup lang="ts">
// èªå¨å¯¼å
¥ï¼æ éæå¨ import
const { data, loading, execute } = use{Name}({
immediate: false,
onSuccess: (data) => {
console.log('æå:', data)
},
})
// æå¨æ§è¡
const handleClick = () => {
execute()
}
</script>
注æäºé¡¹
- æä»¶å使ç¨
use{Name}.tsæ ¼å¼ - 导åºå½æ°ä½¿ç¨
use{Name}å½å - ç±»åå®ä¹æ¾å¨
types/ç®å½ææä»¶é¡¶é¨ - èªå¨å¯¼å ¥å·²é ç½®ï¼æ éæå¨ import
- å¤ç¨ Pinia Store æ¶ä½¿ç¨
storeToRefsä¿æååºæ§