React 助手
- 作者仓库星标 0
- 作者更新于 实时读取
- 作者仓库 skills-registry
- 领域
- 工程开发
- 兼容 Agent
-
- Claude Code
- Cursor
- Cline
- Codex
- Windsurf
- Gemini CLI
- +20
- 信任分
- 88 / 100 · 社区维护
- 作者 / 版本 / 许可
- @tomevault-io · 未声明 license
- Token 消耗评级
- 低消耗
- 接入复杂程度
- 即装即用
- 是否需要外部 API Key
- 不需要
- 兼容的系统
- 未声明(默认跨平台)
- 底层运行要求
- 无特殊要求
- 文件与系统权限
-
- 只读
- 允许写入 / 修改
- 网络行为
- 仅限本地
- 安装命令数
- 26 条
档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。
需要注意: 未限定 allowed-tools,默认拥有全部工具权限。
---
name: react-native-patterns
description: Load when: implementing or reviewing the vendor mobile app (React Native, Expo managed workflow…
category: 工程开发
runtime: 无特殊运行时
---
# react-native-patterns 输出预览
## PART A: 任务判断
- 适用问题:代码实现、重构、调试或代码审查。
- 输入要求:目标材料、限制条件、期望输出和验收方式。
- 证据边界:围绕“Purpose / Core Rules / Expo Managed Workflow”读取原文规则,不把推断写成作者承诺。
## PART B: 执行结果
- **01** 任务判断:确认你的需求是否属于代码实现、重构、调试或代码审查,并标出输入、限制和预期结果。
- **02** 执行计划:优先按“Purpose / Core Rules / Expo Managed Workflow”拆成步骤,说明每一步会读取什么、修改什么、产出什么。
- **03** 交付结果:给出可复制的命令、文件改动、检查清单或内容草稿,并说明如何继续迭代。
- **04** 风险边界:结合 读取文件、写入/修改文件、主要在本地完成、通常不需要额外 API Key 给出执行前确认项。
## Running Rules
- 读取文件、写入/修改文件;主要在本地完成;通常不需要额外 API Key。
- 先小样例验证,再放大到真实任务。
- 交付时同时给结果、检查口径和下一步迭代建议。 原文出现了 `/listings` 这类斜杠命令;如果你的 Agent 支持命令触发,优先用命令开场,再补充目标和边界。
告诉 Agent 目标文件或材料、期望结果、不可改范围、是否允许联网或执行命令。本 Skill 的权限画像是:读取文件、写入/修改文件。
先用一个小任务确认它会围绕“Purpose / Core Rules / Expo Managed Workflow”工作;涉及文件或命令时,先看 diff、日志、预览或测试结果。
检查最终产物是否包含明确结果、必要证据和下一步动作;如果输出泛泛而谈,就补充输入、边界和验收标准后重跑。
---
name: react-native-patterns
description: Load when: implementing or reviewing the vendor mobile app (React Native, Expo managed workflow…
category: 工程开发
source: tomevault-io/skills-registry
---
# react-native-patterns
## 什么时候使用
- 用于审阅代码、文档或方案并给出可执行反馈 适合处理工程开发场景下的代码实现、调试、重构、测试或代码审查,核心价值是把输入、判断、执行、验证和交付边界固定下来,避免 Agent 泛泛回答。 把任务拆成可执行、可检查、可继续迭代的步骤;通常…
- 面向代码实现、重构、调试或代码审查,优先处理能明确输入、步骤和验收标准的工作。
## 需要提供什么
- 目标材料、目录范围、期望结果和不可改动内容。
- 是否允许联网、执行命令、读写文件或调用外部服务。
## 执行规则
- 围绕「Purpose / Core Rules / Expo Managed Workflow」组织步骤,不把推断写成作者事实。
- 读取文件、写入/修改文件;主要在本地完成;通常不需要额外 API Key。
- 先跑小样例,确认结果可检查后再扩大任务范围。
## 输出要求
- 给出最终产物、关键证据、验证方式和下一步动作。
- 信息不足时标记 unknown,不编造命令、平台或依赖。 作者原文负责流程事实;仓库文件负责来源和命令;流狐只补充适用场景、限制和质量判断。
skill "react-native-patterns" {
输入层 -> 用户目标 + 目标文件 + 禁止范围 + 验收标准
上下文层 -> Purpose / Core Rules / Expo Managed Workflow
规则层 -> SKILL.md 触发条件 / 执行顺序 / 输出格式
运行层 -> 无特殊运行时 | 读取文件、写入/修改文件 | 主要在本地完成
安全层 -> 通常不需要额外 API Key + 小任务验证 + diff / 日志复核
输出层 -> 可复制结果 + 检查清单 + 下一步迭代
} React Native Patterns (Expo Managed + NativeWind v5)
Purpose
Production patterns for the vendor mobile app built with React Native and Expo managed workflow. Covers list rendering performance, Reanimated animations, navigation with Expo Router, NativeWind v5 styling, native module usage, state management, and platform-specific patterns.
Core Rules
Expo Managed Workflow
- Stay within managed workflow — do not eject unless a native module is absolutely unavailable via Expo SDK or a community Expo module. Ejecting breaks OTA updates.
- Use
expo-dev-clientfor development builds with custom native modules — not bare workflow. - OTA updates via Expo Updates — keep JS bundle small. Native changes require a new build.
- App configuration in
app.json/app.config.ts. No manualInfo.plistorAndroidManifest.xmledits in managed workflow. - Target
expo@latestSDK. Pin the SDK version explicitly — do not use*.
List Rendering (CRITICAL Performance)
- Always use
FlashList(from@shopify/flash-list) instead ofFlatListorScrollViewfor any list with more than 10 items. FlashListrequiresestimatedItemSize— measure a real item, do not guess.- Memoize list items: wrap item component in
React.memo. Ensure props are stable (no inline objects/functions). - Stable callbacks: define
renderItem,keyExtractor,onEndReachedoutside the component or withuseCallback— unstable functions cause full list re-renders. - Avoid inline objects in
renderItem:renderItem={({ item }) => <Item data={item} />}is fine;renderItem={({ item }) => <Item style={{ padding: 8 }} />}re-renders every scroll. - Images in lists: use
expo-image(notImagefrom React Native) — it caches, handlesblurhash, and recycles efficiently. - Never use
ScrollView+map()for potentially long lists. It renders all items at once.
Animations (Reanimated 3)
- Use React Native Reanimated 3 (
react-native-reanimated) for all animations. - GPU-friendly properties only:
transform(translateX, translateY, scale, rotate),opacity. Never animatewidth,height,top,left,margin,padding— these trigger layout recalculation on every frame. - Derived values:
useDerivedValueto compute animation values from shared values — runs on the UI thread, not JS thread. - Gestures:
react-native-gesture-handlerwithGestureDetector. Never useonPressonAnimated.View— usePressableorGestureDetector. - Shared values:
useSharedValuefor values driven by gestures or timers.useAnimatedStyleto map shared values to style. withSpring,withTimingfor declarative animations. AvoidAnimated.loopwith Reanimated — usewithRepeat.
Navigation (Expo Router)
- Use Expo Router (file-based, built on React Navigation) — not bare React Navigation.
- Route files in
app/directory — mirrors Next.js App Router conventions. - Dynamic routes:
app/listings/[id].tsx. - Tab navigation:
app/(tabs)/_layout.tsxwith<Tabs>from Expo Router. - Stack navigation:
app/(stack)/_layout.tsxwith<Stack>. - Deep linking configured via
app.jsonschemefield — automatically handled by Expo Router. - Use native navigators (
nativeprop) — renders platform-native navigation chrome (UINavigationController on iOS, Fragment on Android). - Never use
router.back()for predictable navigation — userouter.push()orrouter.replace()with explicit paths.
NativeWind v5 Styling
- NativeWind v5 + Tailwind CSS v4 — no Babel configuration needed (Metro transformer).
- Import platform-aware components from
react-native-csswrapper:View,Text,ScrollView,Pressable,TextInput,Image,Link. classNameprop on these wrapped components — same Tailwind classes as web.- Platform-specific styles via CSS media queries:
@media (platform: ios) { ... },@media (platform: android) { ... }. - Custom theme variables in
src/global.cssvia@themeblock. - Apple semantic colours:
light-dark()function in CSS for automatic dark mode. UseplatformColor()for native system colours (e.g., iOSsystemBlue). tailwind-mergeandclsxfor conditional class composition — same as web pattern.- Never use React Native's
StyleSheet.createalongside NativeWind on the same component. Pick one approach per component.
State Management
- Zustand for global state (auth session, user preferences, offline queue).
- TanStack Query for server state — auto-caches, handles background refresh, works offline with
networkMode: 'offlineFirst'. - Local component state (
useState) for UI state that doesn't escape the component. - Never use Context for frequently-updating state — causes wide re-renders. Use Zustand.
- Offline queue: persist pending mutations in Zustand (with MMKV storage) and replay on reconnect.
Platform-Specific Code
- Platform-specific file extensions:
Component.ios.tsx/Component.android.tsxfor significantly different implementations. Platform.OS === 'ios'/Platform.OS === 'android'for minor inline differences only. Excessive inline checks are a code smell.- Safe area: always use
useSafeAreaInsets()orSafeAreaViewfromreact-native-safe-area-context. Never hardcode status bar heights. - Keyboard:
KeyboardAvoidingViewwithbehavior="padding"(iOS) /behavior="height"(Android).
Native APIs (Expo SDK)
- Camera:
expo-camera. Location:expo-location. Notifications:expo-notifications. File system:expo-file-system. - Always request permissions before accessing native APIs. Handle
deniedandundeterminedstates explicitly — show explanatory UI before the permission prompt. - Biometrics:
expo-local-authenticationfor secure local authentication. - Storage:
expo-secure-storefor sensitive data (tokens).@react-native-async-storage/async-storageor MMKV for non-sensitive persistent data.
Performance Rules
- No
console.login production — remove or gate behind__DEV__. - Avoid anonymous functions in JSX (
onPress={() => handler()}) in list items — breaksmemo. Extract to named handlers. InteractionManager.runAfterInteractionsfor expensive operations after navigation animations complete.useFocusEffectinstead ofuseEffectfor screen-level data refresh — runs only when screen is focused.
Patterns / Examples
FlashList with memoised item
import { FlashList } from '@shopify/flash-list';
import { memo, useCallback } from 'react';
const ListingItem = memo(({ item, onPress }: { item: Listing; onPress: (id: string) => void }) => (
<Pressable className="p-4 border-b border-border" onPress={() => onPress(item.id)}>
<Text className="text-base font-semibold text-foreground">{item.title}</Text>
<Text className="text-sm text-muted-foreground">{item.price}</Text>
</Pressable>
));
export function ListingsList({ listings }: { listings: Listing[] }) {
const router = useRouter();
const handlePress = useCallback((id: string) => router.push(`/listings/${id}`), [router]);
return (
<FlashList
data={listings}
renderItem={({ item }) => <ListingItem item={item} onPress={handlePress} />}
estimatedItemSize={72}
keyExtractor={item => item.id}
/>
);
}
Swipe-to-action animation (Reanimated + Gesture Handler)
import { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated';
import { GestureDetector, Gesture } from 'react-native-gesture-handler';
export function SwipeableListItem({ children, onDelete }: Props) {
const translateX = useSharedValue(0);
const panGesture = Gesture.Pan()
.onUpdate(e => { translateX.value = Math.min(0, e.translationX); })
.onEnd(e => {
if (e.translationX < -80) { runOnJS(onDelete)(); }
else { translateX.value = withSpring(0); }
});
const animatedStyle = useAnimatedStyle(() => ({
transform: [{ translateX: translateX.value }],
}));
return (
<GestureDetector gesture={panGesture}>
<Animated.View style={animatedStyle}>{children}</Animated.View>
</GestureDetector>
);
}
NativeWind + platform colour
// src/global.css
@theme {
--color-primary: platformColor(systemBlue, #3b82f6);
--color-background: light-dark(#ffffff, #0a0a0a);
}
// Component
<View className="bg-background p-4">
<Text className="text-primary font-bold">Hello</Text>
</View>
When to Use
- Any vendor mobile app screen, component, or navigation flow
- List rendering, animations, gestures in the mobile app
- Expo SDK API usage (camera, location, notifications)
- NativeWind styling decisions
- Any mobile feature implementation or mobile story
When NOT to Use
- Customer portal (Next.js — see
nextjs-patterns) - Admin SPA (React + Vite — see
react-admin-patterns) - Web-specific patterns (CSS Grid, DOM APIs, SSR)
Source: ajorobert/SpecPipeline — distributed by TomeVault.
先判断是否适合
作者设计意图
作者的方法与取舍
边界和复核