2022 年,我们再来谈谈 React 状态管理

JavaScript027

2022 年,我们再来谈谈 React 状态管理,第1张

jQuery 时代,JS 代码中混杂 DOM 结构,各个流程庞杂交织时,就形成面条式代码,当使用发布订阅模型时,调试会一团乱麻。

jQuery 是针对 "过程" 的命令式编程,而那么多命令,最终都是为了更新 UI 中的 "数据",为什么不直接去改数据呢?

北京 上海,把 city="北京" 变为 city="上海" 就行。不管飞机火车步行抛锚,也不管路上会不会遇到王宝强,

现代前端框架的意义,就是问题解决思路的革新,把对 "过程" 的各种命令,变为了对 "状态" 的描述。

什么是状态?状态就是 UI 中的动态数据。

2013 年 5 月 React 诞生。但 2015 年之前,大概都是 jQuery 的天下。2015 年 3 月 React 0.13.0 发布,带来了 class 组件写法。

在 React class 组件时代,状态就是 this.state,使用 this.setState 更新。

为避免一团乱麻,React 引入了 "组件" 和 "单向数据流" 的理念。有了状态与组件,自然就有了状态在组件间的传递,一般称为 "通信"。

父子通信较简单,而深层级、远距离组件的通信,则依赖于 "状态提升" + props 层层传递。

于是,React 引入了 Context,一个用于解决组件 "跨级" 通信的官方方案。

但 Context 其实相当于 "状态提升",并没有额外的性能优化,且写起来比较啰嗦。

为优化性能,一般会添加多个 Context,写起来就更啰嗦。在项目没那么复杂时,还不如层层传递简单。

实用主义来说,"状态管理" 就是为了解决组件间的 "跨级" 通信。

当然,在使用状态管理库时,其会带来一些衍生的思维模式,比如如何组织 state,如何拆分公共逻辑、业务逻辑、组件逻辑等,但归根结底,这些都不是核心缘由。

核心就是为了解决实际问题 —— 为了通信。其它的各种概念与哲学,都不是必要的。

Context 没那么好用,React 官方也没什么最佳实践,于是一个个社区库就诞生了。

React class 组件时代,就是 Redux(及其相关衍生库)与 MobX 的故事。

Redux 是符合 React 理念的实现。而 MobX 这种 "监听" 的模式,特点是 "不够 React",但用起来简单。

Redux 的利弊已讨论太多,简单来说,开发者关心的是 "使用",而 Redux 关心的是 "哲学"。

之前开玩笑说,其实 Redux 用一行代码就可以表示,却写出了论文规格昏昏欲睡的文档:

而几乎所有 React 状态管理器的原理,其实都很简单,一个 "观察者模式" 的实现:

在各个组件中订阅 listener,state 更新时,再把 listener 都调用一遍,从而触发组件更新。

React class 组件存在以下问题:

为了解决以上问题,React 引入了 Hooks:

这是一种开发理念与组织理念的革新,Hooks 带有强烈的 3 个特点:primitive、decentralization、algebraic effects。

Hooks 出现之后,社区还没有一个像 Redux 一样曾经一统江湖的状态管理器。

Redux 添加了一些 useSelector、useDispatch、useStore 之类的能力,而 Facebook 自己也开源了 Recoil 这样的库。

但 Redux 终究老气沉沉,且早期给人留下的阴影太大,很多人的思维被格式化,随便一写就是云里雾里,只为实现一个简单功能,

而 Recoil 的写法则看起来有些别扭、有些啰嗦,发展也不温不火。

而在 Hooks 时代,一个神秘组织异军突起,一口气贡献了 3 个状态管理库。

它就是 pmndrs,pmndrs for Poimandres。pmnd.rs

说是 "组织",其实主要开发者应该是一个人,就是这位大师,Daishi Kato。github.com/dai-shi

这三个库分别是 zustand、jotai、valtio。有趣的是,这三个词其实都是 "状态" 的意思。

zustand 德语 "状态",jotai 日语 "状态"、valtio 芬兰语 "状态"。

简单看一下用法:

如之前提及 MobX 时所说,使用 proxy "监听" 的方案,虽然不够 React,但确实用起来简单,且最符合直觉。

本质上来说,React 是一种 "贪婪更新" 的策略,全量 re-render 然后 diff。

而 proxy 是一种 "惰性更新" 的策略,可以精准知道是哪个变量更新。所以利用 proxy,可以做一些 re-render 的性能优化。

而 React conf 上介绍的 React Forget,代表 React 自身也并不排斥在 "惰性更新" 的思路上做一些优化。

注意上面的 "贪婪更新" 和 "惰性更新" 是我自创的词,参考了正则中的贪婪和惰性概念。

