简单的状态管理JavaScript保姆状态
保姆国家是我编写的一个小库,用来帮助您使用Vanilla JS轻松构建基于状态的web应用程序。它类似于React,但是开销更少,而且需要学习新的语法。它还使用单个应用程序范围的状态对象,而不是每个组件都有自己的状态。它的灵感来自HyperApp,与Elm有很多相似之处。
在这篇文章中,我将解释保姆国家是如何运作的,然后用几个例子来演示它能做什么。
保姆国家使用单向数据流模型,由3部分组成:
- 状态-存储所有应用程序数据的对象
- 视图-一个基于当前状态返回HTML字符串的函数
- 更新-一个函数,它是改变状态和重新呈现视图的唯一方法
在保姆国家,国家就是一切。状态对象是应用程序的唯一真实来源——应用程序的每一点数据都是这个对象的属性。甚至视图中使用的事件处理程序也是状态对象的方法。
视图是状态的HTML表示形式。当状态改变时,它就会改变,并允许用户与应用程序交互。
更新功能是唯一可以更改状态的方法。它是更新状态的单一入口点,并确保更改是确定的、一致的和可预测的。
在“保姆州”(Nanny State)开发应用,你需要具备以下3个条件。事实上,它可以通过问自己以下3个问题来总结:
- 我需要在应用程序中存储哪些数据?这就构成了
状态
对象 - 我想如何在页面上显示应用程序数据?这将帮助您创建
视图
函数 - 当用户与应用程序交互时,应用程序数据将如何变化?的
更新
函数将用于此
你好,保姆国家!
要了解保姆国家是如何运作的,最简单的方法就是编写一些代码!我们将从一个基本的示例开始,然后尝试制作一些更复杂的东西。
运行以下示例的最简单方法是使用在线代码编辑器(如CodePen),或者通过安装保姆国家
包使用NodeJS。
将以下代码复制到CodePen的JS部分:
进口{保姆,超文本标记语言}从“https://cdn.skypack.dev/nanny-state”;常量视图=状态= >超文本标记语言`<h1>你好$ {状态。名字}h1>`常量状态={名字:“保姆国家”,视图}常量更新=保姆(状态)
这显示了保姆式状态的三个部分是如何协同工作的。让我们分别来仔细看看每个部分:
常量视图=状态= >超文本标记语言`<h1>你好$ {状态。名字}h1>`
保姆国家的使用µhtml来呈现HTML。的视图
函数总是接受状态对象作为其对象只有参数。然后使用超文本标记语言
函数由µhtml提供,基于模板文字创建html,它是作为参数提供的。
使用模板文字意味着我们可以使用变量$ {}
将状态属性插入视图的符号。在本例中,我们使用它插入名字
属性。<标题>
元素。
常量状态={名字:“保姆国家”,视图}
的状态
对象的位置所有存储应用程序数据。对象中显示的任何属性和值视图
并且可能会在应用程序的生命周期中更改,例如名字
属性。
请注意,视图
是作为也是一种属性的吗状态
使用对象简写符号。还记得国家就是一切-应用程序的每个部分都是国家的财产。
常量更新=保姆(状态)
最后一行定义更新
函数的返回值保姆
函数。属性的任何属性的值现在都可以用来更新状态
。事实上,它是只有任何性质状态
可以更新。控件的初始渲染视图
方法中提供的值状态
。这意味着将显示一个标题,上面写着“你好,保姆国家”,如下所示:
这个例子基本上只是一个静态页面。让我们添加一个输入框,允许用户输入他们想要打招呼的名字,从而使其成为动态的。更新代码,使其看起来如下所示:
进口{保姆,超文本标记语言}从“https://cdn.skypack.dev/nanny-state”;常量视图=状态= >超文本标记语言`<h1>你好$ {状态。名字}h1><输入oninput=$ {状态。changeName}>`常量changeName=事件= >更新({名字:事件。目标。价值})常量状态={名字:“保姆国家”,changeName,视图}常量更新=保姆(状态)
在这个例子中,我们添加了一个<输入>
元素的视图
。事件监听器是在视图中内联定义的,因此在本例中我们有一个oninput
事件侦听器附加到<输入>
元素。这将调用changeName
事件处理程序,它是状态对象的一个方法,无论何时检测到任何输入。这个事件监听器需要定义,所以让我们仔细看看它:
常量changeName=事件= >更新({名字:事件。目标。价值})
这是一个用Vanilla JS编写的标准事件处理程序。它像往常一样接受一个事件对象作为参数,当它被调用时,我们希望更新状态
对象,因此我们使用更新
函数,因为这是我们可以更新状态
。
提供给更新
Function是一个对象,它包含我们想要在状态中更新的任何属性和相应的新值。在本例中,我们要更新名字
属性设置为用户输入到输入字段中的值,该值是事件对象的一部分,可以使用event.target.value
。这将使用输入字段中的新值更新状态,并立即重新呈现页面。使用µhtml进行渲染意味着只有部分视图
实际上已经改变的东西会被更新。这意味着重新渲染后状态
更新既高效又快速。
这就是你的第一款保姆国家应用!尝试一下打字,你就会看到它对用户输入的反应有多快……而且只需要几行代码。你可以在下面的CodePen中看到代码:
保姆国家使得编写基于状态的响应式应用程序变得超级容易。如您所见,构建对用户交互做出反应的动态基于状态的应用程序不需要太多代码。这就是保姆国家的魅力所在。
真假测验
现在我们已经看到了一个基本的例子,让我们试着做一些更复杂的东西。我们将使用保姆国家来构建一个真假问答游戏。在CodePen上打开一个新笔,然后跟着做。
我们将以同样的方式开始,通过导入保姆国家库:
进口{保姆,超文本标记语言}从“https://cdn.skypack.dev/nanny-state”
接下来,我们将创建状态
对象,并用游戏将使用的初始属性值填充它:
常量状态={分数:0,指数:0,问题:({问题:“保姆国家”是指国家雇佣保姆的国家。,回答:假},{问题:“保姆国家也是啤酒的名字”,回答:真正的},{问题:“米拉·库尼斯和阿什顿·库彻雇佣了16名保姆来帮助抚养他们的孩子”,回答:假},{问题:《保姆麦克菲》系列电影改编自《护士玛蒂尔达》系列小说,回答:真正的},{问题:“保姆国家使用µhtml库进行渲染”,回答:真正的},]}
该对象包含3个属性:
分数
-这将记录玩家正确回答了多少问题,并从0开始指数
-这将跟踪玩家的问题,并对应于最后一个属性是问题
数组中。问题
-这是一个对象数组问题
和回答
属性。的问题
属性是一个字符串回答
属性是布尔值
现在我们已经创建了数据,让我们创建视图
为了可视化这些数据:
常量视图=状态= >超文本标记语言`<h1>对还是错?h1><h2>分数:$ {状态。分数}h2>$ {状态。指数<状态。问题。长度?超文本标记语言`<p>$ {指数+1})$ {状态。问题(状态。指数]。问题}p><按钮onclick=$ {状态。checkAnswer(真正的)}>真正的按钮><按钮onclick=$ {状态。checkAnswer(假)}>假按钮>`:超文本标记语言`<h2>比赛结束,你进球了$ {状态。分数}h2>`}`
这有点复杂视图
比我们在前面的例子中看到的要多,但是大部分应该是不言自明的。方法显示标题标题之后的分数分数
的属性状态
对象。然后我们使用三元运算符来派生视图。因为视图是使用模板文字编写的,所以不能使用if - else
语句要fork代码,所以需要使用三元语句。
这个三元语句检查ifquestionNumber
是小于长度的问题
数组,它基本上是检查是否还有任何问题需要回答。如果有,则问题显示有两个按钮,选中为TRUE,选中为FALSE。如果没有问题,我们就会显示GAME OVER信息,同时显示玩家的分数。
在使用三元操作符拆分视图代码时要注意的一件事是,您需要使用超文本标记语言
函数用于每个新fork。
这两个按钮都有一个内联onclick
事件监听器附加到它们,调用相同的事件处理程序,checkAnswer
并接受任何一种论证真正的
或假
取决于按的是哪个按钮。现在让我们编写这个事件处理程序:
常量checkAnswer=回答= >事件= >更新(状态= >({分数:回答===状态。问题(状态。指数]。回答?状态。分数+1:状态。分数,指数:状态。指数+1}))
此事件处理程序接受额外的参数回答
以及事件
所有事件处理程序都接受的对象,因此需要使用上面所见的双箭头符号对其进行curry。它调用更新
函数,该函数使用三元运算符检查作为参数提供的答案是否与当前问题的答案匹配,如果匹配,则分数
属性增加1,否则分数保持不变。的值也会增加指数
属性,因此将显示下一个问题。
事件处理程序现在需要添加到状态
,连同视图
。我们可以用对象简写法来做,只要checkAnswer
和视图
之前定义过状态
:
常量状态={分数:0,指数:0,问题:({问题:“保姆国家”是指国家雇佣保姆的国家。,回答:假},{问题:“保姆国家也是啤酒的名字”,回答:真正的},{问题:“米拉·库尼斯和阿什顿·库彻雇佣了16名保姆来帮助抚养他们的孩子”,回答:假},{问题:《保姆麦克菲》系列电影改编自《护士玛蒂尔达》系列小说,回答:真正的},{问题:“保姆国家使用µhtml库进行渲染”,回答:真正的},],checkAnswer,视图}
现在一切都是状态
,剩下要做的就是定义更新
函数调用保姆
功能和提供状态
作为论点:
常量更新=保姆(状态)
就是这样!测试应该立即开始,你应该能够回答每个问题,分数将根据答案是否正确而变化。另一个交互式应用程序的例子,可以用最少的代码快速构建。试着回答这些问题,看看进展如何。你可以在下面的CodePen中看到完成的代码:
一旦你玩得很开心,习惯了“保姆国家”的运作方式,这里有一些扩展游戏的想法:
- 添加更多问题
- 添加“开始”和“再次播放”按钮,允许玩家再次播放
- 随机选择问题
- 记录最高分
- 添加带有其他答案的问题,除了真或假
- 做一个选择题测试
“保姆式国家”还包括很多其他优点,比如对本地存储和路由的内置支持。看到的文档如果您有任何问题,请联系我们获取更多信息。
我很想听听你对保姆国家的看法。你会考虑在项目中使用它吗?你还有什么想知道的吗?请在我们的网站上留言社区!