从零开始的Android新项目10 - React Native & Redux

Redux 与 MVI:Android 应用的对比 在为 Android 应用选择合适的状态管理架构时可能会感到困惑。在这个领域中,有两种流行的选择是 Redux 和 MVI(Model-View-Intent)。两者都有各自的优缺点,因此在深入研究之前了解它们的区别至关重要。本指南将深入探讨 Redux 和 MVI 的核心原则,突出它们在 Android 开发中的关键区别。此外,我将提供一些有用的资源链接,这些资源提供了更深入的见解和实用的实现示例。 Action Creator 函数 Reducer 函数 Store 创建与初始化 使用示例 MV 阅读详情

本篇来讲讲 React Native 和 Redux,和其他一上来就啪啪啪丢上来一堆翻译的东西不同,本文会从简单的例子入手,让大家能快速地明白 React Native 是什么,Redux 和常见的 MVC、MVP 等有什么区别,怎么去组织一个 Redux 架构的 React Native 项目。

为避免大家还没入门就放弃,预计下一篇才会从我们项目中的实践出发,讲讲更复杂的应用场景。

什么是React Native

React Native

React Native 使你能够基于 JavaScript 和 React 在原生平台上构建应用,提倡的是 “learn once, write anywhere”,复用代码,提高开发效率。

项目由 Facebook 开源驱动,在过去的近一年中更新很活跃。文档建议直接看官网的 React Native,中文站有点坑。

支持系统:Android 4.1 (API 16) 以及 >= iOS 7.0。

关于 React,可以参见之前为掘金翻译计划翻译的 React.js 新手村教程,简单来说 React 将应用分为一个个动态可复用的组件 —— View的渲染(JSX)、数据如何绑定到显示、状态的变更(State)、属性(Props)都包含在组件内部。

React.js

整个应用由一个个组件搭积木而成(组件式开发),而每个组件则由状态驱动而变更。

React Native 正像它的名字,将 React 带到了原生世界,和 H5 不同的是,我们不再使用 CSS 和 HTML,而只有 js 为伴。我们也不再有那些 div, input 这些标签,而是由 View, TextInput 等等取代,更符合原生开发者们的习惯。布局上,幸而有强大的 Flexbox 支持,如果开发者们之前有使用或者看到过 Google 在 GitHub 发布的 Android 版 FlexboxLayout,相信对它会很熟悉。原生开发中的页面栈,也由 Navigator 进行了实现(在 Android 上还有 BackAndroid 的返回键支持)。

与 WebView 不同,React Native 运行的界面,最终会被解释映射为原生的 View,可以直接使用布局边界或者 Hierarchy Viewer 看出层级(js 文件会打包为一个bundle,位于assets下面,RN引擎会加载并进行解释映射)。

好处
- 体验 web 开发的便捷,不再需要编译,重新加载一下 js 就行了
- 可以直接使用 Chrome 或者 Nuclide 调试
- Android / iOS 两端可以共享很大一部分代码(RN 还在进行 Windows, MacOS, Node-webkit 等平台的支持)
- 热更新,JS bundle 下发一下新的就行了(当然也有一定局限性,如果是 hybrid,则 native 的 RN module 部分不能更新)

坏处
- 前端开发不会原生做不了 React Native(除非你能真只用自带的那些东西),而且理解那些 RN 提供的组件也会很头晕(需要同时了解 Android 和 iOS)。
- 原生开发需要一定成本的学习实践才能掌握 React Native。毕竟 ES6 不像过去的 JS 那么傻瓜式了。
- React Native 目前仍然处于快速迭代开发的阶段,你永远也不知道下个版本自己升级需要修改多少原来的代码。
- React Native 的资料较少,尤其是国内的,更尤其是 hybrid 开发的(GitHub 上的开源项目大多是纯 RN 的)。

什么是Redux

Redux.js

Redux 本身和 React 并没有特别紧密的联系,而是 Facebook 提出的 Flux 架构的一种优秀实现,可以搭配其他任何框架一起使用。在 React 上使用,需要搭配 react-redux(如此一来 Redux 可以不局限于 React,而让社区发展出更多的 redux-* 中间件)。

