云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

亚马逊云_虚拟主机建立_新注册优惠

小七 141 0

NgRx公司使用NgRx 8加快应用程序开发改进的人体工程学RX和无样板功能。

ngrx8引入了一系列改进,包括createAction、createReducer和createEffect。这些helper函数大大减少了样板文件(没有双关语的意思),从而提高了开发人员的生产率。NgRx 8:一场巨大的胜利Angular8发布后不久,NgRx团队发布了他们自己的版本8。这是一个很大的版本,对库进行了大量的改进。尽管我让您阅读Tim Deschryver的官方发布公告,但以下是亮点:由John Papa和Ward Bell提供的角度ngrx数据现在正式成为ngrx的一部分,即@ngrx/data运行时检查现在可以用来检查状态和操作是否是可序列化的(它们替换了ngrx store freeze包)由于模拟选择器,现在可以进行完全隔离的单元测试对@ngrx/router有一些改进,包括一个新的minimal routerState选项现在在johnpapa的角度片段VS代码扩展中有NgRx片段亚历克斯·奥克鲁什科和韦斯·格里姆斯已经加入了NgRx团队(当之无愧!)不过,我把最好的留到最后,这是本文的主题:createAction、createReducer和createEffect助手方法大大减少了样板文件,并缩短了开发时间我们将深入了解这意味着什么,以及这些函数如何使您的生活变得更好,但是在我们开始之前,我们应该确保您知道如何更新到版本8以利用这些新功能。"NgRx 8的特点是改进了开发人员的人体工程学,减少了样板文件,运行时检查和更容易的错误处理!"在推特上留言如何更新到NgRx 8为了更新到NgRx 8,您需要确保您的项目更新到Angular 8。可以通过运行以下命令全局更新Angular CLI:npm安装-g@angular/cli在需要更新为Angular 8的项目中,可以运行以下命令:ng更新@angular/cli@angular/core然后,您可以运行以下更新到NgRx 8:ng更新@ngrx/商店在写这篇文章时,我遇到了一个TypeScript版本的问题。似乎需要的版本之间有冲突,所以我不得不手动锁定版本3.4.3。如果您使用的是ngrx数据,可以使用以下命令轻松迁移到@ngrx/data:ng add@ngrx/data—迁移为了更彻底地解释这个过程,Wes Grimes写了一篇关于如何升级到Angular 8和NgRx 8的文章。有关迁移到NgRx 8的详细信息,请查看官方迁移指南。最后,别忘了Angular有一个官方的更新工具,可以帮助您迁移到Angular的新版本。别碍事了,让我们开始有趣的事情吧!create激动:新的NgRx 8助手函数关于NgRx(以及一般的Redux模式)最常见的抱怨之一是样板太多。但是,一旦您深入研究了库和模式,您就会开始理解,当您在大型、复杂的应用程序中管理状态时,初始设置是完全值得的投资(这正是NgRx的设计目的!)。也就是说,NgRx团队听取了开发人员社区的意见,并在版本8的"开发人员人体工程学"(一种更容易编写代码的奇特方式)方面做出了巨大的改进。大多数这些改进都是由于重构了动作、减缩器和效果的设置。现在有一些助手方法很容易理解,编写代码也更少。让我们把它们轮流拿。创建操作正如我的朋友mikeryan所说,"动作是NgRx面包的面筋。"事实上,它们是任何NgRx应用程序的核心。在决定你的应用程序需要什么样的操作时需要非常小心和注意。不幸的是,操作需要很多代码来设置。请看这段摘录自我最初的NgRx认证教程中构建的应用程序://src/auth/操作/授权操作.ts(节选)导出枚举AuthActionTypes{Login='[Login Page]登录',LoginComplete='[Login Page]登录完成',LoginFailure='[Auth API]登录失败'}导出类登录实现操作{只读类型=AuthActionTypes.登录;}导出类LoginComplete实现操作{只读类型=AuthActionTypes.LoginComplete;}导出类LoginFailure实现操作{只读类型=AuthActionTypes.LoginFailure;构造函数(公共负载:any){}}导出类型AuthActions=|登录|登录完成|登录失败;这个摘录只包含了应用程序中八个动作中的三个,它是一个非常小的应用程序!正如alexokrushko在他关于新动作创建者的优秀文章中所指出的,枚举和字符串也使我们很难看到动作在哪里被使用。别让我开始那些工会类型!你可以理解为什么需要改变。输入新的createAction方法。在createAction中,您可以将操作名称和带有指定参数类型的可选props函数作为解构对象传入。哎呀,这是很多行话。让我用一个例子来解释。假设我有一个名为booksLoaded的操作,它需要在创建时接收Book[]类型的books(books)数组。createAction的props函数是props()。(对于析构化,{books}相当于{books:books}。)export const booksLoaded=createAction("[Books API]Books Loaded',道具());这样,当我创建这种类型的新操作时,可以直接将books数组传递给构造函数:newbooksloaded({booksFromServer})。因此,上述身份验证操作将按如下方式重构:export const login=createAction('[login Page]login');export const loginComplete=createAction('[Login Page]Login Complete');export const loginFailure=创建操作([API登录失败],道具());真让人兴奋,对吧?这里有两件事需要注意。首先,请注意操作常量名称已从Pascal case(LoginFailure)变为camel case(LoginFailure)。这是由于操作从类变为函数,这是一种标准的JavaScript风格约定。不要让它绊倒你,但是在重构时要记住这一点。其次,请注意,我将payload重命名为error,因为它更具描述性。(我也可以给它一个新的类型,比如Error,但是在这个例子中这并不重要)。虽然这是重新设计的action creator函数的一个很好的新特性,但是要小心。搜索你的代码,以避免破坏应用程序依赖负载属性的其他部分(gregorwoiwode的一个很好的提醒)。如果在action creator中重命名有效负载,请确保在任何地方都对其进行更改。新动作制作人还有最后一个很好的特点。现在可以指定prop参数的默认值。例如,在上面的loginFailure操作中,我可以提供一个默认的错误消息:export const loginFailure=创建操作("[Auth API]登录失败",(errorMessage='错误登录')=>({payload:{errorMessage}}));这将是一个很好的备份,以防服务器由于某种原因无法提供错误消息。要将这些新动作创建者之一添加到应用程序中,可以使用更新的动作示意图:ng生成@ngrx/s化学:行动myNewAction--创造者此命令将生成一个名为my new的新文件-动作.actions.ts使用createAction函数包含名为loadMyNewAction的常量。"NgRx 8的新动作创造者在添加新功能时大大缩短了(没有双关语)开发时间!"在推特上留言createReducer公司创造动作的新方法令人难以置信,但它并不止于此。由于createReducer方法,reducer现在也更易于编写。下面是一个典型的减速机示例,您可能会在汉堡餐厅应用程序中找到:导出函数减速机(状态=初始状态,行动:汉堡行动计划):状态{交换机(动作类型) {案件BurgerApiActionTypes.LoadBurgerCollection: {返回{…状态加载:真};}案件BurgerApiActionTypes.LoadBurgersAccess: {返回{加载:正确,加载:假,ID:action.payload.map(汉堡=>汉堡.id)};}默认值:{返回状态;}}}这是一个简单的示例,但是随着它的扩展,您将有大量的case语句,这将使理解这段代码变得困难。很快就会变得一团糟(真的,就像吃汉堡一样)。对于NgRx 8,您可以使用createReducer代替:const burgerReducer=createReducer(初始状态,打开(BurgerApiActionTypes.loadBurgerCollection,状态=>({…州,加载:真})),打开(BurgerApiActionTypes.LoadBurgersAccess,(州,{burgers})=>({加载:正确,加载:假,ID:汉堡.map(汉堡=>汉堡.id)})));干净多了,不是吗?每个案例都使用接收操作的on函数和修改状态的函数。on函数还可以执行多个操作,使reducer函数更容易增长。例如,记录添加成功和记录删除失败通常会导致相同的状态。这方面的一个例子是,应用程序状态包括一个数据集合(应该与服务器上的数据相匹配)和一个id数组,以便更快地查找(在内存中维护)。为了确保id数组始终与服务器上的一致,有必要考虑添加或删除记录的失败。以下是burger应用程序的一个示例:const burgerReducer=createReducer(//…其他情况下,打开(collectionapiations.addBurgerSuccess,CollectionApaictions.removeBurgerFailure,(状态,{burger})=>{如果(state.ids.indexOf(汉堡.id)>-1){返回状态;}返回{…州,ID:[。。。状态.ids, 汉堡.id],};}),打开(收藏品