Tag: redux

在本地原生共享库扩展

共享扩展名:React Native和Redux。 他在西班牙干草堆上进行了现场勘查,并在西班牙的埃斯巴萨和西班牙的萨尔瓦多省的萨洛尔河之间进行了考察。 分享到以下内容:扩展名:无限制的扩展名:没有必要的扩展名: ¡阿斯奎·瓦莫斯你好! 从根本上讲,Remote Persist(empleando como storage AsyncStorage )和Obtiene Toda laInformationación中立语言是什么意思,重要的是store和其他store 。 Apple的Android操作系统保护功能可扩展到Android设备上的共享库扩展名,适用于Apple sistemas,Apple Bi estEstéculovoy和ceñirmetan solo al sistema操作Apple的扩展名zh-cn上的Androidescribiréuna segunda parte contando los pasos)。 诺塔 iOS las extensions(tanto las denominadas Share como las Action)上的Antes de comenzar es Importante destacar quesséparados,por a que no tienen acceso la carpetaprinciple laaplicación,es decirs es losdecurséscom的儿子tratadas como contenedores […]

Redux —我如何理解?

初次见到Redux时,乍一看似乎有些令人不知所措。 但是,如果您想有效地使用Redux,则必须了解它的工作原理以及其核心要素。 状态…动作…减速器…存储…在今天的帖子中,我想向您介绍Redux,以便您可以了解其工作原理。 什么是Redux? 如果您完全不熟悉Redux,则可能需要先检查Redux文档。 Redux是JavaScript应用程序的可预测状态容器。 它可以帮助您编写性能一致,在不同环境(客户端,服务器和本机)中运行且易于测试的应用程序。 最重要的是,它提供了出色的开发人员体验,例如实时代码编辑和时间旅行调试器的结合。 请记住,您无需成为Web开发人员即可在您的应用程序中使用类似Redux的架构。 在各种平台上都有很多这样的想法,ReSwift就是其中之一。 档案(州) 如果我问您,应用程序中的状态是什么样的,那么很难立即解释它。 一些值存储在视图模型中,有些存储库也存储一些值……哦! 那里的类​​知道当前正在登录的用户。但是,如果在这样的问题之后我们可以立即显示应用程序的状态呢? 对我们来说,以这种方式订购的应用程序难道不是很容易吗? 在这种情况下,Redux会为我们提供解决方案。 想象一下,您的状态就像存档,您完全知道在哪里寻找事物,并将其存储在一个结构中。 当然,具有较大的结构并不表示将是一团糟。 您可以将状态存储在归档抽屉中,这些抽屉将代表登录屏幕,设置屏幕等的状态。 字母(动作) 所以……现在我们的档案中有一个整齐的结构化状态,所有内容都很干净,并且易于推理。 但是,正如您可能期望的那样,我们的用户很有可能希望以某种方式更改此状态(我想这并不是什么新鲜事物)。 我们该如何处理? 好吧,我们不能直接访问我们的应用程序状态并更改我们想要的内容。 那不是您使用干净存档的方式……让我们想象一下我想更改我的地址。 我不能只是走进市政厅去玩他们的档案。 我需要写一个正式的字母。 标题:约翰·多伊(John Doe)—地址更改 您好,我刚搬到另一所房子。 我目前的地址是Art Street 10。 不用担心,当我们更改应用程序的状态时,我们只需要关键信息。 因此可能看起来像这样: 但是,有时我们无法立即准备此类信件,因为我们还没有所有必需的数据。 当我需要执行http请求时,我还不知道响应。 对于这种情况,我们必须聘请会计师。 他们将完成所有工作,然后代表我们发送一封信。 例如,在收到服务器的响应后,他们将在信中填写所需的信息并将其发送给我们。 信准备好后,您必须将其发送到市政厅。 有很多人在这里工作,照顾各种事情。 有些人处理您的地址信息,有些人处理您的汽车登记等……他们用您来信中的数据更新档案后,他们会通知您,以便您例如可以更新待办事项列表并划掉“更改地址” …或更新您的Facebook状态。 应用程序内部的reducers也是如此。 如果创建了新状态,则将通知所有对此更新感兴趣的地方。 市政厅员工(减速机) 正如我说的那样,在市政厅里,有很多人在照顾各种事情。 这些是我们应用中的减速器。 想象一下,在收到我们的信之后,该信将交给cityHallDirector,后者将其呈现给该市政厅中的每个工人。 他们中的一些人会看一下它,而只是忽略它,因为他们看到他们不熟悉该标题。 但是到某个时候,会有人说:“哦! 我负责地址更改,我必须处理!”。 请记住,要求市政厅工作人员进行任何更改的唯一方法是给他们这样的信件。 “……”是点差运算符。 […]

