ERP/.shared/ui-ux-pro-max/data/stacks/react-native.csv
2026-01-03 19:18:40 +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