总的来说,这虽是状态管理思路的变迁,但更是 React 社区开发思路的变迁,一种对最佳实践的不断 探索 :

我一直在思索怎样的一个 React 状态管理器用起来最简单,不断去 探索 一个自己用起来最舒服的工具。

之前曾经开发过 Retalk(Redux 最佳实践)、flooks(Hooks 状态管理),但随着新思路的出现,现在将最新的一些灵感集中在了 resso 这个状态管理库里。

下面是 resso 的使用方式:

注意它与很简单的 valtio 相比,写法也更简单一些,应该没法更简单了,如果有,请告诉我。

更重要的是,resso 会自动优化 re-render,绝不因为数据在同一个对象里,就触发额外的 re-render。

其实状态管理本是个很简单的东西,但 Redux 等工具追加了太多的复杂上去。人们用一个工具的原始目的,就是解决问题,如何而已。

所以,简单,清晰,让工具回归工具。我们了解一个锤子的方式,就是拿起来用。

希望 resso 会让有此需要的人喜欢。

但是这一切,又有什么用呢?

在新东西不断涌来时,人们不免会发出疑问:class 组件又不是不能用,Redux 又不是不能用,或者更彻底一些,jQuery 又不是不能用,为什么一定要去追逐这些新的东西呢?

一个抽象的解释:我们应该不断投资未来。

这不只是在开发中,在工作中,更是在任何领域 —— “在新赛道中以不断细分的形式,用第一的身份换取资源。”

旧世界的轨道上挤满了辛苦的赶路者,虽然新大陆海市蜃楼,但只有新大陆才会跃升一切。

可以第一视角也可以第三视角。用鼠标中键可以调

上古4的亮点首先在超强的自由度以及庞大的地图(而且不是那种随机产生的地图)。

如果只做主线任务的话,游戏大概可以在20-40小时左右完成,如果想要完成所有支线和主线任务的话,至少要200小时以上;当然不仅如此,因为游戏高度的收集性,秘密和可DIY性,你应该可以花上超过500小时的时间在游戏中。

而除了游戏中的支线任务,你还可以在偏僻的地方找到神殿,在那里你还可以做Daedra的任务;最后的最后,有Radiant AI的NPC还会根据情况自己提供任务给你,复杂程度比前作Morrowind有过之而不及……

那这200小时是怎么来的呢?

?5个政府之间的争斗所出现的任务

?探索Oblivion的土地

?4个可加入的工会