Swift-ier Redux实施-第一部分

这是一系列中级帖子的第一个。 第二部分即将推出 。 如果您是忙碌的开发人员,请随时跳过本文,直接转到代码: https : //github.com/wircho/Swux React + Redux组合提供了一个非常强大的Web反应模型,隐藏了反应体系结构令人困惑的一面,并提供了可读且具有同步外观的应用程序代码。 下图概括了Redux背后的范式,即单向数据流 。 商店实体独自负责使用一种称为reducer的函数来改变和提供应用程序状态 (该值包含在任何时间点唯一确定应用程序UI所需的所有信息),并且该函数具有旧状态和一个action ,以及返回新状态。 该应用可能会调度 (提交) 商店排队的动作以连续改变应用状态并通知订户 。 订阅者收到新状态后,必须使用它来更新应用程序的UI。 当我进行移动开发时,有时会想念这种范例的简单性,因为大型项目有时会变成反应性元素,回调和委托的混杂体。 因此,我最近决定探索ReSwift,并确定它在Swift中是否与原始JavaScript工具一样好。 在大多数情况下是这样,但不难看出它怎么可能更快。 一个示例是reducer函数的签名(从此处开始): (_动作: 动作 ,_状态: 状态 ?)-> 状态 在Swift中,该签名可以做成: (_动作: 动作 ,_状态:进入状态 ?)-> 无效 实际上,虽然第一种形式迫使您创建状态的副本或全新状态,但是第二种形式使您可以更改状态,从而在更少的行中编写更具可读性的代码。 由于Swift的写时复制值类型和专有所有权功能,该代码还可以更快地运行并且使用更少的内存。 我也不喜欢这种类型转换(来自ReSwift的README.md)的switch语句,它的形式是从JavaScript借来的: func reducer (操作: 操作 ,状态: AppState吗?)-> AppState { var state =状态?? AppState () 切换动作{ 案例_作为CounterActionIncrease : […]

React Native –从零开始到App Store

计划 应用程式创意 使用的技术 开发环境 应用结构 打字稿介绍 付款介绍 推送通知简介 介绍持久性Redux存储 苹果评论修复 最重要的提示 结论 应用程式创意 一年前,我搬到柏林,面临非常不同的挑战。 每当您需要与当地行政办公室进行互动时,都需要预约。 这就是问题所在,通常最接近的可用约会日期是一个月,但是如果您很幸运并且有足够的空闲时间整天刷新包含可用约会的页面,则可以在下周获得一个。 但这不是我们的方式,我和我的朋友决定将其自动化。 使用的技术 反应本机 React Native· 使用React构建本机应用程序的框架 使用Reactfacebook.github.io构建本机应用程序的框架 打字稿 TypeScript –可扩展的JavaScript。 TypeScript为您带来了可选的静态类型检查以及最新的ECMAScript功能。 www.typescriptlang.org Redux 自述文件·Redux 如果您来自Flux,则需要了解一个重要的区别。 Redux没有… redux.js.org I18n i18next / react-i18next react-i18next-国际化的反应正确。 使用i18next i18n生态系统。 github.com “ redux-persist”模块 rt2zz / redux-persist redux-persist –坚持并补充redux存储库 github.com 后端API的Node.js(本文未涵盖) 二手平台功能: 推送通知 应用内购买(可续订) 开发环境 React […]

Swift中Redux入门–第1部分

