前端状态管理到底需不需要:从 props 传递到 Pinia

举报
yd_233495430 发表于 2026/09/07 14:34:31 2026/09/07
【摘要】 状态管理常被当成"前端必修课",但小项目硬上反而更乱。聊聊 props 传递的痛点、什么时候该引入 Store(以 Vue 的 Pinia 为例)、以及哪些数据根本不值得进全局状态。

前端新手比较容易走的极端的,要么所有数据都塞进全局 Store,要么死活不用、层层 props 传到手软。状态管理不是炫技,是用来解决"数据在哪、谁改它"的问题。这篇聊聊什么时候该用、什么时候纯属添乱。

一、props 传递的痛点在哪

组件层级浅时,父传子 props 最直观。但一旦层级深了,中间组件只是"过路"也要声明一遍 props,改个字段全线联动——这叫 prop 透传地狱:

<!-- 父 → 子 → 孙,中间层纯粹在传话 -->
<Child :user="user" />
<!-- Child 里又要 <GrandChild :user="user" /> -->

这时候把 user 放进 Store,谁要用谁直接拿,中间层就解脱了。

二、Pinia:Vue 生态的官方答案

Vue 项目里,Pinia 是现在的标准。定义一个 store 很简单:

// stores/user.js
import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({ name: '', token: '' }),
  actions: {
    login(name) { this.name = name; },
  },
});

组件里直接用,不用一层层传:

<script setup>
import { useUserStore } from '@/stores/user';
const user = useUserStore();
user.login('张三'); // 任意组件改,全局生效
</script>

三、但别什么都往里塞

数据类型 该放哪
用户登录态、主题、跨页共享 全局 Store ✓
某个表单的临时输入 组件局部 state ✓
只给子组件用的配置 props 传就好
接口请求来的列表数据 看是否多页共用,否则局部

最典型的反面教材:把一个"只在当前弹窗里用"的开关也塞进全局,结果全局状态里一堆没人记得干嘛的字段。

小结

判断要不要用状态管理,就看一句话:这个数据是不是多个不相邻的组件都要用、且会被改。是,就用 Store;只是在父子之间传,props 就够了。Pinia 这类工具是解药,不是万金油——小项目克制一点,反而更清爽。等组件真的多到传不动了,再引入也不迟。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。