Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用 Vue3 就该有不用 pinia 的自信

用 Vue3 就该有不用 pinia 的自信

作者头像
用户6901603
发布于 2024-07-25 08:12:53
发布于 2024-07-25 08:12:53
20600
代码可运行
举报
文章被收录于专栏:不知非攻不知非攻
运行总次数:0
代码可运行

首先说一下观点。

不管是用 React,还是用 Vue3,实际上大多数项目完全都可以不用全局状态管理库。不过在 React 中,要做到这样的事情,需要非常强的综合能力,在 Vue3 中,要做到这个事情更为简单。

但是毕竟也是需要一点点技术含量的,全局状态管理是一个非常好的解决问题的思路,他足够的简单粗暴,能够解决几乎所有的状态问题。因此,这至少是一个在功能上不会出纰漏的方案。

但是,我想说的是,用 Vue3 就应该有不用 pinia 的自信。 当然我也知道,部分 Vue3 的使用者,并不能快速接受这个事情。


全局状态管理的弊端

全局状态管理是一种非常好的架构思路,他足够简单粗暴。你只需要把数据放在全局状态中,就可以不用担心任何组件拆分的问题。哪怕你的组件拆得再烂再不合理,也对功能的实现没有任何影响。最终的结果就是,大多数的项目,耦合严重。

当然,如果你对项目解耦的标准并不是那么看重,那么我们可能观念很难达成一致。毕竟几千行几万行一个组件的代码,也大行其道,观念不一也很正常。

有的时候,项目写久了之后,你甚至都不知道自己在这个页面定义的状态,到底别的页面用了没用。一旦涉及到 bug 修复、旧功能维护、项目迁移、重构,就极有可能会出现很多意料之外的困难。因此,我觉得,在不用或者尽量少用全局状态管理的基础之下,如何把自己的项目的理顺,实际上是一名优秀前端架构师应该追求的一个方向。

大多数时候,我们都应该遵循单一原则,每个页面,只维护自己相关的状态,并且也应该尽量想办法让这些状态变成页面私有状态,避免共享

当然,我只是提一个建议往这个方向去思考,并不是说,你就应该马上要这样做,毕竟每个人的项目都有各自的历史背景,难度和工作量各不相同。我只是告诉你一个结论,无全局状态管理完全足够应对大型的、复杂的项目,因为,我一直在项目中践行这个事情,这是长期实践之后的结论。

!事实上,全局状态管理方案在有的复杂 B 端项目中还会带来内存占用过大的隐患,我们需要单独的去思考内存释放的问题。但是这一般是在客户是医院、国企、政府单位时才会经常遇到的情况

我的原则就是:能不用就不用


Vue3 中,更容易做到弃用全局状态管理

在 React 中,状态私有这个事情要做得更好一些。我们无法把一个 state 定义到函数组件外部去。因此,从我个人的观点来看,这其实是一个优点。但是很多人却因为这样的限制感觉不自在,把他当成一个缺点。

甚至有的新型框架还会把 React 不支持状态定义在组件之外去特地贬低 React,并以此为卖点来抬高自己 ...

和 React 不同的是,在 Vue3 中,我们可以很轻易的把状态定义到组件之外去。并且还能在此基础之上,保持数据与 UI 的响应关系。

我们只需要单独起一个 ts 文件就可以做到这个事情

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import {ref} from 'vue'

export const count = ref(20)

export function increment() {
  count.value++
}

这其实是利用了闭包的特性做到了状态共享。它和全局状态管理的作用几乎是一模一样的。因此,在每个人的个人能力范围以内,大家可以在不得不用全局状态时,小范围的使用这种方式。

而 React 则还需要做一层额外的封装。


不使用 pinia,你损失了什么

首先,我们必要明确的是,我们应该优先把数据和状态,管理到函数组件之中,让他保持私有性。

全局状态管理应该作为一个兜底的方案,让它成为最后的选择。

因此,在这种小概率的范围之内,如果不使用 pinia,可能会存在的风险包括

  • 1、ssr 时利用闭包共享状态可能会出现意外的情况
  • 2、调试时无法追踪状态的变化
  • 3、调试时无法获得热更新的能力
  • 4、编写测试代码变得困难

首先,从大的范围来说,本身我们在全局状态管理中要存储的数据就应该非常非常少。这些影响就算一点都不解决,他其实也已经被降到了最低。因此这些损失也并不是不能接受。

我们再来一条一条的解读一下这些损失。

针对第一条,服务端渲染的理解。首先我们应该明确一个标准,那就是与客户端相比,服务端渲染的页面之间,更应该尽量避免共享可变状态。每一个服务端渲染出来的页面应该是单独的页面实例。在这个理念的基础之上去编写代码,你会发现你很难出问题。

第二条,我们要考虑的一个问题就是,我们在 debug 的时候,真的有很依赖状态追踪吗?console.log 才是调试方案中的最佳实践!

