Vue Router 与 Pinia 新手指南

作者:c_chun 发布时间: 2025-10-23 阅读量:7 评论数:0

正在阅读这篇文章的开发者,很可能已经掌握了 Vue 的组件基础。也许已经试着在 App.vue 里塞进了好几个组件,比如一个 ProductList(商品列表)和一个 ShoppingCart(购物车)。

然后,很快就会发现两个棘手的问题:

  1. App.vue 变得臃肿不堪。开发者希望 ProductListShoppingCart 能成为两个独立的页面,有各自的 URL(比如 /products/cart),而不是挤在一起。

  2. 如果它们分开了,那当在 ProductList 页面点击“购买”时,远在另一个页面的 ShoppingCart如何共享数据(比如 cartItems 数组)呢?

如果正为此苦恼,那么恭喜,已经来到了 Vue 进阶的门前。这两个问题的答案,就是 Vue 生态系统的两大“神器”:Vue Router (路由)Pinia (状态管理)

本文将用一个“盖房子”的比喻来彻底搞懂它们。

一、最初的“大开间” (App.vue)

刚开始学 Vue 时,App.vue 就像一个**“大开间”**(Studio)。

  • 布局:客厅(ProductList)和储藏室(ShoppingCart)都在这一个大房间里。

  • 数据:所有的数据(productscartItems)也都堆在这个房间的角落里(App.vue<script setup> 中)。

  • 逻辑:所有的方法(handleAddToCart 等)也都在这个房间里进行。

这住一两个人还行,但如果房子变大了(应用变复杂了),就会乱成一团。是时候升级了!

二、Vue Router:“建筑师”

Vue Router 的作用就像一个建筑师。它会帮助开发者把“大开间”改造成了“多卧公寓”。

它会建起墙,隔出两个独立的房间(我们称之为“视图”或 Views):

  1. src/views/ProductsView.vue (商品卧室)

  2. src/views/CartView.vue (购物车书房)

有了 Vue Router 之后,App.vue 的角色也变了。它不再是房间本身,而是变成了**“大堂”和“走廊”**。

让我们看看“大堂” (App.vue) 里的关键设施:

  • <RouterLink to="..."> (导航链接)

    • 这就是大堂里的**“门”**。

    • <RouterLink to="/"> 是一扇通往“商品卧室”的门。

    • <RouterLink to="/cart"> 是一扇通往“购物车书房”的门。

    • 当点击它时,Vue Router 会立刻帮忙切换浏览器地址栏的 URL,但不会刷新整个网页

  • <RouterView> (占位符)

    • 这就是大堂里用来展示房间内部景色的**“观景窗”**。

    • Vue Router 会检查当前 URL,然后把对应的“房间” (ProductsViewCartView) 自动渲染到这个窗口里。

  • src/router/index.js (房屋蓝图)

    • 开发者需要创建一个这样的文件,它就是“房屋蓝图”或“房产证”。

    • 它明确规定了哪条路径(path: '/cart')对应哪个房间(component: CartView)。

总结一下:Vue Router 负责“页面导航”,它根据 URL 来决定显示哪个“房间”(View)。

三、Pinia:“中央储物间”

好了,现在有了两个独立的房间。但新问题来了:

当在“商品卧室” (ProductsView) 里点击“加入购物车”时,远在另一个房间的“购物车书房” (CartView) 怎么知道数据变化了呢?

这就是 Pinia 登场的原因。Pinia 扮演的角色是**“中央储物间”**。

Pinia 的设计思想是:“别把数据(cartItems)堆在各自的房间里了,全都放到这个公共的、带锁的中央储物间(我们称之为 Store)里来!”

这就是需要创建的 src/stores/cartStore.js 文件:

  • defineStore('cart', ...)

    • 这就是在“注册”这个储物间,并给它挂上一个独一无二的门牌号:“cart”。

  • state (数据)

    • 就是储物间里的“架子”。我们把 cartItemsproducts 都放在这里(在 Setup Store 语法中,它们就是 ref)。

  • getters (计算属性)

    • 是储物间里“自动打包”的服务。不需要开发者自己算总价,totalPrice 会自动根据 cartItems 算好。

  • actions (方法)

    • 是储物间里“唯一的操作台”。开发者不能随手修改架子上的东西,必须调用 handleAddToCart 这样的“标准操作”来存取物品。这保证了数据的安全和可控。

它们是如何协同工作的?

现在,流程变得非常清晰:

  1. 商品页 (ProductsView.vue)

    • 它导入 useCartStore() 并拿到“储物间钥匙”。

    • 当用户点击购买时,它调用 cartStore.handleAddToCart(productId)

    • 不关心数据具体是怎么修改的,它只管“通知储物间”。

  2. 购物车页 (CartView.vue)

    • 它也导入 useCartStore() 并拿到同一把“储物间钥匙”。

    • 它直接从储物间读取 cartStore.cartItemscartStore.totalPrice 并展示出来。

    • 由于数据是响应式的,当“商品页”通过 Pinia 改变了数据,“购物车页”上显示的内容会自动更新

结语:“专业公寓”

现在,开发者就拥有了一个真正的“专业公寓”:

  • App.vue大堂(负责导航)。

  • Vue Router建筑师(负责管理房间和走廊)。

  • Pinia中央储物间(负责管理所有房间共享的数据)。

这就是所有大型 Vue 应用的标准形态。现在已经知道该如何告别那个“大杂烩” App.vue 了。值得动手试试看!

评论