一种学习Swift中Redux入门的简单方法。 Redux是一种架构软件模式的实现,该模式优先考虑单向数据流。 它是由Flux架构(由Facebook开发)创建的,在应用程序的开发中已取得了长足的发展,并有望在其使用中带来巨大的优势。 它是诸如MVC,MVVM和Viper之类的其他架构模式的替代。 好处 Redux的巨大希望之一就是创建约束条件,以鼓励更有组织的软件开发和测试,因此,由于这些原因,最终会降低开发阶段的复杂性,并提供维护应用程序状态和高级调试的工具。 。 本文介绍了一种开始了解这种新模式的简单方法。 实施要求 在iOS(Swift + Xcode)上构建应用程序的基本级别。 观察者模式知识。 知道如何使用CocoaPods依赖系统。 组件 状态:代表应用程序的状态。 只能有一个,可以分为子状态。 动作:这些是描述系统功能的简单对象。 根据情况,这些对象是否可以携带信息。 它们是由View层调度的,目的是更改应用程序的状态。 减速器:这是我们开发应用程序主要逻辑的地方。 减速器必须是无副作用的纯函数,并且必须是同步的。 它们是唯一可以为应用程序创建新状态的对象。 给它们一个动作和当前状态,并返回一个新状态。 请注意,单向流是在View调度Action时发生的。 此Action传递到相应的Reducer,因此,此Reducer根据先前的Action生成一个新的State,并将State传递回View,以便对其进行更改。 商店:这是此实现过程中最重要的组成部分。 它是汇总上述所有组件并使流程正常工作的原因。 View将新的Action调度到商店。 然后,商店将此动作与当前状态一起传递给Reducer,然后接收回还原器的新状态。 每当创建新状态时,都会警告视图,这可以通过实现观察者设计模式来实现,该观察器设计模式允许视图成为要通知的商店的“订户”。 开始吧 我开始学习Redux的方法是使用一个名为ReSwift的库来构建示例应用程序(“ Rock,Paper and Scissors”游戏),该库在Swift中实现了该架构的概念。 我们首先概述应用程序的外观。 为简单起见,该应用程序应在单个ViewController上工作,在底部包含3个按钮(Rock,Paper和Scissors),在顶部包含1个消息字段,并包含2个占位符,以显示玩家何时进行移动以及最后移动揭示玩家的武器。 为了开始开发,我提出了一个用例,其中Player1选择剪刀,而Player2选择Rock ,从而赢得了Player2的胜利。 该流将发生如下: 发展历程 在Xcode中创建一个新的“单视图应用程序”项目,并使“包含单元测试”能够使用Redux的概念进行测试。 使用CocoaPods安装“ ReSwift”吊舱。 接下来,我们将创建第一个组件,状态。 查看上图,我们可以清楚地看到应用程序在执行过程中将发生变化的部分,其中每个部分都由应用程序的状态组成。 然后,我创建了一个State.swift文件,并将状态形成结构以及可能形成应用程序概念的模板结构放入其中。 重要的是要指出结构必须是不可变的,以便Redux起作用,只有这样我们才能确保状态仅由化简器更改,因此我使用了Structs和Enums而不是Classs: 现在让我们创建一个动作,该动作将描述打算更改状态的动作。 在这种情况下,我们只有一个ChooseWeaponAction ,它在每个玩家选择武器时触发: 最后,我们将构建减速器。 在这里,我们过滤创建的Action,获取应用程序的当前状态,并根据将使用Action中包含的信息开发的逻辑来生成新的State: 测试 […]

Redux for Swift(第4部分)—路由和导航

在第2部分和第3部分中,我们将ReactiveRedux集成到示例项目中,以连接ViewController1和TableCell以启用自动订阅,现在ViewController1可以完美地隔离工作。 在本章中,让我们讨论一下冗余视图控制器如何相互导航。 首先添加一个新的与redux兼容的视图控制器ViewController2 : 路由器中间件的外观如何? 事实证明,没有比引用路由器的对象更复杂的了,并且只要某个动作是屏幕,就可以执行导航: 这只是AppRouter的最基本实现-随着应用程序尺寸的增加,它肯定会具有更复杂的路线和导航方法。 但是可以肯定的是: ViewController1仍然完全不了解外部世界,这始终是我们的首要目标。 在下一章中,我们将探讨最复杂的主题:中间件的异步工作。 ReactiveRedux提供了一个称为Saga的副作用模型 (以流行的redux库redux-saga命名和建模),但这绝不是一个简单的概念。 在此期间,请查看我们到目前为止所取得的成就: protoman92 / ReduxForSwift 我在Redux for Swift上编写的Medium文章的代码。 – protoman92 / ReduxForSwift github.com

Swift中的Redux模式

