如何在react-native 中优雅的使用 redux

首先说下我对redux 的理解吧,第一印象很重要就像妹纸一样.

一句话来说他就是一个 js 的应用状态容器.

说长点就是当你的应用足够复杂,交互足够多的时候,你不方便管理你的 state, 那么交给 redux 吧,他是一个单向数据流,高效且清晰.

那么什么时候使用 redux呢,有一句话叫当你没有想到redux 的时候,那么你真的可能并不需要它.

下面就简单说下一些基本的概念.

Action:中文意思,动作,没错,在 redux 里也是这么个意思,指用户的一个动作,放在 native 里就是 View 这个视图接受了用户的一个操作,比如点击,放在 RN 里就是一个 component 接受了一个交互操作,产生的一个 action,action 其实就是一个js对象(js对象其实就是键值对),有一个必须的字段type, 用来唯一标识你的会这个 action 类型,其他还有一些合适的数据,数据要尽可能少,下面看一下 action 的样子.

是不是好奇怎么有个 dispatch 参数,这个 dispatch 哪里来的呢,他是在 component 中有个 bindActionCreactor 函数绑定 dispatch 到 action 上,上面 mock 了一个用户数据,这里用了异步的操作,首先定义了一个 doLogin的函数 这也是一个 ActionCreactor,先 dispatchy一个 isLogining 的操作,成功了则进行 isSuccess 的 action, 传入 user,失败了则什么都不传.这是一个异步操作,中间模拟了 fetch 百度的操作,想使用异步函数, redux 里就要用到一个叫做中间件的东西,下面会讲

Store: 起名字是有讲究的,没错,他就是一个仓库,所有的数据 state 树都在 store 里,而且无论你的应用有多大只有一个 store, 在入口里传递给 store,store 有几个比较重要的作用,首先 store.dispatch(action),所有的动作都是由他发起的,因为在创建store 的时候会传入 reducer, 所有一旦 dispatch 这个 action,reducer 立刻就会执行这个 action, 现在你只要记得 reducer 这个东西就行了他就是一个函数而已,下面会讲到

上图是 store 第一次出现的地方,这也是一个程序 js 部分的真正入口,有些人会问 provider 是什么,他是一个 Facebook 写的东西,用 provider 包裹着你的 APP,你就可以在你的 APP 里取到state,这里的 store 是通过这个 configuerStore()获取的,他真正的创建的地方在这里:

如果没看过 redux 的肯定一脸懵逼, createstore 是什么鬼 applyMiddleware,thunkMiddleware 又是什么东西,我其实当时也有点蒙,其实知识这东西永远都是学不完的,你会的比别人多点,别人有一天也会超过你的,所以知识改变命运这种说法是并不正确的,知识在60-70年代可以改变命运,这句话也是李嘉诚说的确实符合,但是现在获取知识的途径太多了,只要你想学你永远都学不完,然而这并没有什么卵用,对于你的命运,只是你工作的可以好一点而已,每月可以多拿一千两千块钱,你还是娶不到媳妇,买不起房.真正改变命运的不是知识,而是智慧,有一千种成功的方式,就看你有没有动脑子去想,有人想过但被各种困难阻碍,这种属于嘴上的智慧.总之扯的太远了.

createstore()这是一个创建 store 的方法,但是光创建不够啊,我们要给他配置一些东西,比如可以让他发起异步 action, 这就用到中间件 thunkMidlleware,applyMiddleware 就是创建带有中间件的 store, 下面大家都能看懂,传入一个 reducer, 那么 loginIn 是什么啊,这就要讲到 reducer 了, initalState 就是一个初始的 state, 可传可不传,如果你的服务器有返回初始状态的话也可以传进去,下面就是大名鼎鼎的 reducer 了

Reducer:简单的说 reducer 就是一个函数,他在创建store 的时候通过作为参数的方式传入,所以store 只要调用dispatch 方法就会自动触发 reducer 函数,那么 reducer 函数是干嘛的呢,reducer 负责接受一个 previousState,和一个 action,返回一个新的 state,store 把这个 state 的更新告诉 component 就会触发UI 的重新渲染,那么下面看看 reducer 到底什么样子吧

哈哈,是不是和我描述的一样,接受一个初始的 state, 返回一个新的 state, 忘了一点, reducer 可以有很多个的,一个应用太大的时候,虽然 store 只有一个,但是 reducer 可以拆分,下面就用到一个函数用来合并多个 reducer

就是这个 combineReducers ,记住用 reducer 的时候一定记得要用下面的 userReducer哦,尤其是在下面的 select 函数里

那么这个 select 函数是干嘛的呢,它的作用就是将 store 的状态绑定到当前组件的 props 上, store 每个时刻都对应着一种状态,这种状态也对应着相应的 UI,store.getState()可以获取到当前的状态,一旦状态发生改变就会触发 UI 渲染,下面这个 connet()函数就表示 LoginPage 对 store 的状态感兴趣,意思就是 store 变化的时候这个页面可以跟着他一起变化

