遷移指南
本頁講兩件事:Vue(lh-ui-plus / lh-ui-vue2)→ React 的通用概念映射,以及本庫實作中與 Vue 版有意的差異。
概念映射總表
| Vue(lh-ui-plus) | React(@lh-ui/react) |
|---|---|
defineProps<T>() | interface LhXxxProps + 解構預設參數 |
withDefaults(...) | 解構預設值(不用 defaultProps) |
emits + emit('change', [val, e]) | onChange?: (value, event) => void |
v-model="x" | value={x} onChange={...} |
v-model:visible="x" | visible={x} onVisibleChange={...} |
defineExpose({ ... }) | forwardRef + useImperativeHandle |
<slot> | children |
<slot name="footer"> | footer?: ReactNode prop |
具名插槽 #header | header?: ReactNode prop |
provide(...) / inject(...) | Context.Provider / useContext |
provide 必須 computed | Context value 必須 useMemo |
computed(() => ...) | useMemo(() => ..., [deps]) |
watch(src, cb) | useEffect(() => cb(), [src]) |
watch(src, cb, { immediate: true }) | useEffect(effect 天生立即執行一次) |
onMounted / onUnmounted | useEffect 的 setup / cleanup |
<Transition name="lh-x-fade"> | useTransition(visible, duration) 驅動同名類別名 |
<Teleport to="body"> | createPortal(..., document.body) |
ref="<name>" | useRef<HTMLDivElement>(null) |
nextTick() | flushSync() 或 effect(通常不需要) |
app.use(LhUI) | 無——命名匯出按需引入 |
<LhXxx v-bind="obj"> | <LhXxx {...obj}> |