一、开篇:站在巨人的肩膀上

在咖啡馆里敲代码的你,是否还在为Vue2选项式API的碎片化逻辑头疼?当父子组件间的数据传递变成"传纸条接龙"游戏,当项目状态管理需要跨过三座props大山时,Vue3携Composition API和Pinia翩然而至。这次我们将用做菜般的思路烹饪组件开发——把逻辑原料装进合适的"容器",让状态管理像调鸡尾酒般层次分明。


二、厨房里的魔法杖:Composition API深度解锁

2.1 为什么需要新配方

假设我们在开发一个外卖接单界面:

// 技术栈:Vue3 Composition API
import { ref, computed, onMounted } from 'vue'

export default {
  setup() {
    // 订单状态池
    const orders = ref([])
    const totalAmount = computed(() => orders.value.reduce((sum, o) => sum + o.price, 0))
    
    // 定时刷新如同咖啡机定时萃取
    let timer
    onMounted(() => {
      timer = setInterval(fetchOrders, 5000)
    })
    
    // 数据获取方法像调制酱料
    const fetchOrders = async () => {
      orders.value = await api.get('/new-orders')
    }

    // 暴露给模板的食材
    return { orders, totalAmount }
  }
}

与传统Options API相比,这里将数据、计算属性、生命周期方法整合在一个逻辑块中,就像把制作拿铁需要的咖啡粉、牛奶、拉花工具摆在了操作台上。


三、组件间的悄悄话

3.1 父子组件props传值实战

想象在开发评分组件:

<!-- 父组件:技术栈Vue3 -->
<template>
  <div class="restaurant-page">
    <!-- 像传递调料罐一样传递参数 -->
    <RatingDisplay :score="currentScore" @rate="handleRating" />
  </div>
</template>

<script setup>
import { ref } from 'vue'
import RatingDisplay from './RatingDisplay.vue'

const currentScore = ref(4.5)

// 接收来自子组件的调味料
const handleRating = (newScore) => {
  currentScore.value = newScore
}
</script>

<!-- 子组件RatingDisplay.vue -->
<template>
  <div class="rating-stars">
    <span 
      v-for="i in 5" 
      :key="i"
      @click="selectStar(i)"
      :class="{ active: i <= selectedStars }"
    >★</span>
  </div>
</template>

<script setup>
import { defineProps, defineEmits } from 'vue'

const props = defineProps({
  score: {
    type: Number,
    default: 0
  }
})

const emit = defineEmits(['rate'])

const selectedStars = ref(Math.round(props.score))

const selectStar = (num) => {
  selectedStars.value = num
  // 像摇铃叫服务员一样触发事件
  emit('rate', num)
}
</script>

3.2 跨层级组件通信的鸡尾酒疗法

在开发多层级表单时:

// 技术栈:Vue3 provide/inject
// 祖先组件
import { provide, ref } from 'vue'

export default {
  setup() {
    const formData = ref({})
    
    // 像在后厨放置公用调料台
    provide('formContext', {
      data: formData,
      update: (field, value) => {
        formData.value[field] = value
      }
    })
  }
}

// 深层子组件
import { inject } from 'vue'

export default {
  setup() {
    // 像取用公共调料
    const formContext = inject('formContext')
    
    const updateName = (name) => {
      formContext.update('username', name)
    }
    
    return { updateName }
  }
}

四、状态管理的保险柜:Pinia深度探索

4.1 用户信息存储库设计

// 技术栈:Pinia + Vue3
// stores/user.js
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    profile: null,
    permissions: []
  }),
  actions: {
    // 像咖啡师调配特饮
    async fetchUserProfile() {
      const res = await api.get('/user/info')
      this.profile = res.data
    },
    grantPermission(permission) {
      this.permissions.push(permission)
    }
  },
  getters: {
    // 像计算咖啡因含量
    isAdmin: (state) => state.permissions.includes('ADMIN')
  }
})

4.2 在组件中享用法式大餐

<script setup>
import { useUserStore } from '@/stores/user'
import { storeToRefs } from 'pinia'

const userStore = useUserStore()
// 解构保持响应式,像分开装盘的食材
const { profile, isAdmin } = storeToRefs(userStore)

// 点击事件触发action
const handleLogin = async () => {
  await userStore.fetchUserProfile()
}
</script>

五、实战场景与选型决策

5.1 典型应用场景

  • SaaS后台系统:权限管理模块使用Pinia集中存储用户权限状态
  • 电商购物车:跨组件同步选中状态时采用provide/inject
  • 数据看板:多个图表组件共享筛选条件时使用事件总线

5.2 技术组合的阴阳平衡

优势对比表:

技术方案 响应速度 可维护性 学习成本
Options API ★★★★ ★★
Composition API ★★★ ★★★★ ★★★
Pinia ★★★★ ★★★★ ★★

常见决策误区:

  1. 在简单组件中过度设计响应式结构
  2. 将本应组件内部维护的状态提升到全局store
  3. 滥用事件总线导致事件流难以追踪

六、厨艺精进的秘诀:开发中的最佳实践

  1. 模块拆分哲学:就像处理食材,将组合式函数按业务场景切割
// 使用Composition API重构登录逻辑
export function useAuth() {
  const user = ref(null)
  
  const login = async (creds) => {
    user.value = await authService.login(creds)
  }
  
  return { user, login }
}
  1. Store设计原则:参考Redux三大原则,确保单一数据源
  2. TypeScript加持:像给咖啡杯标注容量刻度
interface UserProfile {
  id: string
  name: string
  avatar: string
}

const userStore = defineStore('user', {
  state: (): { profile: UserProfile | null } => ({
    profile: null
  })
})

七、结语:新时代的组件交响曲

当Composition API成为乐谱上的五线谱,组件通信像是不同乐器的对话,Pinia则是指挥家手中的指挥棒——这三位一体共同谱写着现代前端开发的协奏曲。记住,技术选型就像选择烹饪手法,最适合食材的才是最好的,或许明天又会有新的"厨具"诞生,但掌握底层逻辑才是永恒的"米其林秘籍"。