pinia原理学习
创始人
2024-05-20 10:45:59
0次

Pinia 中文文档
pinia原理

上次写vue项目的时候,问别人还在用vuex。别人说不用了,改pinia。于是了解了一下pinia。它是一种全局状态管理工具,vue2/3都适用,api比vuex更精简,使用更舒服。了解完就找资料摹写一个pinia。膜拜大神,链接贴上面了。现在说一下体会。主要按渐进式完善、注册、挂载、使用方式、逻辑理解、vue踩坑、对比react的useModel这几方面讲。

  • 上面的原理博客是渐进式写法逐渐完善的,降低了不少理解难度,配合边写边读很快就能撸一个出来,然后再做内容输出,做知识整理~。

  • 这种插件的注册方式是通过install安装,通过symbol判断是否安装。install里面做几件事,1挂在对象,2依赖注入,3挂原型链上。也因此,它这个对象有一些_a、_e、_s来分别保存当前实例、作用域、和所有store(不得不说考虑得就是完善)

  • 使用方式emmm和原来一模一样,就是createPinia一个pinia对象给vue use,然后调defineStore传个id和函数式写法或传统state-getters-actions写法定义一个store,然后页面执行这个store返回的函数就能拿返回值及函数来使用了。

  • 其原理的大概逻辑是这样:
    createPinia:用了一些专门写插件的api------effectScope, markRaw(我也不太懂这几个api)来构建个内部自动销毁型作用域,然后声明install方法,在vue.use(xxx)的时候vue会去调用这个install安装,install做几件事,1挂在对象,2依赖注入,3挂原型链上。
    defineStore:接收id,判断是函数式还是传统写法,然后返回个useStore函数。useStore里面通过symbol得到pinia实例,如果在_s里面有这个id,就返回它;没有就进行函数式注册或者传统注册。
    函数式注册:用reactive声明个响应式变量,用_e搞个作用域出来,执行传入的函数式获取到一个对象,然后遍历这个对象里面的方法改变this和参数指向到开头声明的变量上------action.apply(store, arguments),这样调用方法就能通过传参来改这个变量,最后合并变量和对象,返回它。
    传统注册:核心思想就是解析state, getters, actions这三个变量,然后一一支持它。取巧的是只是多了个自己定义的setup函数,在函数里面支持这三个变量。外面套的壳跟函数式支持一模一样哈哈哈哈。在setup里面,state的支持是先获取(兼容函数和对象两种传值方式),然后调用toRefs转成响应式,就支持了;gettter的支持是先遍历(它用reduce遍历对象的写法好简洁第一次见!),然后用computed计算一下里面依然还是要改变this指向到变量上,然后跟state合并一起返回就支持啦;action的支持是遍历为函数的属性然后改变this指向到变量上就好了,最后合并返回。

  • 我认为其中的关键点在于 它通过Object.assign绕过vue合并对象不响应的坑、通过symbol注册得到实例、函数返函数的形式、改变this指向、以及一些取巧之处。

  • 最后,对比react的useModel,pinia需要注册才能使用,这是因为antd pro框架帮我们封装了这个useModel,让我们开箱即用。同时两者开发思路不同,antd pro做这件事的原理大概是通过读文件操作,将特定目录特定开头的文件给实例化做成单例模式,并可以通过useModel获得实例,就算是全局数据了(猜测,不过js貌似不能主动读文件来着?)。

感谢阅读

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...