⏱️3 min read · 644 words
कंपोज़िशन एपीआई, पिनिया राज्य प्रबंधन और फुल-स्टैक के लिए Nuxt.js के साथ Vue 3 – उत्कृष्ट डेवलपर अनुभव के साथ Vue 2026 में दूसरा सबसे लोकप्रिय जावास्क्रिप्ट फ्रेमवर्क है। यह संपूर्ण मार्गदर्शिका Vue 3 की संरचना API, प्रतिक्रियाशीलता प्रणाली और उत्पादन पैटर्न को कवर करती है।
📋 Table of Contents
स्थापित करना
# Create new project
npm create vue@latest my-app
# Choose: TypeScript, Vue Router, Pinia, ESLint, Prettier
cd my-app && npm install && npm run dev
रचना एपीआई
<!-- Counter.vue — script setup syntax (preferred) -->
<script setup lang="ts">
import { ref, computed, watch, onMounted } from 'vue';
// ref — reactive primitive
const count = ref(0);
const name = ref('World');
// computed — derived state (cached)
const doubled = computed(() => count.value * 2);
const greeting = computed(() => `Hello, ${name.value}! Count: ${count.value}`);
// watch — side effects
watch(count, (newVal, oldVal) => {
console.log(`Count changed: ${oldVal} → ${newVal}`);
document.title = `Count: ${newVal}`;
});
// watchEffect — auto-tracks dependencies
watchEffect(() => {
localStorage.setItem('count', count.value.toString());
});
// Lifecycle hooks
onMounted(() => {
console.log('Component mounted!');
count.value = parseInt(localStorage.getItem('count') || '0');
});
function increment() {
count.value++;
}
function reset() {
count.value = 0;
}
</script>
<template>
<div class="counter">
<h2>{{ greeting }}</h2>
<p>Doubled: {{ doubled }}</p>
<!-- v-model works with refs automatically -->
<input v-model="name" placeholder="Your name" />
<div>
<button @click="increment">+1</button>
<button @click="reset">Reset</button>
</div>
</div>
</template>
प्रतिक्रियाशील वस्तुओं के साथ प्रतिक्रियाशील()
<script setup lang="ts">
import { reactive, toRefs } from 'vue';
// reactive — for objects (no .value needed)
const state = reactive({
count: 0,
name: 'Alice',
todos: [] as string[],
});
// Destructure with toRefs (maintains reactivity)
const { count, name } = toRefs(state);
// Mutate directly
function addTodo(text: string) {
state.todos.push(text);
}
</script>
घटक और सहारा
<!-- UserCard.vue -->
<script setup lang="ts">
interface Props {
user: {
id: number;
name: string;
email: string;
avatarUrl?: string;
};
isSelected?: boolean;
}
const props = withDefaults(defineProps<Props>(), {
isSelected: false,
});
const emit = defineEmits<{
select: [userId: number];
delete: [userId: number];
}>();
function handleSelect() {
emit('select', props.user.id);
}
</script>
<template>
<div
class="user-card"
:class="{ 'user-card--selected': isSelected }"
@click="handleSelect"
>
<img
v-if="user.avatarUrl"
:src="user.avatarUrl"
:alt="user.name"
/>
<div>
<h3>{{ user.name }}</h3>
<p>{{ user.email }}</p>
</div>
<button @click.stop="emit('delete', user.id)">Delete</button>
</div>
</template>
कंपोज़ेबल्स – कस्टम हुक
// composables/useUsers.ts
import { ref, computed } from 'vue';
interface User { id: number; name: string; email: string; }
export function useUsers() {
const users = ref<User[]>([]);
const loading = ref(false);
const error = ref<string | null>(null);
const searchQuery = ref('');
const filteredUsers = computed(() =>
users.value.filter(u =>
u.name.toLowerCase().includes(searchQuery.value.toLowerCase())
)
);
async function fetchUsers() {
loading.value = true;
error.value = null;
try {
const response = await fetch('/api/users');
users.value = await response.json();
} catch (e) {
error.value = 'Failed to load users';
} finally {
loading.value = false;
}
}
async function createUser(data: Omit<User, 'id'>) {
const response = await fetch('/api/users', {
method: 'POST',
body: JSON.stringify(data),
headers: { 'Content-Type': 'application/json' },
});
const newUser = await response.json();
users.value = [...users.value, newUser];
}
return { users, loading, error, searchQuery, filteredUsers, fetchUsers, createUser };
}
// Usage in component
const { users, loading, error, searchQuery, filteredUsers, fetchUsers } = useUsers();
onMounted(fetchUsers);
पिनिया राज्य प्रबंधन
// stores/userStore.ts
import { defineStore } from 'pinia';
export const useUserStore = defineStore('users', {
state: () => ({
users: [] as User[],
currentUser: null as User | null,
loading: false,
}),
getters: {
activeUsers: (state) => state.users.filter(u => u.active),
userCount: (state) => state.users.length,
},
actions: {
async fetchUsers() {
this.loading = true;
try {
this.users = await api.getUsers();
} finally {
this.loading = false;
}
},
async createUser(data: CreateUserInput) {
const user = await api.createUser(data);
this.users.push(user);
return user;
},
logout() {
this.currentUser = null;
}
}
});
// In component
import { useUserStore } from '@/stores/userStore';
const store = useUserStore();
await store.fetchUsers();
console.log(store.userCount);
store.logout();
Vue बनाम प्रतिक्रिया: Vue कब चुनें
- Vue कब चुनें: सरल सीखने की अवस्था की आवश्यकता, टेम्पलेट-प्रथम दृष्टिकोण को प्राथमिकता, छोटी टीम, jQuery/वेनिला JS से क्रमिक प्रवासन
- कब प्रतिक्रिया करें चुनें: बड़ी टीम, जटिल राज्य प्रबंधन की आवश्यकता, नेक्स्ट.जेएस इकोसिस्टम, मोबाइल के लिए रिएक्ट नेटिव
- दोनों उत्कृष्ट हैंअधिकांश वेब ऐप्स के लिए – चुनाव अक्सर टीम की जानकारी पर निर्भर करता है
स्क्रिप्ट सेटअप, कंपोज़िशन एपीआई और पिनिया के साथ 2026 में Vue 3 एक परिपक्व, डेवलपर-अनुकूल फ्रेमवर्क है। कई डेवलपर्स के लिए टेम्प्लेट सिंटैक्स JSX की तुलना में अधिक सुलभ है, और कंपोज़िशन एपीआई जटिल घटकों के लिए पूरी शक्ति देता है। फुल-स्टैक के लिए, रिएक्ट के लिए Next.js के समान उत्पादकता लाभ के लिए Nuxt.js के साथ जोड़ी बनाएं।
🔗 Share this article
✍️ Leave a Comment