碎碎念
近日王宝强(本来是想用‘宝宝’来称呼,但是我为人高冷,还是用原名吧)的离婚闹得沸沸扬扬,热度是不是已经远远超过了里约奥运。无下限的网友各种恶搞,从‘潘金莲照顾武大郎’到‘宝宝捉奸’,只说一句:万能的网友捉奸视频有没有?刚看到王宝强的微博,只想说:唉,下贱的小娼妇,但是细想与我何干?毕竟我不知道谁是谁非,这里不做评判。
导语
ReactNative也出了一年多了,facebook还在忙碌的修复各种问题,截止目前github上还有900个issue未解决。对于我而言对RN还是寄托了很大的期。
ReactNative是基于状态的组件化框架,随着RN项目变大,state变得不可预测,不可预测的意思是state到处修改和使用导致
维护与debug很困难,所以就要有个管理state的方式,
这种方式就是Redux。但注意一点Redux并不仅仅为RN而生。
Notice:本文更适合有RN基础的朋友,如果你学过reactjs也是可以的。下面解释一些重要概念,然后解析一个demo。
Redux
Redux是为javascript而生的可预测的状态容器,是Flux的进化。什么是Flux?没用过。为什么是可预测的?下面会解释。
Redux由Action、Reducer、Storage三部分组成,先来看看官方代码(里面有中文的珠玑文字,不要一目十行,请慢慢体会):
|
|
数据流动的方向时:action->store->store里的reducer(用来改变state)->更新UI(因为RN是基于状态机的,所以state更改后自动render)
这也很容理解上面的可预测是什么意思,数据流保证了单向流动,store集中管理state,除了reducer没有任何方法修改state,还有重要的一点是state是不可改变的,因为reducer返回的下一个状态state2是基于上一个状态state1的,而不是修改state1然后返回state1.
看完之后有的人酱紫:
还有的人酱紫:
如果不理解,多看两遍,下面会带着大家一起写个demo。
先来欣赏一段扎克伯格的文字
People often ask me what advice I’d give someone who wants to start their own company.
My answer is that every good company that I can think of started with someone caring about changing something, not someone deciding > to start a company. Instead of trying to build a company, focus on the change you want to see in the world and just keep pushing
forward.
有人问我这段字有什么含义,我说:没含义,放松一下😌
Redux Thunk
github地址在这里
什么是thunk? thunk是一个包含了表达式(expression)的函数,用来延迟表达式(expression)的执行。
|
|
现在一些框架的readme在写其用处时一般用Motivation这个词,动机纯不纯的动机。
Redux Thunk middleware允许你的action creator返回一个function而不是action。
Thunk 可以用来延迟dispatch一个action,或者只有满足某个特定条件时才dispatch。
inner function把store的dispatch和getState作为参数
比如:
|
|
|
|
Demo->Discolor
进这里,点击右上角的star
实现的功能是,页面上有两个按钮,点击按钮页面背景变色,第一个是变成红色,第二个是变成绿色
在此demo的同级目录下还有个Counters,这个示例稍微复杂一点。
再往下看前,请打开你已经down下来的demo
先来看看文件目录:
|
|
安装依赖此处为必要的安装,如果缺少,会有red screen提示的
|
|
actions/actionTypes.js定义了两种类型:变成红色 和 变成绿色
|
|
actions/discolorActions.js定义了两个action creator,如果你是从头看的,
现在应该能看懂了,如果不懂,那就从头看吧
|
|
components/discolor.js是RN的自定义控件
|
|
containers/discolorApp.js:已经加入了必要的注释,不懂的留言吧
|
|
containers/app.js
|
|
reducers/discolor.js:
|
|
reducers/index.js:为了可以统一导出所有reducer,这里只有discolor
如何统一导出,在containers/app.js中是这么用的: import as reducers from ‘../reducers’;*
|
|
index.ios.js:代码与index.android.js相同
|
|
结语
以上就是关于ReactNative结合Redux的入门教程,希望可以帮助大家理清思路。我本着用最简单的方式表达最重要的信息的目的来撰写此文,在有些措辞不严谨或者表达不够准确的地方希望大家可以留言。
参考
redux 英文版本:如果你不喜欢请看参考2
redux 中文版本:翻译版,系统讲解
stackoverflow问题:ES6能否import一个目录(多个文件)
Redux Thunk: 什么是Thunk?
example-react-native-redux : demo参考了这个项目
“ES6能否import一个目录(多个文件)”