在Swift中进行Redux吗? 是否可以在Eine iOS App中恢复JavaScript库并消除JS Zeug残酷的问题? 在设计模式和建筑设计中的修女,以及其他的书目。 标准MVC模式和ViewController之间的问题,由Gerl mal ins Endlose reichen负责。 Testbarkeit istfürnArsch,死于Übersichtüberdas ganze Projekt。 Dann haben wir noch den viel zu oft kopierten Code um wieder and wieder die gleichen Dingeauszuführenetc pp。 Natürlichgibt es daunzähligeMöglichkeiten(Wie immer)死于问题zulösen。 iOS Swift Blase lebe的应用程序之类的应用程序,以及React Native的其他应用程序。React.js在Webprojekte网站上的发布,请立即订阅。 Eine kleineErläuterung,我们的人eigentlich sich dieMühemachte,sich das Redux Prinzip zuüberlegen: 在React ist中,Komponenten aufgebaut ist中的dass eine […]

Swift中的单向数据流架构(Redux)

我非常喜欢使用Swift的可重用和干净的架构。 在我的上一个项目中,我实现了MVVM和面向协议的体系结构,这有助于将关注点分开。 我也曾按照MVC方法从事过几个IOS项目。 在开始新项目或适应旧代码的同时选择正确的体系结构很重要。 我必须找到有关iOS体系结构模式的综述,如果您也感兴趣的话,可以介绍常见的体系结构。 iOS架构模式 揭秘MVC,MVP,MVVM和VIPER medium.com 但是有一种更好的方法(以我的拙见)主要是在我的经验中,MVVM在保持轻巧的同时做得很好,并且我确实在Swift中使用MVVM实现了单向数据流(Redux)方法,这产生了巨大的变化。 它使干净的体系结构稍微好一点,健壮且可测试 ,因此很重要 在本文中,我试图解释为什么将Redux与Swift结合使用是更好的主意。 首先,我们需要了解该概念的基础。 因此,让我们开始吧! 什么是Redux和单向数据流? Redux是一种流量实现,但实现略好一些,它使您的应用程序状态更加可预测。 它首先以强大的javascript库React作为JavaScript应用程序的可预测状态容器出现在Javascript世界中。 Redux,仅使应用程序的状态位于单个存储对象中。 因此,从应用程序/视图的生命周期状态触发操作会发生变化,而针对该操作的化简器会生成新状态。 关于Redux的另一种解释,您可以阅读Redux的卡通指南介绍 Redux的卡通简介 导致比Flux更加混乱的一件事是Flux和Redux之间的区别,这种模式以前是… code-cartoons.com 让我们开始; 在本文中,我使用了benjaminencz的ReSwift,后者在Swift上创建了Redux实现。 ReSwift是Swift中单向数据流架构的类似Redux的实现。 ReSwift可帮助您将应用程序组件的三个重要方面分开: 重新浏览参考 ReSwift正在快速发展,超越了核心库,它提供了用于路由和时间旅行的实验性扩展… reswift.github.io 状态:在ReSwift应用中,整个应用状态都明确存储在数据结构中。 这有助于避免复杂的状态管理代码,实现更好的调试,并具有许多其他好处…… 视图:在ReSwift应用程序中,当状态更改时,视图也会更新。 您的视图成为当前应用程序状态的简单可视化。 状态更改:在ReSwift应用中,您只能通过操作执行状态更改。 动作是描述状态变化的小数据。 通过极大地限制状态改变的方式,您的应用程序变得更易于理解,并且可以与许多协作者一起工作。 从ReSwift网站剪辑 用法 在这个简单的示例中,我声明了一个BaseState,因为struct带有两个状态。 BaseReducer已注册其减速器。 LoadingState struct处理显示正在加载微调器视图或隐藏视图的状态 ,是否具有isLoading属性知道当前正在加载? 它是在视图中旋转或在状态中旋转的类型。 然后,声明的LoadingAction具有两个结构, LoadingShowAction将类型传递为有效负载,而LoadingHideAction不包含任何有效负载。 最后,LoadingReducer采取操作( LoadingShowAction或LoadingHideAction )和当前状态,并生成一个新状态。 简单。 因此,此时我们可以调度一个动作,即; store.dispatch(LoadingShowAction(type:.Normal))显示微调器 store.dispatch(LoadingHideAction())隐藏微调框 。 […]

ReactiveSwift over上的单向架构-第一部分:Redux

(最初在 此处 和 此处 发布在Sigma Software博客上 ) 共同的可变状态是万恶之源。 ©Henrik Eichenhardt 自从Facebook在2014年推出Flux以​​来,Dan Abramov和Andrew Clark发布了它的继任者/替代Redux,因此在软件开发世界中有很多关于单向架构的炒作。 我最近发布了我在ReactiveSwift上实现Redux的初始版本。 本文简要(不是真的)总结了为什么这样做的原因,以及为什么我认为它与已经为Swift编写的其他Redux内容有所不同。 我(以及我将在下面提到的其他库)试图解决什么问题? 答案非常简单和明显-状态管理。 如今,应用程序已变得如此庞大,对可预测状态管理的需求促使人们创建了诸如Redux之类的可预测状态容器。 与服务器端解决方案不同,客户端应用程序需要另一种降低整体解决方案复杂性的方法。 无论目标是哪个平台客户端应用程序(浏览器还是移动设备),它都应该执行处理大量事件的非常复杂的任务:用户输入,平台状态更改,网络事件和更新。 通常,一个应用程序内部有很多不明显的数据流:在用户输入时触发网络请求,同时在应用程序的存储中存储一些临时状态,解析响应并将另一个写入事务写入应用程序的存储,如果用户在第一个正在进行的过程中排队另一个网络请求随着输入的改变,他的想法…针对移动设备的特定事物变得更加疯狂,因为多线程跳入了该游戏。 移动开发人员需要麻烦的是仅在主线程上进行UI更新,避免在接触数据库时并发,避免死锁等。长话短说, 原始Redux文档最终以可预测状态管理的三个原则为基础。 如果您对原始作者的详细披露感兴趣,我将给他们命名,并让您在这里阅读更多。 这些是: 真理的单一来源 状态为只读 使用纯函数进行更改 我将简要介绍实现它们的Swift端口: ReSwift已经存在了一段时间。 它大约有5,000个github星级,并且是所有主要Swift版本的最新信息。 该库与原始JS实现紧密移植,因此增加了一些讨厌的Swift功能,例如通用状态类型,强大的订户类型等。 ReduxKit也被广泛使用,但已被ReSwift弃用。 也有一些鲜为人知的实现,例如this,this和this,但是它们只是从人们的项目中摘录而来,并没有得到很好的维护,无法用作社区验证的解决方案。 总体而言,他们建议以下应用数据流(出于显而易见的原因,称为“单向”): 在这里,我们仅看到有关上述原则实施的一些细节: Store是应用程序State 唯一真实来源 订阅Store更新时, State是只读的并且可以通过视图观察 State由称为Reducer的纯函数修改。 他们拥有先前的状态和视图发出的动作,从而计算出新应用的状态。 封装将减速器隐藏在视野之外,因此状态更改是隔离的。 关于为什么我仍然还是想出自己的https://github.com/soxjke/Redux-ReactiveSwift? 以下是我认为仍然更好的一些原因: 简单。 尽管ReSwift涵盖了观察,订阅/取消订阅,事件分发,线程安全,接口和协议等方面,但我的解决方案利用了ReactiveSwift的强大功能,并或多或少地由单个Store类表示。 对于我来说,上述所有东西都是开箱即用的,因为我使用了MutableProperty在Store MutableProperty 灵活性。 我的Redux实现提供了由通用State和Event类型参数化的Store ,并为Defaultable类型提供了一些类型扩展,如果状态类型提供了默认值,则允许Store初始化而没有默认状态。 ReactiveSwift的PropertyProtocol和BindingTargetProvider协议的一致性为使用简单的<~运算符绑定状态/事件流提供了可能性。 强大且易用。 借助ReactiveSwift的State […]

React-Native ListView renderRow传递道具问题。 正确的方式或错误的方式

在React-Native中使用ListView,我已经看到,这是不一样的,移动道具到列表项, 将函数作为道具传递给引用,并调用子组件中的参数 将函数传递给定义参数的道具,并在子中调用没有参数的函数 这些解决scheme都不起作用。 被调用的函数是Redux的Actions创build者,并被调度。 这是一个Redux或React-Native(也许是ReactJS)的问题 这是一个片段,市场作为//错误的代码行,没有工作,跟着好的 class App extends Component { // On props // data: an Array // doThis: an action creator of Redux // doThat: idem constructor(){ super(); this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); } render () { const dataSource = this.ds.cloneWithRows(this.props.data); return ( <View> <ListView style={{flex:1}} dataSource={dataSource} […]