library-picturebook-activity/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv
aid 418aa57ea8 Day4: 超管端设计优化 + UGC绘本创作社区P0实现
一、超管端设计优化
- 文档管理SOP体系建立,docs目录重组
- 统一用户管理:跨租户全局视角,合并用户管理+公众用户
- 活动监管全模块重构:全部活动(统计卡片+阶段筛选+SuperDetail详情页)、报名数据/作品数据/评审进度(两层合一扁平列表)、成果发布(去Tab+统计+隐藏写操作)
- 菜单精简:移除评委管理/评审规则/通知管理
- Bug修复:租户编辑丢失隐藏菜单、pageSize限制、主色统一

二、UGC绘本创作社区P0
- 数据库:10张新表(user_works/user_work_pages/work_tags等)
- 子女账号独立化:Child升级为独立User,家长切换+独立登录
- 用户作品库:CRUD+发布审核,8个API
- AI创作流程:提交→生成→保存到作品库,4个API
- 作品广场:首页改造为推荐流,标签+搜索+排序
- 内容审核(超管端):作品审核+作品管理+标签管理
- 活动联动:WorkSelector作品选择器
- 布局改造:底部5Tab(发现/创作/活动/作品库/我的)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 22:20:25 +08:00

9.8 KiB

1NoCategoryGuidelineDescriptionDoDon'tCode GoodCode BadSeverityDocs URL
21ComponentsUse functional componentsHooks-based components are standardFunctional components with hooksClass componentsconst App = () => { }class App extends ComponentMediumhttps://reactnative.dev/docs/intro-react
32ComponentsKeep components smallSingle responsibility principleSplit into smaller componentsLarge monolithic components<Header /><Content /><Footer />500+ line componentMedium
43ComponentsUse TypeScriptType safety for props and stateTypeScript for new projectsJavaScript without typesconst Button: FC<Props> = () => { }const Button = (props) => { }Medium
54ComponentsColocate component filesKeep related files togetherComponent folder with stylesFlat structurecomponents/Button/index.tsx styles.tscomponents/Button.tsx styles/button.tsLow
65StylingUse StyleSheet.createOptimized style objectsStyleSheet for all stylesInline style objectsStyleSheet.create({ container: {} })style={{ margin: 10 }}Highhttps://reactnative.dev/docs/stylesheet
76StylingAvoid inline stylesPrevent object recreationStyles in StyleSheetInline style objects in renderstyle={styles.container}style={{ margin: 10, padding: 5 }}Medium
87StylingUse flexbox for layoutReact Native uses flexboxflexDirection alignItems justifyContentAbsolute positioning everywhereflexDirection: 'row'position: 'absolute' everywhereMediumhttps://reactnative.dev/docs/flexbox
98StylingHandle platform differencesPlatform-specific stylesPlatform.select or .ios/.android filesSame styles for both platformsPlatform.select({ ios: {}, android: {} })Hardcoded iOS valuesMediumhttps://reactnative.dev/docs/platform-specific-code
109StylingUse responsive dimensionsScale for different screensDimensions or useWindowDimensionsFixed pixel valuesuseWindowDimensions()width: 375Medium
1110NavigationUse React NavigationStandard navigation libraryReact Navigation for routingManual navigation managementcreateStackNavigator()Custom navigation stateMediumhttps://reactnavigation.org/
1211NavigationType navigation paramsType-safe navigationTyped navigation propsUntyped navigationnavigation.navigate<RootStackParamList>('Home', { id })navigation.navigate('Home', { id })Medium
1312NavigationUse deep linkingSupport URL-based navigationConfigure linking propNo deep link supportlinking: { prefixes: [] }No linking configurationMediumhttps://reactnavigation.org/docs/deep-linking/
1413NavigationHandle back buttonAndroid back button handlinguseFocusEffect with BackHandlerIgnore back buttonBackHandler.addEventListenerNo back handlerHigh
1514StateUse useState for local stateSimple component stateuseState for UI stateClass component stateconst [count, setCount] = useState(0)this.state = { count: 0 }Medium
1615StateUse useReducer for complex stateComplex state logicuseReducer for related stateMultiple useState for related valuesuseReducer(reducer initialState)5+ useState callsMedium
1716StateUse context sparinglyContext for global stateContext for theme auth localeContext for frequently changing dataThemeContext for app themeContext for list item dataMedium
1817StateConsider Zustand or ReduxExternal state managementZustand for simple Redux for complexuseState for global statecreate((set) => ({ }))Prop drilling global stateMedium
1918ListsUse FlatList for long listsVirtualized list renderingFlatList for 50+ itemsScrollView with map<FlatList data={items} /><ScrollView>{items.map()}</ScrollView>Highhttps://reactnative.dev/docs/flatlist
2019ListsProvide keyExtractorUnique keys for list itemskeyExtractor with stable IDIndex as keykeyExtractor={(item) => item.id}keyExtractor={(_, index) => index}High
2120ListsOptimize renderItemMemoize list item componentsReact.memo for list itemsInline render functionrenderItem={({ item }) => <MemoizedItem item={item} />}renderItem={({ item }) => <View>...</View>}High
2221ListsUse getItemLayout for fixed heightSkip measurement for performancegetItemLayout when height knownDynamic measurement for fixed itemsgetItemLayout={(_, index) => ({ length: 50, offset: 50 * index, index })}No getItemLayout for fixed heightMedium
2322ListsImplement windowSizeControl render windowSmaller windowSize for memoryDefault windowSize for large listswindowSize={5}windowSize={21} for huge listsMedium
2423PerformanceUse React.memoPrevent unnecessary re-rendersmemo for pure componentsNo memoizationexport default memo(MyComponent)export default MyComponentMedium
2524PerformanceUse useCallback for handlersStable function referencesuseCallback for propsNew function on every renderuseCallback(() => {}, [deps])() => handlePress()Medium
2625PerformanceUse useMemo for expensive opsCache expensive calculationsuseMemo for heavy computationsRecalculate every renderuseMemo(() => expensive(), [deps])const result = expensive()Medium
2726PerformanceAvoid anonymous functions in JSXPrevent re-rendersNamed handlers or useCallbackInline arrow functionsonPress={handlePress}onPress={() => doSomething()}Medium
2827PerformanceUse Hermes engineImproved startup and memoryEnable Hermes in buildJavaScriptCore for new projectshermes_enabled: truehermes_enabled: falseMediumhttps://reactnative.dev/docs/hermes
2928ImagesUse expo-imageModern performant image component for React NativeUse expo-image for caching, blurring, and performanceUse default Image for heavy lists or unmaintained libraries<Image source={url} cachePolicy='memory-disk' /> (expo-image)<FastImage source={url} />Mediumhttps://docs.expo.dev/versions/latest/sdk/image/
3029ImagesSpecify image dimensionsPrevent layout shiftswidth and height for remote imagesNo dimensions for network images<Image style={{ width: 100 height: 100 }} /><Image source={{ uri }} /> no sizeHigh
3130ImagesUse resizeModeControl image scalingresizeMode cover containStretch imagesresizeMode="cover"No resizeModeLow
3231FormsUse controlled inputsState-controlled form fieldsvalue + onChangeTextUncontrolled inputs<TextInput value={text} onChangeText={setText} /><TextInput defaultValue={text} />Medium
3332FormsHandle keyboardManage keyboard visibilityKeyboardAvoidingViewContent hidden by keyboard<KeyboardAvoidingView behavior="padding">No keyboard handlingHighhttps://reactnative.dev/docs/keyboardavoidingview
3433FormsUse proper keyboard typesAppropriate keyboard for inputkeyboardType for input typeDefault keyboard for allkeyboardType="email-address"keyboardType="default" for emailLow
3534TouchUse PressableModern touch handlingPressable for touch interactionsTouchableOpacity for new code<Pressable onPress={} /><TouchableOpacity onPress={} />Lowhttps://reactnative.dev/docs/pressable
3635TouchProvide touch feedbackVisual feedback on pressRipple or opacity changeNo feedback on pressandroid_ripple={{ color: 'gray' }}No press feedbackMedium
3736TouchSet hitSlop for small targetsIncrease touch areahitSlop for icons and small buttonsTiny touch targetshitSlop={{ top: 10 bottom: 10 }}44x44 with no hitSlopMedium
3837AnimationUse ReanimatedHigh-performance animationsreact-native-reanimatedAnimated API for complexuseSharedValue useAnimatedStyleAnimated.timing for gestureMediumhttps://docs.swmansion.com/react-native-reanimated/
3938AnimationRun on UI threadworklets for smooth animationRun animations on UI threadJS thread animationsrunOnUI(() => {})Animated on JS threadHigh
4039AnimationUse gesture handlerNative gesture recognitionreact-native-gesture-handlerJS-based gesture handling<GestureDetector><View onTouchMove={} />Mediumhttps://docs.swmansion.com/react-native-gesture-handler/
4140AsyncHandle loading statesShow loading indicatorsActivityIndicator during loadEmpty screen during load{isLoading ? <ActivityIndicator /> : <Content />}No loading stateMedium
4241AsyncHandle errors gracefullyError boundaries and fallbacksError UI for failed requestsCrash on error{error ? <ErrorView /> : <Content />}No error handlingHigh
4342AsyncCancel async operationsCleanup on unmountAbortController or cleanupMemory leaks from asyncuseEffect cleanupNo cleanup for subscriptionsHigh
4443AccessibilityAdd accessibility labelsDescribe UI elementsaccessibilityLabel for all interactiveMissing labelsaccessibilityLabel="Submit form"<Pressable> without labelHighhttps://reactnative.dev/docs/accessibility
4544AccessibilityUse accessibility rolesSemantic meaningaccessibilityRole for elementsWrong rolesaccessibilityRole="button"No role for buttonMedium
4645AccessibilitySupport screen readersTest with TalkBack/VoiceOverTest with screen readersSkip accessibility testingRegular TalkBack testingNo screen reader testingHigh
4746TestingUse React Native Testing LibraryComponent testingrender and fireEventEnzyme or manual testingrender(<Component />)shallow(<Component />)Mediumhttps://callstack.github.io/react-native-testing-library/
4847TestingTest on real devicesReal device behaviorTest on iOS and Android devicesSimulator onlyDevice testing in CISimulator only testingHigh
4948TestingUse Detox for E2EEnd-to-end testingDetox for critical flowsManual E2E testingdetox testManual testing onlyMediumhttps://wix.github.io/Detox/
5049NativeUse native modules carefullyBridge has overheadBatch native callsFrequent bridge crossingBatch updatesCall native on every keystrokeHigh
5150NativeUse Expo when possibleSimplified developmentExpo for standard featuresBare RN for simple appsexpo install packagereact-native link packageLowhttps://docs.expo.dev/
5251NativeHandle permissionsRequest permissions properlyCheck and request permissionsAssume permissions grantedPermissionsAndroid.request()Access without permission checkHighhttps://reactnative.dev/docs/permissionsandroid