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貌似不能主动读文件来着?)。

感谢阅读

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...