?主线任务(Blades工会主要是提供主线任务不能加入

?加入角斗士后的角斗场中的各种挑战

?收集700件盔甲部件

?凑齐120种可混合药剂

?用8小时来购买和装修房子

?收集5种马

?节日庆祝

?收集400本书

?扫荡200个地牢和洞穴

?150个任务

?Daedric的任务

?7场左右的大场面战斗

?探索25块殖民地

另外上古的mod十分强大。你几乎可以通过mod做到任何事。比如加一些新衣服,加一个新种族,加一个新任务,甚至加一整块大陆。或是把上古改成另一款游戏,变成刺客信条,变成口袋妖怪。

上古是一款很开放的游戏。这有一个介绍可以帮你快速了解这个游戏除mod外的内容。

2.1 游戏中有些什么技能,Birthsign又是什么?

Combat系Skills

Endurance-Block:使用盾牌,武器或是双手来格挡敌人的攻击,减少受到的伤害,

Endurance-Armorer:精通普通武器和盔甲,(盔甲和武器会磨损,效果会降低)

Endurance-Heavy Armor:精通Iron,Steel,Dwarven,Orcish,Ebony,和Daedric盔甲

Strength-Blunt:精通斧头和锤子

Strength-Blade:精通剑和匕首

Speed-Athletics:更快速的跑和游泳,并更快的恢复体力

Strength-Hand to Hand:增加徒手攻击的攻击力,并可以令对手疲劳

Magic系Skills

Willpower-Destruction:使用fire,frost,shock魔法,并加强魔法抵抗性

Willpower-Alteration:使用魔法在没空气的地方呼吸,在水上行走,开门,免疫物理和魔法攻击

Personality-Illusion:可以使用charm,conceal,light,silence,paralyze,command,并控制弱小的敌人或是凡人

Intelligence-Conjuration:召唤召唤兽,魔法武器,盾牌和不死

Intelligence-Mysticism:吸收,反弹,抵消敌人的魔法,移动物体,探测生命,束缚灵魂

Willpower-Restoration:使用魔法来回复生命,加强防御力,免疫魔法攻击,治愈疾病

Intelligence-Alchemy:制造药剂,更有效的使用炼金术

Agility-Stealth

Agility-Security:使用撬锁工具撬锁,可以用来打开门和箱子

Agility-Sneak:偷东西,潜入技巧

Speed-Acrobatics:虽然游戏中取消了跳这个普通功能,但是可以通过这个技能来进行远距离的跳跃,同时还可以减低从高处落下造成的伤害

Speed-Light Armor:精通Fur,Leather,Chainmail,Mithril,Elven和Glass类盔甲

Agility-Marksman:精通弓箭

Personality-Mercantile:购买物品时价钱降低,卖物品时价钱升高(JS必备)

Personality-Speechcraft:使用巧言迷惑被人,让他们喜欢并信任你。

在创建角色的时候,玩家需要做一系列的测试来决定自己的星座,不同的星座都有不同的优势和弱点如下:

The Apprentice:Apprentice座的人的魔法值将会被赐予有附加的100点的上限,但是代价是100%的魔法弱性,

The Atronach:这个星座的人不能自动恢复魔法值,但是你可以吸收敌人50%的魔法攻击来补充魔法值,同时,最大魔法值也将被赐予附加的150点的上限,

The Lady:这个星座的幸运儿会得到妇女的保佑,增加毅力和耐力10点,

The Lord:这个星座的人将被赐予北方的血液,可以通过减少力量来恢复90点的生命值。但是也将会有永久的Trollkin诅咒,25%的火属性弱性,

The Lover:爱人的吻可以另这个星座的人每天能够通过消耗120点体力来麻痹敌人10秒钟,

The Mage:这个星座的人永久性的增加魔法值50点,

The Ritual:这个星座的人每天能够通过使用Mara's gift恢复生命值一次,

The Serpent:这个星座的人会习得Serpent的咒语,消耗100点体力消除自己身上的诅咒并使自己的攻击带毒性,代价是会造成Slow,

The Shadow:这个星座的人每天可以有60秒钟变成隐形人,

The Steed:这个星座的人Speed属性会得到附加的20点,

The Thief:这个星座的人有附加的10点Agility,Speed和Luck属性,

The Tower:这个星座的人,每天可以打开一个中等等级的门或是箱子。并可以有120秒的时间每次反弹5点受到的伤害,

The Warrior:这个星座的人被赋予附加的10点Strength和Endurance属性。

2.2 技能等级怎么提高?

不是很清楚……不过听说是这样的:

?游戏中可能会很难靠单独一个Master就能把你的技能训练到100%?每次训练得到的经验会越来越少

在Master那里修炼的同时会随着训练而增加等级,,以下就是5个等级

?Novice 1-24%

?Apprentice 25-49%

?Journeyman 50-74%

?Expert 75-99%

?Master 100%

2.3 什么是技能perks?

每个技能训练到一个新的等级后(参照上面的等级分制),你就会得到一个新的技能Perk,技能Perk对你的技能使用会有很大的影响/帮助,,因为技能Perk往往不只对对应的技能有用,还可能在技能使用的时候有效, 比如,Masksman/射手技能得到Zoom的Perk技能只对弓箭有效,但是其他一些Perk,比如Sneak技能的Perk-Sneak attack就可以影响其他技能,比如武器技能等,, 一些高等的Perk可以使玩家在一次攻击中同时使用1个以上的技能

2.4 Skill Perks的例子

?weapons: disarm

?weapons: spinning attack

?weapons: neck strike (可能只使用剑) 埝

?Marksman: straffe rumor

?Alchemy: be affected by more potions at once

?Mercantile: Invest in Store

?Sneak: Sneak Attack

?Marksman : Zoom

?Magic: Access to stronger spells

?Armor: negate spellcasting / sneak penalty

?Armorer: repair to more than 100% a9vg

?Armorer: Don't use up Hammer anymore

?Armorer: repair enchanted items

除了技能Perks以外,还有工会Perks,每个工会的Perks都不同,获得方法是提升在工会中的地位和等级

以下是现在已经知道的工会Perks(Guild Perks)

?Mage: Enchentaing Altar

?Mage: Spell Making Altar

?不详……

?Acrobatics: roll move

三 战斗

3.1 游戏中有马战吗?

没有,但是你骑的马有生命值,被攻击的话也会死,

如果在马上被攻击的话,你只有两种选择,骑马跑开,或是下马战斗

3.2 ES4拿掉了哪些ES3中有的东西?

长枪和弩被取消了

一些武器和盔甲技能被合并,

合并技能成为了高等Guild perks。

浮空和回程也没了

听说跳也可能会没有,但是不是很确定

3.3 ES3和ES4的战斗还有其他区别吗?

ES3中的命中率和攻击力是随机的,但是ES4不再采用这种RPG要素,更倾向于动作游戏,只要你的武器砍中敌人,就能造成伤害

你对敌人造成的伤害值则有你的属性,相对的武器技能或是魔法技能的等级来决定

Strength决定你每次攻击对敌人造成的伤害,speed(包括角色和武器的属性)则决定你每次攻击的间隔, 武器本身的等级也会影响攻击力和速度,

同样的,格挡和回避等动作也都要有玩家来手动完成,而不是有几率决定了; 格挡的技能高低和玩家角色的属性决定了能减少的伤害值,而回避则要靠玩家物理或是魔法移动角色了……

新加入的有暗杀和弓箭的ZOOM技能。

3.4 怎么格档?

按住防御键就可以了,如果防御成功的话,敌人会有一定的硬直,这个时候可以追打。

格挡技能的高低决定格挡后所减少的伤害大小,升到一定等级后会有Perk:disarm。(一定几率下格挡后导致敌人武器脱手或反弹)

你可以用武器,盾牌,甚至手臂来进行格挡

在使用盾牌防御的时候,玩家不能跑,只能走,同时你防御的时候必须面对着攻击方向才能挡下攻击,

3.5 徒手战斗(Hand to/2 Hand)有什么变化?

徒手战斗有些像武术,,练好了以后威力很高

3.6装备技能有些什么改变?

装备技能被简化到了2种,轻装备和重装备(每种装备都有6种小分类),

穿铠甲以后,使用魔法的时候会有耗损,使用暗杀技能的时候效率也会降低,

但是装备技能升高后就可以减少这种损耗,一些高等Perk技能学到以后还能彻底无视这种损耗,

3.7 Recoil和Disarm技能有什么用?

Recoil的作用是,当你防御住敌人的攻击后,敌人会被因为反弹而后退并段时间的硬直,可以趁这个时候用强力攻击来反击;

Disarm则是武器技能/徒手攻击技能/防御技能的Perk,

3.8 怎么使用暗杀?

暗杀是潜入技能的Perk,能对没注意到你的敌人进行毁灭性的打击

但是不是所有武器都能用来执行暗杀,比如高威力的双手用的武器就不行

听说每把武器的暗杀方式都不同,而暗杀的威力可以无视敌人的装备的防御力,

3.9 远程武器呢?

拉弓,瞄准,射箭……

不过本作中只有一种物理远程武器:弓……

远程技能升到Perk后可以使用Zoom,可以靠这个技能从远处用来发动陷阱或是移动物体(托本作的物理引擎的福),

魔法远程武器则是杖,这个就不用解释了

3.10 关于投降?

在战斗中对手可能会为了避免死亡而向你投降,不过不是每个敌人都会轻易投降的,这些是由很多因素来决定的,比如对手的集团,种族和声望等,

当然拉,你也可以向NPC投降,同样,有些NPC会接受你的投降,但是如果你投降的对象是Daedric的话,他很可能会拒绝你的投降,选择毫不留情的切碎你……

3.11 毒药怎么用?

炼金术可以将毒药冶炼到武器上,然后可以做出一次性的药物攻击

毒药不仅能造成伤害,还能麻痹和Silence的效果

已经被冶炼上毒药的武器会有一个小液滴的标志在上面,在武器攻击后,小液滴的标志会消失,武器会回到普通状态,

游戏中也可以毒化食物,但是只限制苹果(白雪公主,毒苹果…… = =)一种

3.12 魔法武器怎么使用?

魔法武器只能造成伤害属性,有利玩家的辅助系属性不能镶嵌在武器上

魔法武器的攻击会消耗能量,这些能量可以通过soul gems来补充,

Soul只能补充一部分的能量,而比较特殊的石头,比如Vardana Stones就可以补充全部能量,

3.13 游戏中NPC和敌人的radiant AI会在战斗中带来什么影响?

NPC,敌人会懂得从地上捡起武器来防卫自己或是打倒你,,同样,他们也会投降,逃跑甚至偷袭。

3.14 那Arena guild的角斗场里的战斗和普通战斗有不同吗?

角斗场里所有的战斗都是生死战,敌人不会投降或者接受投降

角斗场里可以通过角斗来提高等级和称号,换取名声,赢得奖品等

玩家自己也可以用角斗来赌博,,,这中间的奥妙自己去体会吧,,嘿嘿,

角斗场中都会有观众,但是观众席上的他们都不能杀死

游戏中有些地方能够通过观察其他人的战斗和练习来取得经验值,但是在哪里具体不但清楚……可能是战斗工会

3.15 有双手武器吗?

没有

3.16 游戏中能够造成局部伤害吗?

没有,虽然攻击敌人不同的部位会造成不同的伤害,但是你不能破坏敌人的某个部位,比如一直攻击敌人的手臂的话,不会使敌人的手臂丧失功能

四 魔法

4.1 游戏中有哪些魔法学院?

一共6个

?Alteration

?Conjuration

?Destruction

?Ilusion

?Mysticism

?Restoration

4.2 怎样加入魔法工会?

首先,你必须要在6所魔法学院毕业,同时,每个技能都至少要修炼到20%才行。然后你才可以进入魔法大学,然后可以加入魔法工会,

4.3 本作中还有镶嵌技能吗?

镶嵌技能没有了,因为在前作中,镶嵌技能一般都被玩家用作补充魔法武器的技能,而不是制造物品,所以就被取消了。

不过Enchant仍然存在,作为魔法工会的一个高级Perk。 方法是通过Arcane University大学的镶嵌祭坛来进行………

同样,,咒语合成的方法也改成使用咒语祭坛来操作

整个大陆中一共有11快水晶可以用来镶嵌

所有镶嵌效果都是永久的,这也是取消镶嵌技能的原因,因为这样镶嵌技能就没什么用处了,

在游戏早期,玩家也可以使用在Oblivion中找到的魔石来进行镶嵌,但是这种镶嵌的对象有很大的限制范围。

4.4 炼金术具体资料

暂时没有足够的资料

4.5 魔法移动技能的变化

游戏中将会有用来逃脱危险的魔法;但是回程和浮空已经被取消了,ES4中具体有些什么是移动魔法还不知道,不过和Fast travel不同,移动魔法都是瞬间的,不会消耗游戏中的实际时

4.6 ES4中的魔法值在使用后会自动回复吗?

会。角色的属性影响使用魔法消耗的魔法值并决定魔法回复的速度

4.7 魔法系统还有哪些变化?

已经确定删除的魔法:

Levitation, Mark/Recall

可能会删除的魔法:

Slowfall, Jump

大幅度改进的东西:

Perks, Spells Power Control (Rank: Novice,Master)

Telekinesis, 咒语效果, 与场景中物体的互动。Telekinesis将会是游戏的重要魔法之一,因为这个魔法可以在远处移动物体。而游戏中的大多数陷阱都是靠游戏的物理引擎来支持的,所以这个能力会对破坏或是提前触发陷阱有很大的帮助

同样,物理引擎也使paralysis更有效,因为角色麻痹后不能行动并倒下,然后很可能会从高处落下造成重创。

五 暗杀

5.1 怎么进行暗杀?

游戏中有个光影引擎,暗杀时的隐蔽度和分裂细胞或是神偷的大致概念类似

PS:你所穿的盔甲类型会影响隐蔽度和暗杀效果。

屏幕上会有一个小小的眼睛的标志显示你是否处于隐藏状态,(想象一下Fable中左上角的眼睛

所有隐藏,偷窃或是暗杀都是由你的Sneak技能来左右的,

5.2 怎么进行lock pick?

Lock pick会以一个小游戏的方式来进行

?会有一个屏幕跳出来,显示锁的横截面(想象下分裂细胞)

?移动2-5条的琐栓

?最后定位每个锁栓

越难开的缩需要固定的锁栓越多(2-5个),同时也越难固定锁栓。

不过玩家如果不想自己手动解锁的话,可以让游戏自动解锁,解锁成功与否由你的security技能高低加上随机几率来决定

5.3 游戏中怎么进行社交?

大家还记得The Bard’s Tale吗?和这个游戏类似,TBT里只有两种选择,和善和恶劣;

ES4有4种,同时复杂的多

?Boast (自夸)

?Admire (称赞)

?Joke (开玩笑)

?Bully (威逼)

4种选择在一个罗盘的4角,玩家在罗盘中移动一个点来决定语气,,,你可以对同一个人尝试不同语气来看不同效果,,

5.4 可以行商吗?

这方面的消息也很少,暂时只知道两点:

?某个技能perk可以让玩卖东西给NPC

?某个高等perk可以让你在商店中投资以赢取利润

5.5 陷阱怎么辨别和使用?

本次的陷阱大多牵涉到物理引擎的运动,,

多数情况下,你需要避开或是破坏陷阱,但是在某些情况下,你也可以故意触发这些陷阱来陷害敌人, (

但是可惜的是……玩家不能自己设立陷阱,只能利用已经被敌人设好的陷阱……

5.6 怎样才能加入盗贼工会?

最简单的加入方法就是通过盗窃被抓住,然后被送进监狱,之后便会有盗贼工会的人尝试和你接触并邀请你加入了,,

或者也可以多和NPC交谈,找寻和盗贼工会的人,自然而然的就会有盗贼工会的人来招募你,

怎么看盗贼工会都是廉价组织啊……

5.7 本作中可以越狱?

ES4中被关进监狱的话,你会被扔进一个牢房中,所有装备都会被保存早一个证据箱里,在你设法越狱后,除了你偷取的赃物,所有装备都将自动回归,当然,你也可以坐在监狱里等到你得到释放

?被关在监狱的时候,除了Sneak和Security其他所有技能都会慢慢的降级,

?可以和监狱官谈话并贿赂他,然后出狱,,

?你可以通过Lock pick来越狱

?或者使用Telekinsis来开门,

?或者直接把门砸开防?

5.8 关于工会-Dark Brotherhood?

?你可以通过残杀无辜的人来得到工会的邀请

?Dark Brotherhood可以说是一个有暴力兼凶杀倾向的疯子组成的俱乐部,

?工会里会有个任务:在一个晚会中杀死所有来宾,并不被抓住……

5.9 名声有什么用?

游戏会统计你做过的所有事情,包括你杀的怪物或是人,还有平时和NPC交谈的态度等,其中最重要的两个是你的好和坏的声望度。

这两个声望度都是累积的,不能想Fable那样此消毕减,你每做一件善事都会增加你的Fame,每做一次恶行都会增加你的Infamy。而你的声望决定着NPC对待你的态度,,所以在做事之前要记得,你现在所有的行为都将在以后付出代价,过错是无法弥补的…

Pinia 终于转正了,它具有与 Vuex 5 几乎完全相同或者增强的 API,简单来说,它就是和 Vuex 5 名字不同。Vuex 3 和 4 仍会继续维护,但是新功能不太可能会添加了。Pinia 也支持渐进式迁移,Vuex 和 Pinia 可以安装在同一个项目中,新项目的话建议直接使用 Pinia。

Vite 发布了 v2.9.0。

React 18 终于发布了,官方团队从 v16 就开始普及并发概念,到正式版发布时难免少了一些新鲜感。照目前的发展趋势看,React 未来会朝着前端底层“操作系统”的方向发展,会变得越来越复杂。这些复杂的操作又会被元框架(Next.js、Remix)消化掉,开发者并不会直接接触,使用这些元框架开发即可。

稳定不停滞,支持增量升级,v5、v6 的版本代码可以同时存在。

下面是其他的发布信息和 TC39 提案的一些推进情况,大家可以找感兴趣的自行查阅。

下面我们来看技术资料。

和好朋友卡颂一起在做的项目: 前端赏金猎人

这是一个用单纯的金钱关系维系的前端学习社区,悬赏答题 + 答题赚钱。

期待你的加入,如果觉得有价值的话,可以给个 Star 鼓励一下。

把技术名词的大小写拼写正确是基本的素养,但很多人都不重视,这个项目可以帮助你纠正错误的大小写。

免费的编程中文书籍索引,项目已有 90.1k Star。

从 2008 年谷歌浏览器推出至今的 100 个精彩瞬间回 忆录。

在这里插入图片描述

Pinia 是 Vue.js 的轻量级状态管理库,最近很受欢迎。它使用 Vue 3 中的新反应系统来构建一个直观且完全类型化的状态管理库。

Pinia的成功可以归功于其管理存储数据的独特功能(可扩展性、存储模块组织、状态变化分组、多存储创建等)。

另一方面,Vuex也是为Vue框架建立的一个流行的状态管理库,它也是Vue核心团队推荐的状态管理库。 Vuex高度关注应用程序的可扩展性、开发人员的工效和信心。它基于与Redux相同的流量架构。

在这篇文章中,我们将对Pinia和Vuex进行比较。我们将分析这两个框架的设置、社区优势和性能。我们还将看一下Vuex 5与Pinea 2相比的新变化。

Pinia 设置

Pinia 很容易上手,因为它只需要安装和创建一个store。

要安装 Pinia,您可以在终端中运行以下命令:

该版本与Vue 3兼容,如果你正在寻找与Vue 2.x兼容的版本,请查看v1分支。

Pinia是一个围绕Vue 3 Composition API的封装器。因此,你不必把它作为一个插件来初始化,除非你需要Vue devtools支持、SSR支持和webpack代码分割的情况:

在上面的片段中,你将Pinia添加到Vue.js项目中,这样你就可以在你的代码中使用Pinia的全局对象。

为了创建一个store,你用一个包含创建一个基本store所需的states、actions和getters的对象来调用defineStore方法。

Vuex 也很容易设置,需要安装和创建store。

要安装Vuex,您可以在终端中执行以下命令:

要创建store,你可以使用包含创建基本store所需的states、actions和 getter 的对象调用createStore方法:

要访问 Vuex 全局对象,需要在 Vue.js 项目根文件中添加 Vuex,如下所示:

使用 Pinia,可以按如下方式访问该store:

请注意,在访问其属性时省略了 store 的state对象。

使用Vuex,可以按如下方式访问store:

这两个状态管理库都相当容易学习,因为它们在 YouTube 和第三方博客上都有很好的文档和学习资源。对于以前有使用 Redux、MobX、Recoil 等 Flux 架构库经验的开发人员来说,他们的学习曲线更容易。

这两个库的文档都很棒,并且以对经验丰富的开发人员和新开发人员都友好的方式编写。

Pinia和Vuex都非常快,在某些情况下,使用Pinia的web应用程序会比使用Vuex更快。这种性能的提升可以归因于Pinia的极轻的重量,Pinia体积约1KB。

尽管Pinia是在Vue devtools的支持下建立的,但由于Vue devtools没有暴露出必要的API,所以一些功能如时间旅行和编辑仍然不被支持。当开发速度和调试对你的项目来说更重要时,这是值得注意的。

Pinia 将这些与 Vuex 3 和 4 进行了比较:

这些是Pinia在其状态管理库和Vuex之间的比较中提出的额外见解:

将 Pinia 2(目前处于 alpha 阶段)与 Vuex 进行比较,我们可以推断出 Pinia 领先于 Vuex 4。

Vue.js核心团队为Vuex 5制定了一个开放的RFC,类似于Pinia使用的RFC。目前,Vuex通过RFC来尽可能多地收集社区的反馈。希望Vuex 5的稳定版本能够超越Pinea 2。

据同时也是 Vue.js 核心团队成员并积极参与 Vuex 设计的 Pinia 的创建者(Eduardo San Martin Morote)所说,Pania 和 Vuex 的相似之处多于不同之处:

尽管 Pinia 足以取代 Vuex,但取代 Vuex 并不是它的目标,因此 Vuex 仍然是 Vue.js 应用程序的推荐状态管理库。

根据我的个人经验,由于Pinea是轻量级的,体积很小,它适合于中小型应用。它也适用于低复杂度的Vue.js项目,因为一些调试功能,如时间旅行和编辑仍然不被支持。

将 Vuex 用于中小型 Vue.js 项目是过度的,因为它重量级的,对性能降低有很大影响。因此,Vuex 适用于大规模、高复杂度的 Vue.js 项目。

批处理是 React将多个状态更新分组到单个重新渲染中以获得更好的性能。

例如,如果你在同一个点击事件中有两个状态更新,React 总是将它们分批处理到一个重新渲染中。如果你运行下面的代码,你会看到每次点击时,React 只执行一次渲染,尽管你设置了两次状态:

这对性能非常有用,因为它避免了不必要的重新渲染。它还可以防止你的组件呈现仅更新一个状态变量的“半完成”状态,这可能会导致错误。

这可能会让你想起餐厅服务员在你选择第一道菜时不会跑到厨房,而是等你完成订单。

然而,React 的批量更新时间并不一致。例如,如果你需要获取数据,然后更新handleClick上面的状态,那么 React不会批量更新,而是执行两次独立的更新。

这是因为 React 过去只在浏览器事件(如点击)期间批量更新,但这里我们在事件已经被处理(在 fetch 回调中)之后更新状态:

在 React 18 之前,我们只在 React 事件处理程序期间批量更新。默认情况下,React 中不会对 promise、setTimeout、本机事件处理程序或任何其他事件中的更新进行批处理。

从 React 18 开始createRoot,所有更新都将自动批处理,无论它们来自何处。

这意味着超时、承诺、本机事件处理程序或任何其他事件内的更新将以与 React 事件内的更新相同的方式进行批处理。

我们希望这会导致更少的渲染工作,从而在你的应用程序中获得更好的性能:

注意:作为采用 React 18 的一部分,预计你将升级到createRoot。旧行为的render存在只是为了更容易地对两个版本进行生产实验。

无论更新发生在何处,React 都会自动批量更新,因此:

行为与此相同:

通常,批处理是安全的,但某些代码可能依赖于在状态更改后立即从 DOM 中读取某些内容。对于这些用例,你可以使用ReactDOM.flushSync()选择退出批处理:

2、Suspense 的 SSR 支持

这基本上是服务器端渲染 (SSR) 逻辑的扩展。在典型的 React SSR 应用程序中,会发生以下步骤:

典型 SSR 应用程序的问题在于,在下一步可以开始之前,必须立即完成整个应用程序的每个步骤。这会使您的应用程序在初始加载时变慢且无响应。

React 18 正试图解决这个问题。 组件已经以这样的方式进行了革命性的改变,它将应用程序分解为更小的独立单元,这些单元经过提到的每个步骤。这样一旦用户看到内容,它就会变成互动的。

我们将状态更新分为两类:

单击、悬停、滚动或打字等紧急更新需要立即响应以匹配我们对物理对象行为方式的直觉。否则他们会觉得“错了”。

然而,转换是不同的,因为用户不希望在屏幕上看到每个中间值。

例如,当您在下拉列表中选择过滤器时,您希望过滤器按钮本身在您单击时立即响应。但是,实际结果可能会单独转换。

一个小的延迟是难以察觉的,而且通常是预料之中的。如果在结果渲染完成之前再次更改过滤器,您只关心看到最新的结果。

在典型的 React 应用程序中,大多数更新在概念上都是过渡更新。但出于向后兼容性的原因,过渡是可选的。

默认情况下,React 18 仍然将更新处理为紧急更新,您可以通过将更新包装到startTransition.

构建流畅且响应迅速的应用程序并不总是那么容易。有时,诸如单击按钮或输入输入之类的小动作可能会导致屏幕上发生很多事情。这可能会导致页面在所有工作完成时冻结或挂起。

例如,考虑在过滤数据列表的输入字段中键入。您需要将字段的值存储在 state 中,以便您可以过滤数据并控制该输入字段的值。您的代码可能如下所示:

在这里,每当用户键入一个字符时,我们都会更新输入值并使用新值来搜索列表并显示结果。

对于大屏幕更新,这可能会导致页面在呈现所有内容时出现延迟,从而使打字或其他交互感觉缓慢且无响应。

即使列表不是太长,列表项本身也可能很复杂并且每次击键时都不同,并且可能没有明确的方法来优化它们的呈现。

从概念上讲,问题在于需要进行两种不同的更新。第一个更新是紧急更新,用于更改输入字段的值,以及可能会更改其周围的一些 UI。

第二个是显示搜索结果的不太紧急的更新。

用户希望第一次更新是即时的,因为这些交互的本机浏览器处理速度很快。但是第二次更新可能会有点延迟。

用户不希望它立即完成,这很好,因为可能有很多工作要做。(实际上,开发人员经常使用去抖动等技术人为地延迟此类更新。)

在 React 18 之前,所有更新都被紧急渲染。

这意味着上面的两个状态仍然会同时呈现,并且仍然会阻止用户看到他们交互的反馈,直到一切都呈现出来。我们缺少的是一种告诉 React 哪些更新是紧急的,哪些不是的方法。

新startTransitionAPI 通过让您能够将更新标记为“转换”来解决此问题:

包装在其中的更新startTransition被视为非紧急处理,如果出现更紧急的更新(如点击或按键),则会中断。

如果用户中断转换(例如,连续输入多个字符),React 将抛出未完成的陈旧渲染工作,仅渲染最新更新。

Transitions 可让您保持大多数交互敏捷,即使它们导致显着的 UI 更改。它们还可以让您避免浪费时间渲染不再相关的内容。

上述问题的一个常见解决方案是将第二次更新包装在 setTimeout 中:

这将延迟第二次更新,直到呈现第一次更新之后。节流和去抖动是这种技术的常见变体。

一个重要的区别是startTransition不安排在以后喜欢的setTimeout是。它立即执行。传递给的函数startTransition同步运行,但其中的任何更新都标记为“转换”。

React 将在稍后处理更新时使用此信息来决定如何呈现更新。这意味着我们比在超时中包装更新更早地开始呈现更新。

在快速设备上,两次更新之间的延迟非常小。在较慢的设备上,延迟会更大,但 UI 会保持响应。

另一个重要的区别是 a 内的大屏幕更新setTimeout仍然会锁定页面,只是在超时之后。

如果用户在超时触发时仍在键入或与页面交互,他们仍将被阻止与页面交互。但是标记为 的状态更新startTransition是可中断的,因此它们不会锁定页面。

它们让浏览器在呈现不同组件之间的小间隙中处理事件。

如果用户输入发生变化,React 将不必继续渲染用户不再感兴趣的内容。

最后,因为setTimeout只是延迟更新,显示加载指示器需要编写异步代码,这通常很脆弱。

通过转换,React 可以为您跟踪挂起状态,根据转换的当前状态更新它,并让您能够在用户等待时显示加载反馈。

您可以使用startTransition来包装要移动到后台的任何更新。通常,这些类型的更新分为两类:

总结

React 18 没有任何重大更改,因此,我们将当前的存储库升级到最新版本几乎不需要更改代码,但我们可以享受它们很酷的功能。