Redux 在 React 的基础上(state 和 props),增加了 store、action、reducer 的概念,规范了全局一个 state,从而只需要根据这个 state 就能回朔出整个应用的状态。组件通过 dispatch 将 action 传到 store,reducer 根据原来的 state 以及 action,返回新的 state,组件根据新的 state 渲染界面。

Redux 是一个可预测的状态容器,即只需要有状态树,就能还原出“事发现场”。

从例子看项目

为了避免说一大堆概念,大家一头雾水,似懂非懂,这里拿一个例子来讲讲 React Native 和 Redux 结合后的效果,尽量避免代码的出现,而以图和文字代替。

Counter!没错,就是 Counter,不是 TODO,TODO已经被黑的不成样了。

项目源码位于:https://github.com/alinz/example-react-native-redux。包含了 Counter 和 Counters 两个子项目。前者是单个的计数器,后者则在前者的基础上增加了可以加减计数器个数的功能,相对更复杂一些,不过引入了一些不错的实践可以参考。

运行效果

先看看最后的效果,方便对应后面的解说。
第一个 Counter 项目很简单,就是一个文本框加上两个按钮,一个加1,一个减1。
第二个 Counters 项目在前者的基础上(使用了 Counter 组件),可以增加任意个计数器,还添加了带延迟的加1功能,来模拟耗时操作(下面有 gif 动图可以看活动效果)。

Counter

先看看Counter,我们从物理架构和动作流两个角度来进行观察。

目录下,有以下文件:

Counter List Files

index.android.js 和 index.ios.js 分别是 android 和 iOS 的 rn 入口,通常内容是相同的。
android 为 Android 的工程目录,下面有我们熟悉的 build.gralde。
ios 为 iOS 的工程目录,包含了 xcode 的项目。
app 就是 rn 的目录,包含了 Android 和 iOS 项目共享的 js 源码。
node_modules 是 node 通过解析 package.json 下载的依赖。

物理结构

Counter物理结构

CounterApp.js 则是整个应用的实际入口。

动作流

且不谈那些具体的 bind 和 createStore 操作,我们来看看当发生交互的时候,整个动作的分发,拿点击加号为例:

Counter活动图

onPress 事件触发了后续的一系列活动,而 Counter Component 的 action function 则由外部通过 props 传入(在这里,是 CounterApp 的 render 函数,如下)。

counterApp.js

再看看 store 的创建,在 App.js 入口:

app.js

而 Component 也不是直接调用 action 的,而是通过 bindActionCreators 注入到组件props中(这里是通过 react-redux 进行的,不是 redux 自身的东西,可以理解为 react 和 redux 之间的胶水):

action bind

Counters

接着我们来看看更为复杂的 Counters 项目,顶层目录结构类似,不再赘述。

demo

看完上面的 demo 动图后,相信大家对下面的解说会更容易理解。

物理结构

Counters物理结构

我们来详细讲一下 modules 下的 app 目录中的文件组织。

actions.js 和刚才一样,定义了一个个的 action,略有不同的是由于这次有异步的操作,所以涉及到了 dispatch 函数,关于 dispatch 可以查看官方文档。

constants.js 定义了所有 action 的 type,以及 App 的名字。

reducers.js 一样根据 action(payload 和 type)以及原来的 state 返回新的 state,另外,这里还进行了 initial state 即初始状态的定义(我们也可以把它放到单独的文件中)。

App.js 定义了页面的布局(渲染和 action),导出了 connect 生成的 container。我们简单看一下 render 部分是怎么做的。

Counters render

怎么样,JSX 是不是挺容易理解的?

动作流

Counter 本身的动作流上面我们已经举例过了,本工程中增减计数类似,唯一的区别是 action 不只有 type,还带了 payload(id)来标示不同的计数器。

所以这里我们拿增加计数器的点击事件来做例子。

Add Counter

看上去是不是跟上面的差不多?剩下的那个 incrementWithDelay 其实也差不多,只不过返回的是一个function,在 setTimeOut 回调中才进行 dispatch(thunk middleware 会帮我们进行处理)。

总结

上面我们通过物理结构和活动图大致了解了 React Native 上的 Redux 架构 app 是如何工作的。具体的细节,建议大家还是去查看 GitHub 上的源代码,通过上面的讲解后,应该不难理解。

技术栈

我们目前实践的React Nataive技术栈:
- immutable.js
- react
- redux
- react-redux
- redux-thunk
- redux-logger
- redux-mock-store
- react-native-router-flux
- react-native-simple-store
- regenerator
- undefined
- jest

