React-Native配合ignite 开发文档

React-Native配合ignite开发文档

1.部署调试

1)Nuclide的start package有时候有问题,手机显示奇怪的错误,可以在命令行

npm start -- --reset-cache

重置后,启动正常。

2)安装程序到真机,如果命令行不行,androidstudio里安装。

3)真机调试,弹出菜单,晃动手机出,如果不出,手机设置->程序->本程序->允许悬浮框。

模拟器,ctrl+m,调出调试菜单。


4)Nuclide菜单选择start debugging,然后手机调试菜单选择remote debug

然后在程序中打断点,单步执行,可以看出程序的流转路径。

Redux的程序有点类似QT和win32的消息泵,每个地方跳转不靠函数调用,全是异步消息,异步调用,声明消息的地方比较特殊Action,处理消息的地方也比较特殊,下面咱们着重过一下。

5)初步调试的时候,要解决程序编码问题,主要是多个逗号,函数名大小不一致,没有定义这些,因为js不需要编译,这些还只能运行时发现。

优先看手机的错误提示,因为手机屏幕较小,有时候外壳程序会直接崩溃,这时候可以在终端开npm start,看这个输出。

程序基本能运行起来,没有上面这种简单报错后,开始使用调试器查看程序变量进行正常的逻辑调试。

2.开发

Ignite汇集了多个主流开发库,并组装成自己的框架。咱们先对最常用的,从服务器请求数据开始,这个不同于android的处理,只需要”后台线程+网络请求”一步,React需要使用redux的方式:

构建Action -> reducer ->合并reducer -> sagas配置

调用路径是,screen里发起Action,通过上面的reducer配置,传递到Sagas处理,处理请求后,put Action回到Redux,改变state,然后state改变又回到screen里,对应到prop的改变,最终screen在componentWillReceiveProps收到请求的数据。

2.1 API请求

这个我理解的是:

1)所有同一个网站的API接口都要写到一个Service里

2)然后每个具体的接口函数都要封装成一组Redux+Saga,然后名字起名要和接口对应,这样可以最少的修改代码达到可用状态。

我们以仪表系统的请求为例:

假如服务器端提供2个接口函数:

1.get_equipment_name_list GET无参

2.get_equipment_model_list POST参数是nameId

我们现在开始做第一个接口。

1.第一步,写Service

import apisauce from 'apisauce'

// our "constructor"

const create = (baseURL ='http://equipment.jimglobal.com/api/') => {

// ------

// STEP 1

// ------

//

// Create and configure an apisauce-based api object.

//

const api = apisauce.create({

// base URL is read from the "constructor"

baseURL,

// here are some default headers

headers: {

'Cache-Control': 'no-cache'

},

// 10 second timeout...

timeout: 10000

})

const login=(username,password) => api.post('login',{username :username,password:password})

const get_equipment_name_list=() => api.get('get_equipment_name_list')

const get_equipment_model_list=(nameId) => api.post('get_equipment_model_list', {nameId:nameId})

return {

login,

get_equipment_name_list,

get_equipment_model_list

}

}

// let's return back our create method as the default.

export default {

create

}

要点:1) baseURL写服务器地址

2)绿色的部分,注意get, post,和参数的处理。

3)红色的部分,对外提供的接口。

这个怎么上传文件我还没试。这个一般都不会写错。

2.第二步,写redux

对于get_equipment_name_list和get_equipment_model_list,我们要提供独立的redux。

比如我们第一个接口我们叫GetEquipmentNameList,我们就可以做下面

使用ignite generate redux GetEquipmentNameList

生成的代码:

我们不需要参数,所以可以把data去掉,改为:

const { Types, Creators } = createActions({

getEquipmentNameListRequest: null,

getEquipmentNameListSuccess: ['payload'],

getEquipmentNameListFailure: null

})

INITIAL_STATE中也不需要data,所以可以去掉

export const INITIAL_STATE = Immutable({

fetching: null,

payload: null,

error: null

})

Request自然也不需要data,去掉

// request the data from an api

export const request = (state) =>

state.merge({ fetching: true, payload: null })

然后这个文件就改好了,可以看到我们只需要调整参数部分,,和state部分,其他的用默认的就可以。

但是具体原理也要明白:

createActions中的getEquipmentNameListRequest被自动转化为GET_EQUIPMENT_NAME_LIST_REQUEST, 最后createReducer和处理函数关联起来,处理函数更新state。

3.第三步,写saga

Saga是真实发起api请求的地方。

默认生成的代码

我们注意到getGet#,生成器会添加get,所以咱们的命名还是不要GET这种动词比较好。除了默认的data参数,其他都是好的,所以命令很重要,配套的Redux和Sagas命令一定要一样。我们把action和data去掉,这个就完了。

export function * getGetEquipmentNameList (api) {

// make the call to the api

const response = yield call(api.getgetEquipmentNameList)

4.第四步,连接

连接要分两个地方,redux和saga要分别做连接

打开Redux/index.js文件:

EquipmentNameList : require('./GetEquipmentNameListRedux').reducer

这一行是我们要添加的,注意这个EquipmentNameList,这个不是胡乱起的,在screen中的mapStateToProps中的state是全局的,EquipmentNameList就是我们这个redux的数据。

打开Sagas/index.js文件,跟着注释家,导入types,导入saga的函数

/* ------------- Types ------------- */

import { GetEquipmentNameListTypes } from '../Redux/GetEquipmentNameListRedux'

/* ------------- Sagas ------------- */

import { getGetEquipmentNameList} from './GetEquipmentNameListSagas'

如果api是新的,就要搞一个实例

const appApi=AppApi.create()

然后连入root

takeLatest(GetEquipmentNameListTypes.GET_EQUIPMENT_NAME_LIST_REQUEST, getGetEquipmentNameList, appApi),

连接就做完了。

按步骤做,1分钟左右就能完成一套。

5.第五步,Screen里使用

现在我们在LoginScreen里加入对这个接口的调用。

先导入Action

import GetEquipmentNameListActions from '../Redux/GetEquipmentNameListRedux'

然后处理mapStateToProps,把数据合并到state去。

const mapStateToProps = (state) => {

return {

fetching: state.login.fetching,

response: state.login.response,

error: state.login.error,

equipmentname_payload : state.EquipmentNameList.payload

}

}

然后处理mapDispatchToProps,把Action封装成自己的props“getEquipmentNameList”, 这样自己的函数中就可以直接调用了。

const mapDispatchToProps = (dispatch) => {

return {

attemptLogin: (username, password) => dispatch(LoginActions.loginRequest(username, password)),

getEquipmentNameList:() => dispatch(GetEquipmentNameListActions.getEquipmentNameListRequest())

}

}

调用:随便什么地方,只要调用,就会发起请求。

//在这个地方做EquipmentName

this.props.getEquipmentNameList();

最后,接收请求,这个equipmentname_payload就是mapStateToProps最下面那行的那个,下面自己想怎么做就怎么做了。

componentWillReceiveProps (newProps) {

// this.forceUpdate()

// Did the login attempt complete?

if(newProps.equipmentname_payload)

{

}

作者:MackJson

链接:http://www.jianshu.com/p/efc9a00b843a

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容