总结一下:单一数据源,只有一个 store,store 是 action 的分发中心,所有 state 的改变必须要由 store.dispatch()来触发,只有一个 state 树;

可以有多个 reducer,由 combineReducers 组合起来;

唯一去改变 state 的方式就是发出一个 action 到 reducer;

利用 bindActionCreactor()函数去自动绑定 action 到 dispatch() 函数

大概就是这样,共勉

时间: 2024-08-11 03:27:32

如何在react-native 中优雅的使用 redux的相关文章

[转] 在React Native中使用ART

http://bbs.reactnative.cn/topic/306/%E5%9C%A8react-native%E4%B8%AD%E4%BD%BF%E7%94%A8art 前半个月捣腾了一下React Native ART 现在手上闲下来了和大家分享一下React Native中的ART使用心得 React Native ART 究竟是什么? 所谓ART,是一个在React中绘制矢量图形的JS类库.这个类库抽象了一系统的通用接口,统一了SVG,canvas,VML这类矢量图形在 React中

如何在NodeJS项目中优雅的使用ES6

如何在NodeJS项目中优雅的使用ES6 NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加上参数:--harmony.但是,即使如此node也还是没有支持全部的ES6特性.所以这个时候就需要用到Babel了. 现在开始Babel 在开始使用Babel之前,假设 1. 你已经安装了nodejs,并且已经熟悉了Js. 2. 你也可以使用npm安装各种依赖包. 3. 而且你也对ES6(后来改为

React Native中的网络请求

React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810652 /** * Sample React Native App * https://github.com/facebook/react-native * 周少停 2016-09-28 * fetch请求数据 header 参数 response转json 请求方式 */ import React

react native中如何往服务器上传网络图片

1 let common_url = 'http://192.168.1.1:8080/'; //服务器地址 2 let token = ''; //用户登陆后返回的token 3 /** 4 * 使用fetch实现图片上传 5 * @param {string} url 接口地址 6 * @param {JSON} params body的请求参数 7 * @return 返回Promise 8 */ 9 function uploadImage(url,params){ 10 return

react native中Unable to load script from assets 'index.android.bundle'解决方案

刚刚朋友问我,说是创建好一个项目,运行后报错:Unable to load script from assets 'index.android.bundle',以前好好的没出现这种现象,于是我找到一个解决方案,分享一下. 解决这个问题的方案是: 进入你该项目的根目录下的 android目录下的app目录下的src文件下的mian文件,(可能说的有点绕),在main件夹下,创建一个assets文件,这个文件是rn的资源文件夹! 之后用dos进入你的项目根目录,执行一下命令: react-nativ

React Native 中 component 生命周期

React Native 中 component 生命周期 转自 csdn 子墨博客  http://blog.csdn.net/ElinaVampire/article/details/51813677 (非原创) React Native中的component跟Android中的activity,fragment等一样,存在生命周期,下面先给出component的生命周期图 getDefaultProps object getDefaultProps() 执行过一次后,被创建的类会有缓存,映

Facebook React Native 中文教程一:介绍

React Native 中文版 Facebook 在 [React.js Conf 2015](http://conf.reactjs.com/) 大会上推出了基于 JavaScript 的开源框架 [React Native](http://facebook.github.io/react-native/),本中文教程翻译自 [React Native 官方文档](http://facebook.github.io/react-native/docs/getting-started.html

在 React Native 中使用 Redux 架构

前言 Redux 架构是 Flux 架构的一个变形,相对于 Flux,Redux 的复杂性相对较低,而且最为巧妙的是 React 应用可以看成由一个根组件连接着许多大大小小的组件的应用,Redux 也只有一个 Store,而且只用一个 state 树来管理组件的状态.随着应用逐渐变得复杂,React 将组件看成状态机的优势仿佛变成了自身的绊脚石.因为要管理的状态将会越来越多,直到你搞不清楚某个状态在不知道什么时候,由于什么原因,发生了什么变化.Redux 试图让状态的变化变得可预测.Redux

react native中一次错误排查 Error:Error: Duplicate resources

最近一直在使用react native中,遇到了很多的坑,同时也学习到了一些移动端的开发经验. 今天在做一个打包的测试时,遇到了一个问题,打包过程中报错“Error:Error: Duplicate resources”,什么意思呢,就是打包资源有重复,后来查看了一下,发现打包到android/app/src目录下的静态文件重名了. 重现步骤: 1:通过vscode打开项目,运行打包命令 react-native ram-bundle --entry-file index.js --platfo

在 React Native 中使用 moment.js 無法載入語系檔案

moment.js 是很常見的日期時間 library,友善的 API 與極佳的執行效率是它的兩大賣點.例如 (new Date()).getFullYear(),如果使用 moment.js 我可以只寫 moment().get('year'),可讀性增強許多. 問題 React Native 0.29.x 預設使用 ES6,並支援 import 語法.問題出在如果遵照官方網站的說明去載入語系檔,會發生找不到模組 (cannot find module) 的錯誤.推測可能是 moment.js