🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

Vue 3 সম্পূর্ণ নির্দেশিকা 2026: রচনা API, Pinia এবং Nuxt.js

⏱️3 min read  ·  650 words

কম্পোজিশন API, পিনিয়া স্টেট ম্যানেজমেন্ট, এবং ফুল-স্ট্যাকের জন্য Nuxt.js সহ Vue 3 – একটি চমৎকার বিকাশকারী অভিজ্ঞতা সহ Vue হল 2026 সালে দ্বিতীয় সর্বাধিক জনপ্রিয় জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক। এই সম্পূর্ণ গাইড Vue 3 এর কম্পোজিশন এপিআই, রিঅ্যাকটিভিটি সিস্টেম এবং প্রোডাকশন প্যাটার্ন কভার করে।

সেটআপ

# Create new project
npm create vue@latest my-app

# Choose: TypeScript, Vue Router, Pinia, ESLint, Prettier
cd my-app && npm install && npm run dev

রচনা API

<!-- 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/Vanilla JS থেকে ধীরে ধীরে স্থানান্তর
  • যখন প্রতিক্রিয়া চয়ন করুন: বড় দল, জটিল রাষ্ট্রীয় ব্যবস্থাপনা প্রয়োজন, Next.js ইকোসিস্টেম, মোবাইলের জন্য নেটিভ প্রতিক্রিয়া
  • দুটোই চমৎকারবেশিরভাগ ওয়েব অ্যাপের জন্য – পছন্দটি প্রায়শই দলের পরিচিতিতে নেমে আসে

স্ক্রিপ্ট সেটআপ, কম্পোজিশন API এবং পিনিয়া সহ 2026 সালে Vue 3 হল একটি পরিপক্ক, বিকাশকারী-বান্ধব ফ্রেমওয়ার্ক। অনেক ডেভেলপারদের জন্য টেমপ্লেট সিনট্যাক্স JSX এর চেয়ে বেশি সহজলভ্য, এবং কম্পোজিশন API জটিল উপাদানগুলির জন্য সম্পূর্ণ শক্তি দেয়। ফুল-স্ট্যাকের জন্য, প্রতিক্রিয়ার জন্য Next.js-এর মতো একই উত্পাদনশীলতা লাভের জন্য Nuxt.js-এর সাথে যুক্ত করুন।

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা