当前位置: 首页 > article >正文

Vue3可以不用Pinia了?

目录

前言

为什么选择组合式API进行状态管理

案例Demo

结论


 

前言

随着Vue 3的发布,开发者们获得了许多新的特性和改进,其中之一就是对组合式API(Composition API)的支持。这个API允许以更灵活和逻辑化的方式组织代码,同时为状态管理和逻辑复用提供了强大的支持。在本文中,我们将探讨如何通过组合式API直接管理应用状态,而无需依赖额外的状态管理库如Pinia。

为什么选择组合式API进行状态管理

组合式API不仅简化了组件内部逻辑的组织方式,还使得逻辑复用变得更加直观。通过定义可重用的函数,我们可以将特定功能相关的状态和行为封装起来,然后在多个组件间共享。这种方法减少了对于专门的状态管理库的需求,特别是在小型到中型的应用程序中。

案例Demo

让我们来看一个具体的例子——创建一个简单的计数器。这里我们不采用任何外部状态管理库,而是利用Vue 3内置的功能来实现。

当前Vue版本:最新的vue3版本 v3.5.x

添加一个useCount.ts文件,申明一个组合式函数。

// useCount.ts

import { computed, readonly, ref } from 'vue'

const count = ref<number>(0)
const useCount = () => {
  const doubleCount = computed(() => {
    return count.value * 2
  })
  const setCount = (v: number) => {
    count.value = v
  }
  return {
    // readonly可以确保引用对象不会被修改
    count: readonly(count),
    doubleCount,
    setCount,
  }
}
export default useCount

了解javascript函数机制的我们知道useCount本身是一个闭包,每次调用,里面的ref就会重新生成,count就会重置,所以我们需要把count的声明暴露在全局环境中,这样在import时就会申明了,调用函数时不会被重置,现在我们多次调用时,发现可以共享了。

但是这个时候count是比较危险的,store应该可以保护state不被外部所修改,很简单,我们只需要用readonly包裹一下返回的值

页面中解构使用


import useCount from '@/store/useCount'

const { count, setCount } = useCount()
const { doubleCount } = useCount()

onMounted(async () => {
  console.log('count', count.value, doubleCount.value)  // 0 0
  setCount(10)
  console.log('count', count.value, doubleCount.value)  // 10 20
  
})

上述代码展示了如何在组件挂载时初始化并打印计数器的初始值及更新后的值。

结论

虽然像Pinia这样的库提供了非常成熟且强大的状态管理解决方案,但Vue 3的组合式API也为小规模或中等复杂度的应用提供了一种轻量级的选择。通过合理地利用这些新特性,你可以构建出既高效又易于维护的应用程序,但是放弃pinia也就意味着放弃了它自带的一些方法store.$statestore.$patch等等,这些方法实现很简单,很轻松就可以手写出来,如果你是这些方法的重度用户,保留pinia也没问题。


http://www.kler.cn/a/421727.html

相关文章:

  • Linux操作系统性能优化
  • JavaScript中的 closest 方法详解
  • 【开源】A060-基于Spring Boot的游戏交易系统的设计与实现
  • Language Translation with TorchText
  • springboot利用easypoi实现简单导出Excel
  • 106.【C语言】数据结构之二叉树的三种递归遍历方式
  • es 3期 第12节-选择合适的数据查询方式
  • 【Go底层】time包中Timer定时器原理
  • 【分组去重】.NET开源 ORM 框架 SqlSugar 系列
  • 论文阅读:Generating Synthetic Data for Medical Imaging
  • 企业AI助理在数据分析与决策中扮演的角色
  • B树与B+树的区别,为什么MySQL使用B+树不使用B树
  • Elasticsearch在liunx 中单机部署
  • ElasticSearch QueryDSL详解
  • 通过JS逆向,爬取音乐(仅供学习交流,严禁非法使用)
  • Kubernetes集群添加主机名解析
  • Node.js 实战: 爬取百度新闻并序列化 - 完整教程
  • c++预编译头文件
  • java调用ai模型:使用国产通义千问完成基于知识库的问答
  • 详解日志格式配置:XML 与 Spring Boot 配置文件格式
  • [RabbitMQ] 延迟队列+事务+消息分发
  • macOS运行amd64的镜像
  • 李飞飞:Agent AI 多模态交互的前沿探索
  • 为什么同一个网络下的其它电脑无法访问部署在mac上的flask服务
  • 容器化与容器编排(Containerization and Orchestration)
  • 【Azure Cache for Redis】Redis的导出页面无法配置Storage SAS时通过az cli来完成