uniapp-ui
npx skills add https://github.com/zwmmm/oh-my-claudecode --skill uniapp-ui
Agent 安装分布
Skill 文档
UniApp UI – è®¾è®¡ç¨¿å° UniApp 代ç çæå¨
æ¦è¿°
è¿ä¸ª skill å¯ä»¥å°è®¾è®¡ç¨¿ï¼ææ¬æè¿°ãHTML/CSSï¼èªå¨è½¬æ¢ä¸º UniApp + UnoCSS + Wot Design Uni çç产就绪代ç ãéè¿æºè½ç»ä»¶æ å°å页颿¨¡æ¿ç³»ç»ï¼å¿«éçæè·¨å¹³å°å ¼å®¹çç§»å¨åºç¨é¡µé¢ã
æ ¸å¿åè½
- æºè½ç»ä»¶æ å° – èªå¨è¯å« HTML/CSS å¹¶æ å°å° WotUI ç»ä»¶æèªå®ä¹ç»ä»¶
- 页颿¨¡æ¿ç³»ç» – 6 ç§åºç¡æ¨¡æ¿ï¼è¡¨åãå表ã详æ ãTabãæç´¢ãç½æ ¼ï¼
- èªå®ä¹ç»ä»¶åæ – èªå¨æ«æé¡¹ç®ç»ä»¶å¹¶ä¼å 使ç¨
- 跨平å°å ¼å®¹ – çæçä»£ç æ¯æ H5ã微信å°ç¨åºãApp
- æä½³å®è·µå ç½® – èªå¨åºç¨ Vue3ãUnoCSSãUniApp æä½³å®è·µ
åç½®è¦æ±
ç¡®ä¿å·²å®è£ Python 3.8+ï¼
python3 --version
妿ªå®è£ ï¼è¯·æä»¥ä¸æ¹å¼å®è£ ï¼
macOS:
brew install python3
Ubuntu/Linux:
sudo apt-get update && sudo apt-get install python3 python3-pip
Windows: ä¸è½½å¹¶å®è£ Python from https://www.python.org/downloads/
ä½¿ç¨æµç¨
7 æ¥å·¥ä½æµ
Step 1: åæè®¾è®¡è¾å ¥
è¾å ¥æ¹å¼:
- ææ¬æè¿°ï¼å¦ï¼”å建ä¸ä¸ªç»å½é¡µé¢ï¼å å«ç¨æ·åãå¯ç è¾å ¥æ¡åç»å½æé®”ï¼
- HTML/CSS 代ç çæ®µ
- è®¾è®¡è¦æ±ææ¡£
åæå 容:
- 页é¢ç±»åï¼form/list/detail/tab/search/gridï¼
- æéç»ä»¶ï¼button/input/cell/etcï¼
- å¸å±ç»æ
- 交äºéæ±
示ä¾:
ç¨æ·: æéè¦ä¸ä¸ªååå表页ï¼å
å«æç´¢æ¡ãååå¡çï¼å¾çãæ é¢ãä»·æ ¼ï¼ï¼æ¯æä¸æå·æ°å䏿å è½½æ´å¤ã
Step 2: 鿩页颿¨¡æ¿
ä½¿ç¨æç´¢å¼æå¹é æåéçæ¨¡æ¿ï¼
python3 scripts/search.py "list refresh load-more" --domain template
6 个å¯ç¨æ¨¡æ¿:
- form-page – 表å页ï¼ç»å½ã注åã设置ãåé¦ï¼
- list-page – åè¡¨é¡µï¼æ°é»ã订åãååãè天ï¼
- detail-page – 详æ 页ï¼åå详æ ãæç« ãç¨æ·èµæï¼
- tab-page – Tab 页ï¼é¦é¡µãåç±»ï¼
- search-page – æç´¢é¡µï¼æç´¢ç»æãçéï¼
- grid-page – ç½æ ¼é¡µï¼åç±»ç½æ ¼ãç¸åï¼
Step 3: æ å°ç»ä»¶
ä¼å 级系ç»:
- èªå®ä¹ç»ä»¶ (Priority 1) – 项ç®ä¸çèªå®ä¹ç»ä»¶
- WotUI ç»ä»¶ (Priority 2) – Wot Design Uni ç»ä»¶åº
- UniApp å ç½®ç»ä»¶ (Priority 3) – view/text/image ç
- ç´æ¥å®ç° (Fallback) – ä½¿ç¨ UnoCSS + åºç¡ç»ä»¶
æç´¢å½ä»¤:
# æç´¢èªå®ä¹ç»ä»¶ï¼å¦æå·²è¿è¡ analyze_components.pyï¼
python3 scripts/search.py "product card" --domain custom
# æç´¢ WotUI ç»ä»¶
python3 scripts/search.py "button primary" --domain wotui
python3 scripts/search.py "input text field" --domain wotui
python3 scripts/search.py "list cell" --domain wotui
# æç´¢ UnoCSS æ ·å¼æ¨¡å¼
python3 scripts/search.py "card container" --domain unocss
# æç´¢æä½³å®è·µ
python3 scripts/search.py "navigation" --domain best-practice
Step 4: çæä»£ç
åºäºéå®ç模æ¿åç»ä»¶æ å°çæå®æ´ç .vue æä»¶ï¼
çæå å®¹å æ¬:
- 宿´ç Vue3 SFC ç»æï¼
<template>,<script setup>,<style scoped>ï¼ - UnoCSS åååæ ·å¼ç±»
- WotUI æèªå®ä¹ç»ä»¶
- ååºå¼æ°æ®åæ¹æ³
- UniApp çå½å¨æé©åï¼onLoad, onShow, onReadyï¼
- é误å¤çåå è½½ç¶æ
- 跨平å°å ¼å®¹ä»£ç
Step 5: åºç¨æä½³å®è·µ
èªå¨æ£æ¥å¹¶åºç¨æä½³å®è·µï¼
# æç´¢ç¸å
³æä½³å®è·µ
python3 scripts/search.py "form validation" --domain best-practice
python3 scripts/search.py "list performance" --domain best-practice
æ£æ¥é¡¹å æ¬:
- UniApp 跨平å°å ¼å®¹æ§
- Vue3 Composition API è§è
- UnoCSS åå类使ç¨
- WotUI ç»ä»¶æ£ç¡®éæ
- æ§è½ä¼åï¼èæå表ãæå è½½ï¼
Step 6: è´¨éæ£æ¥
è¿è¡è´¨éæ£æ¥æ¸ åï¼è§ä¸æ”è´¨éæ£æ¥æ¸ å”ç« èï¼ã
Step 7: è¾åºä»£ç
æä¾å®æ´çãç产就绪ç .vue æä»¶ä»£ç ã
èªå®ä¹ç»ä»¶åæ
为ä»ä¹éè¦èªå®ä¹ç»ä»¶åæï¼
å¦æä½ ç项ç®å·²ç»æèªå®ä¹ç»ä»¶ï¼å¦ ProductCardãUserAvatarï¼ï¼åºè¯¥ä¼å 使ç¨è¿äºç»ä»¶è䏿¯éå¤å®ç°ã
å¦ä½ä½¿ç¨
æ«æé¡¹ç®å¹¶çæç»ä»¶æ å°:
# åæé¡¹ç®ç»ä»¶
python3 scripts/analyze_components.py /path/to/your/uniapp-project
# æå®è¾åºæä»¶
python3 scripts/analyze_components.py /path/to/your/uniapp-project -o data/components.csv
èæ¬ä¼:
- æ«æé¡¹ç®
components/ç®å½ä¸çææ .vue æä»¶ - æåç»ä»¶å æ°æ®ï¼PropsãEmitsãSlotsãCSS ç±»åï¼
- çæ
components.csvæä»¶ - èªå¨èµäºæé«ä¼å 级ï¼Priority 1ï¼
çæç components.csv 示ä¾:
No,Component Name,File Path,HTML Pattern,CSS Classes,Props,Slots,Events,Use Case,Category,Code Example,Priority
1,ProductCard,components/ProductCard.vue,<view class='product-card'>,product-card card-item,{"title":"string","price":"number","image":"string"},default,"click","ååå±ç¤ºå¡ç",card,"<ProductCard :title='åå' :price='99.9' />",1
æç´¢å½ä»¤åè
5 个æç´¢å
| åå | ç¨é | CSV æä»¶ | ç¤ºä¾æ¥è¯¢ |
|---|---|---|---|
custom |
èªå®ä¹ç»ä»¶ | components.csv | “product card image” |
wotui |
WotUI ç»ä»¶ | wotui.csv | “button primary large” |
template |
页颿¨¡æ¿ | templates.csv | “form login submit” |
unocss |
UnoCSS æ¨¡å¼ | unocss-patterns.csv | “flex center card” |
best-practice |
æä½³å®è·µ | best-practices.csv | “navigation storage” |
æç´¢è¯æ³
# åºç¡æç´¢
python3 scripts/search.py "<query>" --domain <domain>
# éå¶ç»ææ°é
python3 scripts/search.py "<query>" --domain <domain> -n 5
# JSON è¾åº
python3 scripts/search.py "<query>" --domain <domain> --json
æç´¢ç¤ºä¾
æç´¢ WotUI ç»ä»¶:
# æé®ç»ä»¶
python3 scripts/search.py "button primary action" --domain wotui
# è¾å
¥æ¡ç»ä»¶
python3 scripts/search.py "input text clearable" --domain wotui
# å表åå
æ ¼
python3 scripts/search.py "cell list item link" --domain wotui
# 表åç»ä»¶
python3 scripts/search.py "form validation" --domain wotui
æç´¢é¡µé¢æ¨¡æ¿:
# 表å页模æ¿
python3 scripts/search.py "form login register" --domain template
# å表页模æ¿
python3 scripts/search.py "list scroll refresh" --domain template
# 详æ
页模æ¿
python3 scripts/search.py "detail product image" --domain template
æç´¢æ ·å¼æ¨¡å¼:
# å¸å±æ¨¡å¼
python3 scripts/search.py "flex center" --domain unocss
python3 scripts/search.py "card container shadow" --domain unocss
# æé®æ ·å¼
python3 scripts/search.py "button full-width" --domain unocss
æç´¢æä½³å®è·µ:
# 导èªç¸å
³
python3 scripts/search.py "navigation" --domain best-practice
# åå¨ç¸å
³
python3 scripts/search.py "storage" --domain best-practice
# æ§è½ä¼å
python3 scripts/search.py "performance list" --domain best-practice
è´¨éæ£æ¥æ¸ å
UniApp 跨平å°å ¼å®¹æ§
- 使ç¨
<view>,<text>,<image>ç UniApp ç»ä»¶ - é¿å ä½¿ç¨ Web-only æ ç¾ï¼div, span, aï¼
- 使ç¨
uni.*API èé Web APIï¼å¦uni.navigateTo代æ¿router.pushï¼ - å¾çè·¯å¾ä½¿ç¨ç¸å¯¹è·¯å¾æ HTTPS URL
- é¿å Web-only äºä»¶ï¼å¦ onMouseOverï¼
Vue 3 Composition API
- 使ç¨
<script setup>è¯æ³ - Props 使ç¨
defineProps<T>() - Emits 使ç¨
defineEmits<T>() - ååºå¼æ°æ®ä½¿ç¨
ref()æreactive() - 计ç®å¼ä½¿ç¨
computed() - çå½å¨æé©åï¼onLoad, onShow, onReady, onHide, onUnload
UnoCSS åååæ ·å¼
- ä¼å 使ç¨ååç±»èéå èæ ·å¼
- 使ç¨ååºå¼ç±»ï¼sm: md: lg:ï¼
- 使ç¨è¯ä¹åé¢è²æç´æ¥é¢è²å¼
- é´è·ä½¿ç¨ä¸è´çæ¯ä¾ï¼p-4, m-2, gap-4ï¼
- é¿å
ä¸å¿
è¦çä»»æå¼
[value]
WotUI ç»ä»¶éæ
- ç»ä»¶å¯¼å ¥æ£ç¡®
- Props åç§°åç±»åå¹é ææ¡£
- äºä»¶ç»å®ä½¿ç¨
@event-name - 使ç¨ç»ä»¶æä¾ç TypeScript ç±»å
- 主é¢å®å¶ä½¿ç¨ CSS åé
代ç è´¨é
- 表åæéªè¯è§å
- éå½ç TypeScript ç±»åæ³¨è§£
宿´ä½¿ç¨ç¤ºä¾
ç¤ºä¾ 1: å建ç»å½é¡µé¢
Step 1: æè¿°éæ±
å建ä¸ä¸ªç»å½é¡µé¢ï¼å
å«ï¼
- ç¨æ·åè¾å
¥æ¡
- å¯ç è¾å
¥æ¡ï¼éèå符ï¼
- "è®°ä½æ"å¤éæ¡
- ç»å½æé®ï¼å
¨å®½ã主è²è°ï¼
- "å¿è®°å¯ç "龿¥
Step 2: éæ©æ¨¡æ¿
python3 scripts/search.py "form login" --domain template
# ç»æ: form-page (表å页模æ¿)
Step 3: æç´¢ç»ä»¶
# æç´¢è¾å
¥æ¡
python3 scripts/search.py "input text" --domain wotui
# ç»æ: wd-input
# æç´¢å¯ç æ¡
python3 scripts/search.py "input password" --domain wotui
# ç»æ: wd-input (type="password")
# æç´¢å¤éæ¡
python3 scripts/search.py "checkbox" --domain wotui
# ç»æ: wd-checkbox
# æç´¢æé®
python3 scripts/search.py "button primary block" --domain wotui
# ç»æ: wd-button
Step 4: çæä»£ç
çæç login.vue:
<template>
<view class="flex flex-col h-screen bg-gray-50">
<wd-navbar title="ç»å½" />
<scroll-view class="flex-1" scroll-y>
<view class="p-4">
<view class="text-center mb-8">
<text class="text-2xl font-bold text-gray-900">欢è¿åæ¥</text>
</view>
<wd-form ref="formRef" :model="formData" :rules="rules">
<wd-form-item label="ç¨æ·å" prop="username">
<wd-input
v-model="formData.username"
prefix-icon="user"
placeholder="请è¾å
¥ç¨æ·å"
clearable
/>
</wd-form-item>
<wd-form-item label="å¯ç " prop="password">
<wd-input
v-model="formData.password"
type="password"
prefix-icon="lock"
placeholder="请è¾å
¥å¯ç "
/>
</wd-form-item>
<wd-form-item>
<wd-checkbox v-model="remember">è®°ä½æ</wd-checkbox>
</wd-form-item>
<wd-button
block
type="primary"
:loading="loading"
@click="handleLogin"
>
ç»å½
</wd-button>
<view class="text-center mt-4">
<text
class="text-blue-500"
@click="goToForgotPassword"
>
å¿è®°å¯ç ï¼
</text>
</view>
</wd-form>
</view>
</scroll-view>
</view>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { FormInstance } from 'wot-design-uni'
const formRef = ref<FormInstance>()
const loading = ref(false)
const remember = ref(false)
const formData = ref({
username: '',
password: ''
})
const rules = {
username: [
{ required: true, message: 'ç¨æ·åä¸è½ä¸ºç©º' }
],
password: [
{ required: true, message: 'å¯ç ä¸è½ä¸ºç©º' },
{ min: 6, message: 'å¯ç è³å°6个å符' }
]
}
const handleLogin = async () => {
try {
await formRef.value?.validate()
loading.value = true
// ç»å½é»è¾
const res = await uni.request({
url: '/api/login',
method: 'POST',
data: formData.value
})
// ä¿å token
uni.setStorageSync('token', res.data.token)
// 跳转å°é¦é¡µ
uni.switchTab({ url: '/pages/index/index' })
} catch (error) {
uni.showToast({
title: 'ç»å½å¤±è´¥',
icon: 'error'
})
} finally {
loading.value = false
}
}
const goToForgotPassword = () => {
uni.navigateTo({ url: '/pages/forgot-password/index' })
}
</script>
Step 5: æ£æ¥æä½³å®è·µ
python3 scripts/search.py "form validation navigation" --domain best-practice
Step 6: è´¨éæ£æ¥
- â ä½¿ç¨ UniApp ç»ä»¶ï¼view, text, scroll-viewï¼
- â
使ç¨
<script setup>å TypeScript - â 表åéªè¯è§å宿´
- â é误å¤çï¼try-catchï¼
- â
使ç¨
uni.*APIï¼navigateTo, switchTab, setStorageSyncï¼ - â ååå UnoCSS ç±»
èµæºè¯´æ
scripts/
坿§è¡èæ¬ï¼ç¨äºæç´¢ååæï¼
- core.py – BM25 æç´¢å¼ææ ¸å¿
- search.py – CLI æç´¢æ¥å£
- analyze_components.py – èªå®ä¹ç»ä»¶åæå¨
data/
CSV æ°æ®åºæä»¶ï¼
- wotui.csv – Wot Design Uni ç»ä»¶æ å°ï¼70+ ç»ä»¶ï¼
- components.csv – èªå®ä¹ç»ä»¶æ å°ï¼èªå¨çæï¼
- templates.csv – 页颿¨¡æ¿å æ°æ®
- unocss-patterns.csv – UnoCSS å¸¸ç¨æ¨¡å¼
- uni-components.csv – UniApp å ç½®ç»ä»¶
- best-practices.csv – æä½³å®è·µæå
templates/
页颿¨¡æ¿æä»¶ï¼
- form-page.vue – 表å页模æ¿
- list-page.vue – å表页模æ¿
- detail-page.vue – 详æ 页模æ¿
- tab-page.vue – Tab 页模æ¿
- search-page.vue – æç´¢é¡µæ¨¡æ¿
- grid-page.vue – ç½æ ¼é¡µæ¨¡æ¿
references/
åèææ¡£ï¼æéå è½½ï¼ï¼
- wotui-api.md – Wot Design Uni API 宿´åè
- unocss-presets.md – UnoCSS é¢è®¾åå¿«æ·æ¹å¼
- uni-lifecycle.md – UniApp çå½å¨æè¯¦è§£
常è§é®é¢
Q: å¦ä½æ·»å æ°çèªå®ä¹ç»ä»¶å°æ å°ï¼
A: éæ°è¿è¡ analyze_components.py èæ¬ï¼å®ä¼èªå¨æ«æå¹¶æ´æ° components.csvã
Q: çæç代ç å¨å°ç¨åºä¸æ¥éæä¹åï¼
A: æ£æ¥æ¯å¦ä½¿ç¨äº Web-only API æç»ä»¶ãè¿è¡è´¨éæ£æ¥æ¸ åä¸ç跨平å°å ¼å®¹æ§æ£æ¥ã
Q: å¦ä½èªå®ä¹ç»ä»¶æ ·å¼ï¼
A: ä½¿ç¨ UnoCSS ååç±»ææ·»å scoped æ ·å¼ãé¿å ç´æ¥ä¿®æ¹ WotUI ç»ä»¶å 鍿 ·å¼ã
Q: æ¯ææé»æ¨¡å¼åï¼
A: Wot Design Uni æ¯ææé»æ¨¡å¼ãä½¿ç¨ CSS åéè¿è¡ä¸»é¢å®å¶ã
Q: å¦ä½ä¼åé¿å表æ§è½ï¼
A: æç´¢æä½³å®è·µ python3 scripts/search.py "list performance" --domain best-practiceï¼èè使ç¨èææ»å¨æå页å è½½ã