react, vue, and angular are core frameworks that manage application structure, state, and rendering logic. @tamagui/core is a universal UI kit and styling engine that typically runs on top of React to share components between web and native. While the first three define how you build an app, Tamagui defines how you style and share UI elements within the React ecosystem. Understanding this layer difference is critical for making the right stack decision.
When architecting a modern web application, you need to decide on a core framework for logic and rendering, and potentially a UI system for styling and components. react, vue, and angular serve as the foundation for your application structure. @tamagui/core operates differently β it is a UI kit that sits on top of React to unify styling across web and native. Let's compare how they handle common engineering tasks.
react uses JSX, which lets you write HTML-like syntax directly in JavaScript.
// react: Functional Component
function Button({ label }) {
return <button className="btn">{label}</button>;
}
vue uses a single-file component structure with distinct sections.
<script setup> for concise logic in modern versions.<!-- vue: Single File Component -->
<template>
<button class="btn">{{ label }}</button>
</template>
<script setup>
defineProps(['label']);
</script>
angular uses decorators to define components with metadata.
// angular: Component Decorator
@Component({
selector: 'app-button',
template: `<button class="btn">{{ label }}</button>`
})
export class ButtonComponent {
@Input() label: string;
}
@tamagui/core extends React components with styled primitives.
Button or View that accept style props.// tamagui: Styled Component
import { Button } from '@tamagui/core';
function MyButton({ label }) {
return <Button backgroundColor="$blue">{label}</Button>;
}
react has no built-in styling solution.
// react: CSS Modules
import styles from './Button.module.css';
function Button() {
return <button className={styles.btn}>Click</button>;
}
vue supports scoped CSS out of the box.
<!-- vue: Scoped Styles -->
<style scoped>
.btn { background: blue; }
</style>
angular uses view encapsulation to scope styles.
// angular: Encapsulation
@Component({
styles: ['.btn { background: blue; }'],
encapsulation: ViewEncapsulation.Emulated
})
@tamagui/core uses a compiler to turn style props into atomic CSS.
padding={10}).// tamagui: Style Props
import { View } from '@tamagui/core';
<View padding={10} backgroundColor="red" />
react uses hooks like useState to trigger re-renders.
// react: State Hook
const [count, setCount] = useState(0);
<button onClick={() => setCount(count + 1)}>{count}</button>
vue uses a reactive proxy system with ref or reactive.
<!-- vue: Reactive Ref -->
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>
<template>
<button @click="count++">{{ count }}</button>
</template>
angular recently introduced Signals for fine-grained reactivity.
// angular: Signals
count = signal(0);
increment() { this.count.update(c => c + 1); }
@tamagui/core relies on React's state system underneath.
// tamagui: State Driven Styles
const [active, setActive] = useState(false);
<Button backgroundColor={active ? '$blue' : '$gray'} />
react can share logic with React Native but not UI components directly.
// react: Web Specific
<div className="web-only">Content</div>
vue is primarily focused on web applications.
<!-- vue: Web Focus -->
<template>
<div>Web Content</div>
</template>
angular supports web and mobile via Ionic or NativeScript.
// angular: Mobile via Wrapper
@Component({ template: `<ion-button>Click</ion-button>` })
@tamagui/core is built specifically for universal code sharing.
// tamagui: Universal Component
import { YStack } from '@tamagui/core';
// Works on Web and Native without changes
<YStack padding={10} />
Despite their differences, these tools share common goals and patterns.
// All: Reusable Component Concept
function Card({ children }) { return <div>{children}</div>; }
angular, react, vue, and tamagui all support TypeScript.// All: Typing Props
interface Props { label: string; }
// React: Memo
React.memo(Component);
// Vue: Computed
const double = computed(() => count.value * 2);
// All: Community Packages
// react: react-router, redux
// vue: vue-router, pinia
// angular: @angular/router, ngrx
// tamagui: @tamagui/lucide-icons
| Feature | Shared by All |
|---|---|
| Architecture | π§± Component-based |
| Language | π οΈ TypeScript support |
| Performance | π Optimization tools |
| Community | π Large ecosystems |
| Goal | π― Build maintainable UIs |
| Feature | react | vue | angular | @tamagui/core |
|---|---|---|---|---|
| Type | ποΈ UI Library | ποΈ Framework | ποΈ Full Platform | π¨ UI Kit (for React) |
| Styling | π Choose your own | π― Scoped CSS | π― Encapsulated CSS | β‘ Compiled Style Props |
| Learning Curve | π Moderate | π Gentle | π Steep | π Moderate (requires React) |
| Native Support | π± React Native | π Web Focused | π± Via Ionic/NativeScript | π± Universal (Web + Native) |
| State Management | π Hooks / External | π Reactivity API | π Signals / Services | π Uses React State |
react is the flexible choice π§© β best when you want to assemble your own stack and need native mobile support. Ideal for startups and products scaling across platforms.
vue is the balanced choice βοΈ β best when you want structure without heavy configuration. Ideal for teams wanting fast development with clear conventions.
angular is the enterprise choice π’ β best when you need a complete solution with strict typing and built-in tools. Ideal for large organizations with long-term maintenance needs.
@tamagui/core is the unification choice π β best when you use React and want to share UI code between web and mobile without duplication. It is not a framework replacement but a powerful layer on top of React.
Final Thought: Select angular, react, or vue based on your application's core needs. If you choose React and need cross-platform UI consistency, add @tamagui/core to your stack.
Choose @tamagui/core if you are already using React and need to share UI components between web and native mobile apps. It provides a unified styling system that compiles to efficient CSS and works across platforms. Note that it is not a standalone framework and requires React to function.
Choose angular if you need a complete platform with built-in routing, HTTP client, and dependency injection. It is ideal for large enterprise teams that benefit from strict structure and TypeScript enforcement. The framework handles most architectural decisions for you.
Choose react if you want maximum flexibility and access to the largest ecosystem of third-party libraries. It works well for projects that may need to extend into native mobile development using React Native. You will need to select your own routing and state management tools.
Choose vue if you want a progressive framework that is easy to learn but scales well for complex applications. It offers a balanced approach between structure and flexibility with built-in state management. The documentation is comprehensive and the learning curve is gentle.
Note: most of this logic moved into @tamagui/web
core is a superset of web, it just adds in some react-native props support.