Viet Tran a38d04c3d5
feat(search): overhaul relevance and curated design data
Overhaul BM25 relevance, reasoning and data-quality contracts; refresh UI styles and framework guidance; add resilient text, chip, badge and micro-interaction guidance; strengthen release, provenance and catalog refresh gates; update bilingual documentation.
2026-08-14 00:08:23 +07:00

14 KiB

1NoCategoryGuidelineDescriptionDoDon'tCode GoodCode BadSeverityDocs URLApplies ToStatusVerified At
21ComponentsUse functional componentsHooks-based components are standardFunctional components with hooksClass componentsconst App = () => { }class App extends ComponentMediumhttps://reactnative.dev/docs/intro-reactreact-native 0.86.x (official active line)active2026-08-13
32ComponentsKeep components smallSingle responsibility principleSplit into smaller componentsLarge monolithic components<Header /><Content /><Footer />500+ line componentMediumreact-native 0.86.x (official active line)active2026-08-13
43ComponentsUse TypeScriptType safety for props and stateTypeScript for new projectsJavaScript without typesconst Button: FC<Props> = () => { }const Button = (props) => { }Mediumreact-native 0.86.x (official active line)active2026-08-13
54ComponentsColocate component filesKeep related files togetherComponent folder with stylesFlat structurecomponents/Button/index.tsx styles.tscomponents/Button.tsx styles/button.tsLowreact-native 0.86.x (official active line)active2026-08-13
65StylingUse StyleSheet.createOptimized style objectsStyleSheet for all stylesInline style objectsStyleSheet.create({ container: {} })style={{ margin: 10 }}Highhttps://reactnative.dev/docs/stylesheetreact-native 0.86.x (official active line)active2026-08-13
76StylingAvoid inline stylesPrevent object recreationStyles in StyleSheetInline style objects in renderstyle={styles.container}style={{ margin: 10, padding: 5 }}Mediumreact-native 0.86.x (official active line)active2026-08-13
87StylingUse flexbox for layoutReact Native uses flexboxflexDirection alignItems justifyContentAbsolute positioning everywhereflexDirection: 'row'position: 'absolute' everywhereMediumhttps://reactnative.dev/docs/flexboxreact-native 0.86.x (official active line)active2026-08-13
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-codereact-native 0.86.x (official active line)active2026-08-13
109StylingUse responsive dimensionsScale for different screensDimensions or useWindowDimensionsFixed pixel valuesuseWindowDimensions()width: 375Mediumreact-native 0.86.x (official active line)active2026-08-13
1110NavigationUse React NavigationStandard navigation libraryReact Navigation for routingManual navigation managementcreateStackNavigator()Custom navigation stateMediumhttps://reactnavigation.org/react-native 0.86.x (official active line)active2026-08-13
1211NavigationType navigation paramsType-safe navigationTyped navigation propsUntyped navigationnavigation.navigate<RootStackParamList>('Home', { id })navigation.navigate('Home', { id })Mediumreact-native 0.86.x (official active line)active2026-08-13
1312NavigationUse deep linkingSupport URL-based navigationConfigure linking propNo deep link supportlinking: { prefixes: [] }No linking configurationMediumhttps://reactnavigation.org/docs/deep-linking/react-native 0.86.x (official active line)active2026-08-13
1413NavigationHandle back buttonAndroid back button handlinguseFocusEffect with BackHandlerIgnore back buttonBackHandler.addEventListenerNo back handlerHighhttps://reactnative.dev/docs/backhandlerreact-native 0.86.x (official active line)active2026-08-13
1514StateUse useState for local stateSimple component stateuseState for UI stateClass component stateconst [count, setCount] = useState(0)this.state = { count: 0 }Mediumreact-native 0.86.x (official active line)active2026-08-13
1615StateUse useReducer for complex stateComplex state logicuseReducer for related stateMultiple useState for related valuesuseReducer(reducer initialState)5+ useState callsMediumreact-native 0.86.x (official active line)active2026-08-13
1716StateUse context sparinglyContext for global stateContext for theme auth localeContext for frequently changing dataThemeContext for app themeContext for list item dataMediumreact-native 0.86.x (official active line)active2026-08-13
1817StateConsider Zustand or ReduxExternal state managementZustand for simple Redux for complexuseState for global statecreate((set) => ({ }))Prop drilling global stateMediumreact-native 0.86.x (official active line)active2026-08-13
1918ListsUse FlatList for long listsVirtualized list renderingFlatList for 50+ itemsScrollView with map<FlatList data={items} /><ScrollView>{items.map()}</ScrollView>Highhttps://reactnative.dev/docs/flatlistreact-native 0.86.x (official active line)active2026-08-13
2019ListsProvide keyExtractorUnique keys for list itemskeyExtractor with stable IDIndex as keykeyExtractor={(item) => item.id}keyExtractor={(_, index) => index}Highhttps://reactnative.dev/docs/flatlist#keyextractorreact-native 0.86.x (official active line)active2026-08-13
2120ListsOptimize renderItemMemoize list item componentsReact.memo for list itemsInline render functionrenderItem={({ item }) => <MemoizedItem item={item} />}renderItem={({ item }) => <View>...</View>}Highhttps://reactnative.dev/docs/optimizing-flatlist-configurationreact-native 0.86.x (official active line)active2026-08-13
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 heightMediumreact-native 0.86.x (official active line)active2026-08-13
2322ListsImplement windowSizeControl render windowSmaller windowSize for memoryDefault windowSize for large listswindowSize={5}windowSize={21} for huge listsMediumreact-native 0.86.x (official active line)active2026-08-13
2423PerformanceUse React.memoPrevent unnecessary re-rendersmemo for pure componentsNo memoizationexport default memo(MyComponent)export default MyComponentMediumreact-native 0.86.x (official active line)active2026-08-13
2524PerformanceUse useCallback for handlersStable function referencesuseCallback for propsNew function on every renderuseCallback(() => {}, [deps])() => handlePress()Mediumreact-native 0.86.x (official active line)active2026-08-13
2625PerformanceUse useMemo for expensive opsCache expensive calculationsuseMemo for heavy computationsRecalculate every renderuseMemo(() => expensive(), [deps])const result = expensive()Mediumreact-native 0.86.x (official active line)active2026-08-13
2726PerformanceAvoid anonymous functions in JSXPrevent re-rendersNamed handlers or useCallbackInline arrow functionsonPress={handlePress}onPress={() => doSomething()}Mediumreact-native 0.86.x (official active line)active2026-08-13
2827PerformanceUse bundled Hermes by defaultHermes is bundled with React Native and enabled by defaultKeep the bundled Hermes default unless an explicit compatibility need requires opt-outOpt out of Hermes by defaultUse the Hermes version bundled with React NativeOverride the JavaScript engine without a verified requirementMediumhttps://reactnative.dev/architecture/bundled-hermesreact-native 0.86.x (official active line)active2026-08-13
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/react-native 0.86.x (official active line)active2026-08-13
3029ImagesSpecify image dimensionsPrevent layout shiftswidth and height for remote imagesNo dimensions for network images<Image style={{ width: 100 height: 100 }} /><Image source={{ uri }} /> no sizeHighhttps://reactnative.dev/docs/images#network-imagesreact-native 0.86.x (official active line)active2026-08-13
3130ImagesUse resizeModeControl image scalingresizeMode cover containStretch imagesresizeMode="cover"No resizeModeLowreact-native 0.86.x (official active line)active2026-08-13
3231FormsUse controlled inputsState-controlled form fieldsvalue + onChangeTextUncontrolled inputs<TextInput value={text} onChangeText={setText} /><TextInput defaultValue={text} />Mediumreact-native 0.86.x (official active line)active2026-08-13
3332FormsHandle keyboardManage keyboard visibilityKeyboardAvoidingViewContent hidden by keyboard<KeyboardAvoidingView behavior="padding">No keyboard handlingHighhttps://reactnative.dev/docs/keyboardavoidingviewreact-native 0.86.x (official active line)active2026-08-13
3433FormsUse proper keyboard typesAppropriate keyboard for inputkeyboardType for input typeDefault keyboard for allkeyboardType="email-address"keyboardType="default" for emailLowreact-native 0.86.x (official active line)active2026-08-13
3534TouchUse PressableModern touch handlingPressable for touch interactionsTouchableOpacity for new code<Pressable onPress={} /><TouchableOpacity onPress={} />Lowhttps://reactnative.dev/docs/pressablereact-native 0.86.x (official active line)active2026-08-13
3635TouchProvide touch feedbackVisual feedback on pressRipple or opacity changeNo feedback on pressandroid_ripple={{ color: 'gray' }}No press feedbackMediumreact-native 0.86.x (official active line)active2026-08-13
3736TouchSet hitSlop for small targetsIncrease touch areahitSlop for icons and small buttonsTiny touch targetshitSlop={{ top: 10 bottom: 10 }}44x44 with no hitSlopMediumreact-native 0.86.x (official active line)active2026-08-13
3837AnimationUse ReanimatedHigh-performance animationsreact-native-reanimatedAnimated API for complexuseSharedValue useAnimatedStyleAnimated.timing for gestureMediumhttps://docs.swmansion.com/react-native-reanimated/react-native 0.86.x (official active line)active2026-08-13
3938AnimationRun on UI threadworklets for smooth animationRun animations on UI threadJS thread animationsrunOnUI(() => {})Animated on JS threadHighhttps://reactnative.dev/docs/performancereact-native 0.86.x (official active line)active2026-08-13
4039AnimationUse gesture handlerNative gesture recognitionreact-native-gesture-handlerJS-based gesture handling<GestureDetector><View onTouchMove={} />Mediumhttps://docs.swmansion.com/react-native-gesture-handler/react-native 0.86.x (official active line)active2026-08-13
4140AsyncHandle loading statesShow loading indicatorsActivityIndicator during loadEmpty screen during load{isLoading ? <ActivityIndicator /> : <Content />}No loading stateMediumreact-native 0.86.x (official active line)active2026-08-13
4241AsyncUse an error boundary for rendering failuresReact error boundaries replace a crashed subtree with fallback UICatch rendering errors at a feature boundary and provide recoveryLet a render error unmount the whole app<ErrorBoundary fallback={<ErrorView />}><Content /></ErrorBoundary>Render the feature tree with no error boundaryHighhttps://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundaryreact-native 0.86.x (official active line)active2026-08-13
4342AsyncCancel async operationsCleanup on unmountAbortController or cleanupMemory leaks from asyncuseEffect cleanupNo cleanup for subscriptionsHighhttps://reactnative.dev/docs/global-AbortControllerreact-native 0.86.x (official active line)active2026-08-13
4443AccessibilityAdd accessibility labelsDescribe UI elementsaccessibilityLabel for all interactiveMissing labelsaccessibilityLabel="Submit form"<Pressable> without labelHighhttps://reactnative.dev/docs/accessibilityreact-native 0.86.x (official active line)active2026-08-13
4544AccessibilityUse accessibility rolesSemantic meaningaccessibilityRole for elementsWrong rolesaccessibilityRole="button"No role for buttonMediumreact-native 0.86.x (official active line)active2026-08-13
4645AccessibilitySupport screen readersTest with TalkBack/VoiceOverTest with screen readersSkip accessibility testingRegular TalkBack testingNo screen reader testingHighhttps://reactnative.dev/docs/accessibility#testing-talkback-supportreact-native 0.86.x (official active line)active2026-08-13
4746TestingUse React Native Testing LibraryComponent testingrender and fireEventEnzyme or manual testingrender(<Component />)shallow(<Component />)Mediumhttps://callstack.github.io/react-native-testing-library/react-native 0.86.x (official active line)active2026-08-13
4847TestingTest on real devicesReal device behaviorTest on iOS and Android devicesSimulator onlyDevice testing in CISimulator only testingHighhttps://reactnative.dev/docs/running-on-devicereact-native 0.86.x (official active line)active2026-08-13
4948TestingUse Detox for E2EEnd-to-end testingDetox for critical flowsManual E2E testingdetox testManual testing onlyMediumhttps://wix.github.io/Detox/react-native 0.86.x (official active line)active2026-08-13
5049NativeUse native modules carefullyBridge has overheadBatch native callsFrequent bridge crossingBatch updatesCall native on every keystrokeHighhttps://reactnative.dev/docs/turbo-native-modules-introductionreact-native 0.86.x (official active line)active2026-08-13
5150NativeUse Expo when possibleSimplified developmentExpo for standard featuresBare RN for simple appsexpo install packagereact-native link packageLowhttps://docs.expo.dev/react-native 0.86.x (official active line)active2026-08-13
5251NativeHandle permissionsRequest permissions properlyCheck and request permissionsAssume permissions grantedPermissionsAndroid.request()Access without permission checkHighhttps://reactnative.dev/docs/permissionsandroidreact-native 0.86.x (official active line)active2026-08-13