@rneui/themed, native-base, react-native-elements, and react-native-paper are popular component libraries designed to accelerate React Native development by providing pre-built, customizable UI elements.
react-native-paper strictly adheres to Google's Material Design guidelines, offering a consistent, opinionated look and feel out of the box with strong TypeScript support.
native-base (specifically version 3+) utilizes a utility-first styling approach similar to Tailwind CSS, allowing for rapid prototyping and highly flexible layouts without writing separate style objects.
@rneui/themed represents the modern, maintained fork of the original react-native-elements library, offering a classic set of generic components that are easy to theme but require more manual configuration for complex layouts compared to utility-based systems.
The original react-native-elements package is currently deprecated and should be avoided in favor of its successor, @rneui/themed.
Choosing a UI library in React Native is not just about picking pretty components; it is an architectural decision that affects your styling strategy, theming capabilities, and long-term maintenance. The four packages in question—@rneui/themed, native-base, react-native-elements, and react-native-paper—take fundamentally different approaches to solving the same problem. Let's break down how they handle styling, theming, and component implementation.
Before diving into code, we must address the elephant in the room. The original react-native-elements package is deprecated. The maintainers have officially stopped development on it.
react-native-elements (Deprecated)
@rneui/themed.The community fork, @rneui/themed, is the active successor. It preserves the API familiarity while fixing bugs and adding modern React Native features. If you see tutorials referencing react-native-elements directly, treat them as legacy documentation.
The biggest architectural difference lies in how these libraries expect you to style their components.
native-base: The Utility-First Approachnative-base (v3+) adopts a strategy similar to Tailwind CSS. You pass styling props directly to the component. This reduces the need for StyleSheet.create blocks and keeps layout logic close to the markup.
// native-base: Utility props for styling
import { Box, Text } from 'native-base';
export default function Card() {
return (
<Box
bg="blue.500"
p="4"
rounded="lg"
shadow={3}
alignItems="center"
>
<Text color="white" fontWeight="bold">
Utility Styled Card
</Text>
</Box>
);
}
react-native-paper: The Design System Approachreact-native-paper enforces Material Design. Styling is often done via the style prop for layout tweaks, but the core look (elevation, ripple effects, typography) is baked in and controlled via a global Theme provider. You rarely fight the component's internal styles.
// react-native-paper: Theme-driven styling
import { Card, Text, MD3Colors } from 'react-native-paper';
export default function MaterialCard() {
return (
<Card
mode="elevated"
style={{ margin: 16, backgroundColor: '#f0f0f0' }}
>
<Card.Content>
<Text variant="titleLarge">Material Design Card</Text>
<Text variant="bodyMedium">Consistent elevation and ripples.</Text>
</Card.Content>
</Card>
);
}
@rneui/themed: The Classic Style Prop Approach@rneui/themed follows the traditional React Native pattern. You pass a style prop for layout and use specific component props for variant changes (like type on buttons). It feels very familiar to developers coming from vanilla React Native.
// @rneui/themed: Standard style props
import { Card, Text } from '@rneui/themed';
export default function RNECard() {
return (
<Card containerStyle={{ padding: 0, margin: 16 }}>
<Card.Title>Classic Styled Card</Card.Title>
<Card.Divider />
<Card.Image source={{ uri: 'https://example.com/image.png' }} />
<Text style={{ margin: 10 }}>Flexible but manual styling.</Text>
</Card>
);
}
How you manage dark mode and brand colors differs significantly across these libraries.
react-native-paper: Robust Global ThemingThis library shines in theming. You define a theme object once, and it cascades to every component. It handles dark mode switching automatically based on system settings or manual toggles.
// react-native-paper: Global Theme Provider
import { MD3LightTheme, Provider as PaperProvider } from 'react-native-paper';
const theme = {
...MD3LightTheme,
colors: {
...MD3LightTheme.colors,
primary: '#6200ee',
accent: '#03dac6',
},
};
export default function App() {
return (
<PaperProvider theme={theme}>
{/* All buttons/cards automatically use these colors */}
<MyScreen />
</PaperProvider>
);
}
native-base: Configuration Objectnative-base uses a NativeBaseProvider with a config object. You can extend the default theme to add custom colors, fonts, and spacing scales. It uses a token system (e.g., colors.blue.500).
// native-base: Extending the Theme
import { NativeBaseProvider, extendTheme } from 'native-base';
const config = {
colors: {
brand: {
500: '#ff0000',
},
},
};
const theme = extendTheme({ config });
export default function App() {
return (
<NativeBaseProvider theme={theme}>
<MyScreen />
</NativeBaseProvider>
);
}
@rneui/themed: Custom Theme Hook@rneui/themed provides a createTheme utility. It is simpler than the others but effective for swapping color palettes. You wrap your app in a ThemeProvider.
// @rneui/themed: Simple Theme Creation
import { ThemeProvider, createTheme } from '@rneui/themed';
const theme = createTheme({
lightColors: {
primary: '#0000ff',
},
darkColors: {
primary: '#ccccff',
},
mode: 'light',
});
export default function App() {
return (
<ThemeProvider theme={theme}>
<MyScreen />
</ThemeProvider>
);
}
Let's look at how a common pattern—a form with a button—is implemented in each.
native-base: Concise and FlexibleThe utility props make building forms very fast. You don't need to create separate styles for input borders or button padding.
// native-base: Form Example
import { Input, Button, VStack } from 'native-base';
export default function LoginForm() {
return (
<VStack space={4} w="90%" mx="auto">
<Input
placeholder="Email"
borderColor="gray.300"
_focus={{ borderColor: 'blue.500' }}
/>
<Button
bg="blue.500"
_text={{ color: 'white', fontWeight: 'bold' }}
onPress={() => console.log('Login')}
>
Sign In
</Button>
</VStack>
);
}
react-native-paper: Accessible and StructuredComponents here are more rigid but offer better accessibility defaults (like ripple effects and focus states) without extra code.
// react-native-paper: Form Example
import { TextInput, Button } from 'react-native-paper';
export default function LoginForm() {
const [email, setEmail] = React.useState('');
return (
<>
<TextInput
label="Email"
value={email}
onChangeText={setEmail}
mode="outlined"
style={{ margin: 16 }}
/>
<Button
mode="contained"
onPress={() => console.log('Login')}
style={{ margin: 16 }}
>
Sign In
</Button>
</>
);
}
@rneui/themed: Explicit and ModularYou often need to compose components manually. The Input and Button are distinct and require explicit styling for layout alignment.
// @rneui/themed: Form Example
import { Input, Button } from '@rneui/themed';
export default function LoginForm() {
return (
<>
<Input
placeholder="Email"
containerStyle={{ marginBottom: 16 }}
inputStyle={{ padding: 10 }}
/>
<Button
title="Sign In"
buttonStyle={{ backgroundColor: '#0000ff', padding: 15 }}
onPress={() => console.log('Login')}
/>
</>
);
}
| Feature | @rneui/themed | native-base | react-native-paper | react-native-elements |
|---|---|---|---|---|
| Maintenance | ✅ Active | ✅ Active | ✅ Active | ❌ Deprecated |
| Styling Style | Standard Props | Utility-First (Tailwind-like) | Material Design System | Standard Props |
| Learning Curve | Low | Medium (New syntax) | Low (if you know Material) | Low (Legacy) |
| Customization | High (Manual) | Very High (Utility) | Medium (Theme overrides) | High (Manual) |
| Accessibility | Good | Good | Excellent | Fair |
| Best For | Legacy migration, simple apps | Rapid prototyping, custom designs | Enterprise, Material Design apps | None (Migrate away) |
If you are starting a new enterprise application and your designers are okay with Material Design (or can adapt to it), react-native-paper is the safest bet. Its commitment to accessibility and strict typing reduces long-term technical debt.
If your design team demands highly custom, unique interfaces and your developers enjoy the speed of utility classes, native-base will significantly boost development velocity. Just keep an eye on performance in data-heavy lists.
If you are maintaining an older codebase using react-native-elements, your immediate task is to refactor imports to @rneui/themed. Do not write new code with the old package.
Ultimately, the "best" library is the one that aligns with your design system constraints and your team's willingness to manage custom styles versus adopting an opinionated framework.
Choose @rneui/themed if you are migrating from the legacy react-native-elements or need a lightweight library of standard components (Buttons, Inputs, Cards) without a strict design system. It is ideal for projects requiring a custom brand identity where you want to build your own layout logic rather than relying on a grid or utility system. Avoid this if you need advanced accessibility features or a comprehensive set of complex components like date pickers or advanced lists out of the box.
Choose native-base if your team prefers a utility-first styling workflow (similar to Tailwind CSS) and values rapid prototyping speed. It is excellent for applications where design requirements change frequently, as you can modify layouts directly in the JSX props without managing separate style sheets. However, be aware that heavy reliance on its styling engine can introduce runtime performance overhead in very large lists compared to pure native styles.
Do NOT choose react-native-elements for any new project. This package has been officially deprecated and is no longer maintained, meaning it receives no security patches, bug fixes, or compatibility updates for newer React Native versions. Existing projects using this library should plan an immediate migration to @rneui/themed to ensure long-term stability and support.
Choose react-native-paper if your application follows Material Design guidelines or if you need a robust, production-ready component set with excellent accessibility and TypeScript support out of the box. It is the best choice for enterprise applications where consistency, theming capabilities, and adherence to platform standards (Android/iOS) are critical. Be prepared to override default styles if your design team requires a highly unique look that deviates significantly from Material Design.
Cross Platform React Native UI Toolkit

npm install @rneui/themed
Follow these instructions to install React Native Elements!
Start using the components or try it on Snack here.
import { Button } from '@rneui/themed';
<Button />;
As a cross platform UI Toolkit, you can now use RNE on the web & share your codebase between your React Native + React web apps. RNE components are rendered perfectly on browser. You can achieve this to target iOS, Android and Web by collaborating RNE and React Native for Web.
Click here for a full walkthrough using React Native Elements + React Native Web.
Checkout the official React Native Elements App on Expo which uses all of the React Native Elements components.
If you are looking to contribute to the React Native Elements App, click here to view the implementation & run the RNE expo app locally.
Install the React Native Elements VS Code Extension to speed up development.
Interested in contributing to this repo? Check out our Contributing Guide and submit a PR for a new feature/bug fix.
A big shoutout to all our contributors! You could be here too!
We encourage everyone to contribute & submit PR's especially first-time
contributors. Look for the label Good First Issue on the issues. Click
here
to see them.
If there is something you's like to see or request a new feature, please submit an issue or a pull request.
We are currently looking for new core contributors that can help lead this project.
In case you have any other question or would like to come say Hi! to the RNE community, join our Discord Server. See you on the other side! 👋😃
Become a backer and show your support for React Native Elements.
Do you use React Native Elements in production? If so, consider supporting this project as it will allow the maintainers to dedicate more time to maintaining this project and also building new features for everyone. Also, your app or company's logo will show on GitHub and link to your website - who doesn't want a little extra exposure? Here's the info.