mirror of
https://github.com/mmahdium/portfolio.git
synced 2026-08-15 20:52:49 +03:30
add blog to project
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
---
|
||||
title: "آشنایی با Nuxt Content"
|
||||
description: "یاد بگیرید چگونه با Nuxt Content یک وبلاگ قدرتمند بسازید که از مارکداون، هایلایت کد و کامپوننتهای Vue پشتیبانی میکند."
|
||||
date: "2024-11-09"
|
||||
tags: ["nuxt", "vue", "آموزش", "فارسی"]
|
||||
image: "/img/blog/nuxt-content-cover.jpg"
|
||||
author: "علی ارغیانی"
|
||||
draft: false
|
||||
---
|
||||
|
||||
# آشنایی با Nuxt Content
|
||||
|
||||
Nuxt Content یک سیستم مدیریت محتوای فایلمحور قدرتمند است که به شما امکان میدهد محتوای خود را به صورت Markdown، YAML، CSV یا JSON بنویسید و با یک API شبیه MongoDB آن را جستجو کنید.
|
||||
|
||||
## چرا Nuxt Content؟
|
||||
|
||||
Nuxt Content مزایای متعددی برای برنامههای محتوا-محور ارائه میدهد:
|
||||
|
||||
- **فایل-محور**: محتوا را در فایلهای Markdown با کنترل نسخه Git بنویسید
|
||||
- **Type-safe**: پشتیبانی کامل از TypeScript با تایپهای خودکار
|
||||
- **جستجوی قدرتمند**: API شبیه MongoDB برای فیلتر و مرتبسازی
|
||||
- **هایلایت کد**: هایلایت خودکار کد با Shiki
|
||||
- **سینتکس MDC**: استفاده از کامپوننتهای Vue مستقیماً در Markdown
|
||||
|
||||
## نصب
|
||||
|
||||
نصب Nuxt Content بسیار ساده است:
|
||||
|
||||
```bash
|
||||
pnpm add @nuxt/content
|
||||
```
|
||||
|
||||
سپس آن را به `nuxt.config.ts` اضافه کنید:
|
||||
|
||||
```typescript
|
||||
export default defineNuxtConfig({
|
||||
modules: ['@nuxt/content']
|
||||
})
|
||||
```
|
||||
|
||||
## ایجاد محتوا
|
||||
|
||||
یک دایرکتوری `content/` در ریشه پروژه خود ایجاد کنید و شروع به نوشتن فایلهای Markdown کنید:
|
||||
|
||||
```markdown
|
||||
---
|
||||
title: "اولین پست من"
|
||||
description: "این اولین پست وبلاگ من است"
|
||||
date: "2024-11-09"
|
||||
---
|
||||
|
||||
# سلام دنیا
|
||||
|
||||
این اولین پست من با استفاده از Nuxt Content است!
|
||||
```
|
||||
|
||||
## جستجوی محتوا
|
||||
|
||||
از composable `queryContent()` برای دریافت محتوا استفاده کنید:
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
const { data: posts } = await useAsyncData('posts', () =>
|
||||
queryContent('blog')
|
||||
.sort({ date: -1 })
|
||||
.find()
|
||||
)
|
||||
</script>
|
||||
```
|
||||
|
||||
## رندر کردن محتوا
|
||||
|
||||
از کامپوننت `ContentRenderer` برای رندر Markdown استفاده کنید:
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<ContentRenderer :value="post" />
|
||||
</template>
|
||||
```
|
||||
|
||||
## ویژگیهای پیشرفته
|
||||
|
||||
### هایلایت کد
|
||||
|
||||
Nuxt Content از Shiki برای هایلایت زیبای کد استفاده میکند:
|
||||
|
||||
```javascript
|
||||
// این کد به صورت خودکار هایلایت میشود
|
||||
const greeting = (name) => {
|
||||
console.log(`سلام، ${name}!`)
|
||||
}
|
||||
```
|
||||
|
||||
### کامپوننتهای MDC
|
||||
|
||||
میتوانید از کامپوننتهای Vue در Markdown خود استفاده کنید:
|
||||
|
||||
```markdown
|
||||
::alert{type="info"}
|
||||
این یک هشدار اطلاعاتی است!
|
||||
::
|
||||
```
|
||||
|
||||
## نتیجهگیری
|
||||
|
||||
Nuxt Content یک راه قدرتمند و انعطافپذیر برای مدیریت محتوا در برنامههای Nuxt شما فراهم میکند. با رویکرد فایل-محور، قابلیتهای جستجوی قدرتمند و یکپارچگی یکپارچه با Vue، برای وبلاگها، سایتهای مستندات و برنامههای محتوا-محور عالی است.
|
||||
|
||||
کدنویسی خوشحالی! 🚀
|
||||
@@ -0,0 +1,179 @@
|
||||
---
|
||||
title: "راهنمای Composition API در Vue 3"
|
||||
description: "آموزش کامل Composition API در Vue 3 با مثالهای کاربردی و بهترین روشهای پیادهسازی."
|
||||
date: "2024-11-07"
|
||||
tags: ["vue", "composition-api", "آموزش", "فارسی"]
|
||||
image: "/img/blog/vue-composition.jpg"
|
||||
author: "علی ارغیانی"
|
||||
draft: false
|
||||
---
|
||||
|
||||
# راهنمای Composition API در Vue 3
|
||||
|
||||
Composition API یکی از مهمترین ویژگیهای Vue 3 است که روش جدیدی برای سازماندهی و استفاده مجدد از منطق کامپوننتها ارائه میدهد.
|
||||
|
||||
## چرا Composition API؟
|
||||
|
||||
Composition API مشکلات Options API را حل میکند:
|
||||
|
||||
- **سازماندهی بهتر**: منطق مرتبط را در کنار هم نگه دارید
|
||||
- **استفاده مجدد**: composable ها را به راحتی به اشتراک بگذارید
|
||||
- **Type Safety**: پشتیبانی بهتر از TypeScript
|
||||
- **خوانایی**: کد تمیزتر و قابل فهمتر
|
||||
|
||||
## مفاهیم پایه
|
||||
|
||||
### Reactive State
|
||||
|
||||
برای ایجاد state واکنشپذیر از `ref` یا `reactive` استفاده کنید:
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { ref, reactive } from 'vue'
|
||||
|
||||
// با ref
|
||||
const count = ref(0)
|
||||
|
||||
// با reactive
|
||||
const state = reactive({
|
||||
name: 'علی',
|
||||
age: 25
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
### Computed Properties
|
||||
|
||||
برای مقادیر محاسبهشده از `computed` استفاده کنید:
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { ref, computed } from 'vue'
|
||||
|
||||
const firstName = ref('علی')
|
||||
const lastName = ref('ارغیانی')
|
||||
|
||||
const fullName = computed(() => {
|
||||
return `${firstName.value} ${lastName.value}`
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
### Watchers
|
||||
|
||||
برای نظارت بر تغییرات از `watch` یا `watchEffect` استفاده کنید:
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { ref, watch } from 'vue'
|
||||
|
||||
const count = ref(0)
|
||||
|
||||
watch(count, (newValue, oldValue) => {
|
||||
console.log(`تغییر از ${oldValue} به ${newValue}`)
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
## Composables
|
||||
|
||||
composable ها توابع قابل استفاده مجددی هستند که منطق stateful را کپسوله میکنند:
|
||||
|
||||
```typescript
|
||||
// composables/useCounter.ts
|
||||
export function useCounter(initialValue = 0) {
|
||||
const count = ref(initialValue)
|
||||
|
||||
const increment = () => {
|
||||
count.value++
|
||||
}
|
||||
|
||||
const decrement = () => {
|
||||
count.value--
|
||||
}
|
||||
|
||||
const reset = () => {
|
||||
count.value = initialValue
|
||||
}
|
||||
|
||||
return {
|
||||
count: readonly(count),
|
||||
increment,
|
||||
decrement,
|
||||
reset
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
استفاده از composable:
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
const { count, increment, decrement } = useCounter(10)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<p>شمارنده: {{ count }}</p>
|
||||
<button @click="increment">افزایش</button>
|
||||
<button @click="decrement">کاهش</button>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
## Lifecycle Hooks
|
||||
|
||||
از lifecycle hooks در `<script setup>` استفاده کنید:
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { onMounted, onUnmounted } from 'vue'
|
||||
|
||||
onMounted(() => {
|
||||
console.log('کامپوننت mount شد')
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
console.log('کامپوننت unmount شد')
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
## بهترین روشها
|
||||
|
||||
### 1. استفاده از `<script setup>`
|
||||
|
||||
این سینتکس مختصرتر و بهینهتر است:
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
// کد شما اینجا
|
||||
</script>
|
||||
```
|
||||
|
||||
### 2. سازماندهی Composables
|
||||
|
||||
composable ها را در دایرکتوری `composables/` قرار دهید:
|
||||
|
||||
```
|
||||
composables/
|
||||
├── useAuth.ts
|
||||
├── useCounter.ts
|
||||
└── useFetch.ts
|
||||
```
|
||||
|
||||
### 3. نامگذاری
|
||||
|
||||
composable ها را با `use` شروع کنید:
|
||||
|
||||
```typescript
|
||||
export function useMyFeature() {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
## نتیجهگیری
|
||||
|
||||
Composition API روش قدرتمندی برای نوشتن کامپوننتهای Vue است که کد را قابل نگهداریتر، قابل استفاده مجددتر و type-safe تر میکند.
|
||||
|
||||
با تمرین و استفاده مداوم، Composition API به بخش طبیعی از توسعه Vue شما تبدیل خواهد شد.
|
||||
Reference in New Issue
Block a user