更多阅读

Mark Zhai (翟一帆) wechat

欢迎您扫一扫上面的微信公众号,订阅我们的公众号!

详解Android中实现Redux方法 本篇文章给大家通过代码实例教学Android中实现Redux的方法,有需要的朋友跟着参考下吧。 立即下载

相关推荐

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2565

241.Redux架构

Redux 最初起源于 JavaScript 世界,用于解决前端应用状态管理问题,其核心思想是将整个应用的状态存储在一个全局的、只读的“Store”中,通过分发(dispatch)动作(Action)来更新状态,最终通过纯函数(Reducer)计算得出新的状态。Redux 强调“单一数据源”、“状态不可变”和“使用纯函数更新状态”这三个基本原则,因而具有可预测、可测试、可调试等显著特点。在 Android 开发中,尤其使用 Kotlin 语言,我们也可以应用 Redux 架构的思想。

2303_79132118的博客 1356

LWIP协议栈在STM32H7上的内存优化实战:如何用32KB RAM实现稳定千兆以太网通信

本文深入探讨了在STM32H7微控制器上,如何通过内存优化策略,在仅32KB的D2 SRAM中稳定运行LWIP协议栈以实现千兆以太网通信。文章详细分析了STM32H7的内存架构、LWIP的内存消耗瓶颈,并提供了从描述符表与PBUF池精确分配、链接脚本修改到MPU区域划分的一整套实战优化方案,旨在解决大数据量传输卡死等常见配置问题。

gg901的博客 603

android redux 架构,在 Android 中实现 Redux 的一点经验

简评: Redux 是一个用于应用程序状态管理的开源JavaScript库,其核心是通过可管理和控制的状态来描述一个系统。这意味着其思想其实是可以应用于任何类型应用的开发的,包括移动应用。Redux 架构基于一个严格的单向数据流,应用中的所有数据都是通过组件在一个方向上流动。Redux 希望确保应用的视图是根据确定的状态来呈现的。意思就是,在任何时间点,你应用的状态总是确定、有效的,并且可以转换到...

weixin_39836943的博客 351

第三篇:AMD 和 Intel

它像“乐高积木”一样,可以通过标准化的接口与其他部分组合,构建复杂系统。理解组件后,你会发现从操作系统到微服务,现代软件本质上都是组件的组合!

u013089100的博客 1031

(Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版

(Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版

weixin_44312889的博客 3778

Flutter项目-------一款以Redux为架构的Wan Android客户端

前言 在我司之前的一个项目是使用的fish-redux来做的,因为文档问题遭到国外同事的嫌弃,决定在新的项目里放弃fish-redux,因为各种原因,先后表示使用flutter_bloc,flutter_redux,经过各位大神的讨论,决定使用flutter_redux, 虽然花费了时间来看flutter_bloc, 但应该会白瞎不了,毕竟多看点东西也是好的,既然决定使用flutter_redux,那就有了这个项目的诞生。 之前用fish_redux做的项目,加上现在这个flutter_redux项目,说下

zcpHappy的博客 934

同花顺Supermind量化交易 风险控制建模--海龟交易法则

A.市场与标的海龟交易法则应用于流动性高的市场中,选择交易量较大的标的进行交易。本文以沪深300指数ETF为标的,构建海龟交易法则。B、仓位:仓位是海龟交易系统最核心的部分,通过ATR真实波幅指标来管理仓位。第一步:计算True Range,简称TR。TR = Max ( H−L , H−P , P−L ) ,其中H为当日日内最高价,L为当日日内最低价,P为前一日收盘价。第二步:计算ATRATR = mean ( TR , 20 ) , 即计算过去20天的TR的平均值,ATR是TR的移动平均值。

qq_22808537的博客 1497

ReactJS 101完整指南:从零开始掌握现代React开发的10个关键步骤

ReactJS 101是一本专门为初学者设计的React中文入门教学书籍,旨在帮助开发者从零开始掌握现代React开发的核心概念和最佳实践。这本指南由浅入深地介绍了React生态系统的各个方面,包括Flux、Redux、React Router、ImmutableJS、React Native、Relay/GraphQL等技术,让你能够打造跨平台的高质量应用程式。无论你是前端开发新手还是想系统学习

gitblog_01024的博客 719

手把手教你学simulink实例--基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台

电动汽车的动力总成(Powertrain)是车辆的核心系统,包括动力电池、电机控制器、逆变器和驱动电机等关键部件。动力总成的控制策略直接影响车辆的动力性能、能耗效率和驾驶体验。为了验证和优化这些控制策略,基于MATLAB/Simulink的仿真平台成为一种高效且经济的解决方案。本项目旨在构建一个完整的基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台,涵盖控制策略建模、性能评估以及参数标定等功能模块,并通过仿真验证系统的有效性。

MHD0815的博客 299

事件驱动的 SAP 工作流:从 BOR 事件到 Event Linkage 的落地与排障全景图

摘要: SAP工作流中的Event是业务对象状态变化的系统广播机制,如发票录入、采购订单释放等事件。通过事件驱动,业务程序与流程引擎解耦,业务只需发布事件,流程引擎负责后续处理。文章详细解析了SAP工作流事件的完整链路,包括事件定义、触发机制、事件容器传递、SWE2配置的关键作用,以及事件不触发时的排查方法。重点介绍了事件在启动流程、终止任务、等待步骤和主动创建中的应用,并结合采购订单审批案例说明事件的实际使用场景和配置要点。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 189

从零开始的Android新项目10 - React Native & Redux

本篇来讲讲React Native和Redux,本文会从简单的例子入手,让大家能快速地明白React Native是什么,Redux 和常见的 MVC、MVP 等有什么区别,怎么去组织一个 Redux架构的 React Native 项目。

魔都三帅 559

SRS流媒体服务器在Windows下的安装

在之前的流媒体开发中(视频会议),我基本上使用nginx加模块的方式进行学习、测试,正式开发的时候改为服务器端用EasyDarwin,客户端用rtsp-simple-server(这些流媒体服务器的用法见我以前的博文),这样可以充分利用客户端的资源,降低服务器端的压力。在流媒体协议方案,我选择相对较快的rtsp。这个协议优点是支持UDP协议,优化好的环境下可以实现3秒以下的延迟,基本满足甲方要求,缺点就是不支持网页播放。

dgnankai的专栏 2023

Etherpad GDPR PR1 删除控制详解:一次性删除令牌、`allowPadDeletionByAllUsers` 与授权矩阵

本文深度解析 Etherpad 针对 GDPR 合规五步计划(issue #6701)中的第一步(PR1)——**Pad 删除控制(Deletion Controls)**。它引入了一次性删除令牌(one-time deletion token)、管理员级权限开关 `allowPadDeletionByAllUsers`,以及支撑现有 "Delete pad" 按钮在无创建者 Cookie 场景下

gitblog_00158的博客 421

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

React Native Boilerplate 常见问题解决方案

React Native Boilerplate 常见问题解决方案 1. 项目基础介绍和主要编程语言 React Native Boilerplate 是一个为个人使用准备的 React Native 和 Redux 脚手架项目。它包含了 React、React Native、React Navigation、Redux 等常用库的配置,帮助开发者快速启动一个新的 React Native 项目。...

gitblog_01055的博客 775

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

React Native状态管理实战:Redux Toolkit落地指南

在移动前端开发中,状态管理是保障应用稳定性与可维护性的核心能力。React Native因跨线程通信、原生模块交互、离线场景等特性,使传统useState+useContext方案极易引发状态不一致、更新丢失和调试困难等问题。Redux Toolkit(RTK)凭借自动不可变更新、TypeScript深度集成、标准化异步处理及RN友好持久化支持,成为现代React Native项目的首选状态管理方案。它不仅解决组件间状态共享难题,更支撑课程订阅同步、相机回调响应、安全区域适配等典型RN业务场景。本文聚焦真实

csdndownload11123的博客 348

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何快速上手React Native Starter Kit:从零开始构建移动应用的10个步骤

React Native Starter Kit是一个功能强大的React Native模板应用,能够帮助开发者快速搭建移动应用框架。本文将通过10个简单步骤,带你从零开始使用这个高效工具,轻松构建跨平台移动应用。 [![React Native Starter Kit标志](https://raw.gitcode.com/gh_mirrors/re/react-native-starter-k

gitblog_00102的博客 385

React Native从零开始构建项目(2019)

环境搭建,参考官网 https://reactnative.cn/ 安装 Xcode Android Studio 目的,实现本地热重载开发,使用vsCode 运行失败,重新执行react-native init Demo //生成 ios 离线包 mkdir release_ios react-native bundle --entry-file index.js --pl...

lee 437

Czkawka Mac磁盘清理完整指南:快速定位重复文件、空文件夹与相似图片

Czkawka 是一款基于 Rust 编写的免费开源磁盘清理工具,支持 Mac、Windows 与 Linux。它能通过一次扫描找出重复文件、空文件夹和相似图片,帮你把占用的存储空间安全地释放回来。本文带你完成从部署到日常使用的全部路径。 ## 存储告急时,你真正缺的是"定位"能力 Mac 弹出"存储空间不足"的提示时,大多数人第一反应是翻文件夹。但重复的备份、散落各处的空目录、几十张几乎一样

gitblog_00853的博客 1150

从0到1开发OneM:React Native新手入门到实战的完整教程

OneM是一款基于React Native构建的综合性App,集杂志浏览、音乐播放和视频播放功能于一体。本教程将带你从零基础开始,掌握React Native开发技巧,最终完成企业级移动应用的搭建。无论你是React Native新手还是有一定经验的开发者,都能通过本指南快速上手OneM项目开发。 ## 🚀 项目概述:为什么选择OneM作为学习案例? OneM项目采用Redux进行状态管理,

gitblog_01082的博客 931

Ignite Bowser快速开始:从零搭建React Native项目的完整教程与避坑指南

Ignite Bowser 是 Infinite Red 团队出品的人气 React Native 项目模板(boilerplate),自带 TypeScript、MobX State Tree 状态管理和代码生成器,让你几分钟内就能跑起一个工程结构规范的跨端 App 项目。本文面向新手,带你从零开始快速搭建项目,并提前避开几个最常见的坑。 ## 📦 它是什么?一套开箱即用的 React Na

gitblog_00689的博客 1016

一个空格键的功夫:QuickLook 快速预览 100 多种文件的完整指南

想在 Windows 上瞄一眼文件内容,通常得双击、等应用启动、看完再关掉,来回十几秒。QuickLook 把 macOS 上"空格键快速预览"的习惯搬到了 Windows:在资源管理器选中文件,按一下 Space,预览窗口立刻弹出;再按 Esc 或 Space 关闭,全程不打开任何重型应用。 ## 为什么 Windows 一直缺这块能力 macOS 用户想确认文件内容,按一下空格就行,任何文

gitblog_02807的博客 620

react-native全栈项目搭建

先贴上最终成果代码地址:https://gitee.com/wuchunling/reactNativeApp.git 再贴上最终最终成果效果图:(在Android模拟器运行效果图) reactNativeApp 项目介绍 这是一个搭建好的react native项目架构,采用react-native官方推荐的react-navigation导航库,项目StackNavigator与T...

吴纯玲的博客 2267

React Native开发指南:从入门到实战

React Native作为跨平台移动开发框架,允许前端开发者使用JavaScript和React知识构建原生应用。其核心原理是通过JavaScript桥接原生组件,实现接近原生的性能。在技术价值上,React Native显著降低了移动开发门槛,使Web开发者能快速转型。典型应用场景包括快速原型开发、跨平台应用构建以及已有React团队的技术栈扩展。本文基于React Native热词和行业高频搜索关键词,重点解析环境搭建、核心组件差异和性能优化等实战技巧,帮助开发者高效掌握这一热门技术。

weixin_30265103的博客 382

如何快速开发React Native电商应用:从搭建到上线的完整指南

React Native是一个用于构建原生移动应用程序的JavaScript库,支持iOS和Android平台开发。本文将带你从零开始,用React Native打造一个功能完善的电商平台,涵盖项目搭建、核心功能实现、调试优化到最终部署的全流程,让你轻松掌握跨平台电商应用开发的关键技能。 ## 🚀 快速搭建React Native电商项目 ### 环境准备与初始化 首先确保安装Node.js

gitblog_01049的博客 1023
上一篇: 从什么都不懂开始(四)——Git掌握时空之力
下一篇: React Native 0.31 Bundle 预加载优化
魔都三帅
博客等级 码龄18年 218粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值