第三条,由于在函数组件之外声明响应式数据,因此这些数据在初始化时就被执行了,因此很难在更新时得到执行的时机,所以无法获得热更新的能力。但是由于我们只应该把小部分逻辑存放于此,因此这基本上不会对页面调试造成任何困扰。况且,当数据变得复杂时,hot reload 机制也并不那么好用,有的时候还不如重新刷新页面执行一次。结合 console.log 更容易发现问题所在

第四条,我的观点是,极小部分固定的共享状态,完全可以不需要编写测试代码,他们更多的只是基础的写入和读取的逻辑。例如登录状态,我们可以给登录逻辑单独编写测试用例即可。当然,大多数的团队,连一行测试代码也不行

很多团队确实也没太大的必要


总结

思考如何在项目中去全局状态管理,有利于帮助我们思考页面和组件的解耦问题,对我们的抽象能力是一个很好的训练机会。并且在思考这个问题的过程中,我们明确了自己可能会得到什么,以及会承担什么代价,并在这个充分的考虑过程后做出的决定。

我一直比较提倡的是不要在项目中使用全局状态管理工具。而 vue3 由于可以方便的把响应式状态声明在函数组件之外,用这种方式来兜底,他能够更容易平滑的做到这个事情。


一个区别

当我们使用自定义 hook 的方式来创建响应式状态时,和直接把状态声明在函数组件之外是有很大区别的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 自定义hook
function useCounter() {
  const count = ref(20)

  function increment() {
    count.value++
  }
  return {count, useCounter}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 单独的模块
export const count = ref(20)

export function increment() {
  count.value++
}

这里的区别就是在于,每次我们在不同的组件中执行自定义 hook useCounter,函数的上下文都是不同的。因此,在函数中执行 useCounter() 所得到的状态都是函数组件内部私有的。

但是第二种单独的模块的方式,这是一个公有的方案。当我们在别的模块中引入他们并使用时,实际上两个模块此时会构成一个闭包环境,从而让数据得到共享。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import {count, increment} from './useCounter'

我们在思考这个方案时,要注意区分这两种场景。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这波能反杀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue3之状态管理:Vuex和Pinia,孰强孰弱?
在前端开发中,状态管理器是一种用于管理应用程序全局状态的工具。它通常用于大型应用程序,可以帮助开发者更好地组织和管理状态,并提供一些强大的工具来简化状态的变更和使用。
用户6297767
2023/11/21
2.6K0
Vue3之状态管理:Vuex和Pinia,孰强孰弱?
深度解析:在vue3中使用自定义Hooks
Hooks技术最早是由React团队的Sophie Alpert和Dan Abramov在2018年提出来的。最初是为了解决React类组件中状态逻辑复用的问题提出来的。在React使用类组件时,为了复用状态逻辑,需要使用高阶组件或者Render Props等方式,这些方式会增加代码的复杂度和维护成本。而Hooks技术是使用特定函数来“钩到”React的state和生命周期等特性的技术。它可以让我们在函数组件中使用state以及其他的React特性,替代传统的类组件或高阶组件等方式。
九仞山
2023/10/14
1.7K0
深度使用 Vue Vine 四天之后,谈谈我的使用体验
当我在 Vue Conf 大会中看到 Vue Vine 这种新的开发方式之后,我非常的激动。因为我确实非常喜欢这种语法。因此在周日当天,我就通过自己的摸索跑通了一个 demo,并写了一篇文章跟大家介绍它。
用户6901603
2024/07/12
7490
深度使用 Vue Vine 四天之后,谈谈我的使用体验
vue中的pinia
Pinia是vue的专属状态库,允许开发者跨组件或页面共享状态,他是一个拥有组合式API的Vue状态管理库,支持vue2和vue3,有三个概念,state、getter 和 action,我们可以假设这些概念相当于组件中的 data、 computed 和 methods。。
用户10562852
2023/05/21
2870
vue中的pinia
Vue3 Hook 实践指南
Vue3 的 Composition API 提供了一种新的方式来组织和管理组件中的状态和行为。
訾博ZiBo
2025/01/06
840
最全系列的vue3入门教程『图文并茂』
Vue 3 是一个流行的开源JavaScript框架,用于构建用户界面和单页面应用。它带来了许多新特性和改进,包括更好的性能、更小的打包大小、更好的TypeScript支持、全新的组合式 API,以及一些新的内置组件。
linwu
2023/07/27
5.3K0
最全系列的vue3入门教程『图文并茂』
一文看懂:Vue3 和React Hook对比,到底哪里好?
Vue3 在经过多个开发版本的迭代后,迎来了它的正式版本,,其中最重要的一项RFC就是 Vue Function-based API RFC,很巧的在不久前正好研究了一下react hook,感觉2者的在思想上有着异曲同工之妙,所以有了一个想总结一下关于hook的想法,同时看到很多人关于hook的介绍都是分开讲的,当然可能和vue3.0对于这个特性的说明刚刚问世也有一定的关系。
极乐君
2020/12/14
6.5K0
一文看懂:Vue3 和React Hook对比,到底哪里好?
vue2升级vue3:vue3真的需要vuex或者Pinia吗?hooks全有了
在写 《vue2升级vue3:TypeScript下vuex-module-decorators/vuex-class to vuex4.x》,建议新项目使用 Pinia,但是我的项目部分组件希望直接打包出去给地方使用。这个时候还是会遇到vue2 是否打包出vuex的 问题。所以,干脆舍弃 vuex/Pinia,直接使用 vue3 原生搞定——hook出现之后,状态管理的问题已经从根本上被消解了!
周陆军博客
2023/01/25
1K0
Vue3中使用Pinia详解
Pinia是一个专门为Vue.js设计的状态管理库,它提供了一种简单和直观的方式来管理应用程序的状态。在使用Pinia时,可以轻松地创建定义状态的存储,然后将其与Vue组件绑定,使它们能够使用该状态。和上一个博客提到的Vuex相比,Pinia 更加简单易用,体积更小,同时具有更好的 TypeScript 支持和插件系统。
九仞山
2023/10/14
1K0
vue3自定义hook
Vue 3 引入了 Composition API,它提供了一种新的方式来组织和复用组件的逻辑。自定义 Hook 是 Composition API 的一个重要特性,它允许我们将一些相关的逻辑封装成可复用的函数,以便在不同的组件中使用。
堕落飞鸟
2023/05/21
4450
浅谈vue2与vue3的区别
Vue 2 :使用 Object.defineProperty 来实现数据的响应式。当你访问一个对象的属性时,它会触发 getter;修改属性时,会触发 setter。但是,Vue 2 的响应式系统在某些复杂情况下,比如添加新属性时,并不完全响应。
云萌工作室
2024/12/13
3510
Vue项目进阶:再谈Pinia函数式(composition API)用法
Hello大家好,前段时间写了一篇关于Pinia的composition API用法的文章《Pinia进阶:优雅的setup(函数式)写法+封装到你的企业项目》,收到了不少朋友的反馈和建议。笔者也结合最近项目情况和网友们的建议做一次优化,也算是一个比较完整的版本了,这包括:
南山种子外卖跑手
2022/04/21
3.5K0
Vue项目进阶:再谈Pinia函数式(composition API)用法
再遇vue之vue3新特性
首先说明一下,vue2和vue3是Vue.js的两个主要版本。目前vue3已经更新到3.3.4的版本了
用户6297767
2023/11/21
5590
再遇vue之vue3新特性
分享几个在 VUE3 项目中常用的封装组合API
本文将介绍如何使用vue3来封装一些比较有用的组合api,主要包括背景、实现思路以及一些思考。
前端达人
2022/04/18
2K0
VUE3全家桶精讲
有 <script setup> 之前,如果要定义 props, emits 可以轻而易举地添加一个与 setup 平级的属性。
HelloWorldZ
2024/03/20
2980
VUE3全家桶精讲
Pinia进阶:优雅的setup(函数式)写法+封装到你的企业项目
Hello大家好,相信在座各位假如使用Vue生态开发项目情况下,对Pinia状态管理库应该有所听闻或正在使用,假如还没接触到Pinia,这篇文章可以帮你快速入门,并如何在企业项目中更优雅封装使用。
南山种子外卖跑手
2022/02/22
7.2K0
Pinia进阶:优雅的setup(函数式)写法+封装到你的企业项目
【Vue工程】006-Pinia
https://stackblitz.com/github/piniajs/example-vue-3-vite?file=README.md
訾博ZiBo
2025/01/06
1780
Vue3 究竟好在哪里?(和 React Hook 的详细对比)
这几天 Vue 3.0 Beta 版本发布了,本以为是皆大欢喜的一件事情,但是论坛里还是看到了很多反对的声音。主流的反对论点大概有如下几点:
ssh_晨曦时梦见兮
2024/01/26
1.1K0
Vue3 究竟好在哪里?(和 React Hook 的详细对比)
Vue3(ts)中使用 pinia
Pinia 最初是在 2019 年 11 月左右重新设计使用 Composition API,可以理解为下一代 vuex,作者也称之为vuex5,同时vue已经将 pinia 收入 官方账户了
iwhao
2024/07/03
5991
Vue3学习笔记(七)—— 状态管理、Vuex、Pinia
理论上来说,每一个 Vue 组件实例都已经在“管理”它自己的响应式状态了。我们以一个简单的计数器组件为例:
张果
2022/11/28
4.1K0
Vue3学习笔记(七)—— 状态管理、Vuex、Pinia
相关推荐
Vue3之状态管理:Vuex和Pinia,孰强孰弱?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档