手把手教你写一个RN小程序!
时间过得真快,眨眼已经快3年了!
1.我的第一个App
还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现在我开始学react native,那么现在对于react native也算是有所了解了,就用网上的接口开发一个小程序,现在带大家来写这个程序!接口是用看知乎的API,简简单单的只有get,可以从这里入门,也算是带大家入门吧,过后我会把源代码放在我的github上,前期项目肯定特别简陋,后面慢慢来优化,好了,废话不多说,坐稳扶好,咱们开车了!!!!!
首先需要一个框架,可以省时省力,不再重复的造轮子。
(1)框架
框架咱们就不再搭建了,我前面写了一个特别简单的框架,放在github上了,咱们直接下载下来用就可以了,下载地址在我的github上,这个框架是基于react-native-tab-navigator的,运行这个程序,咱们做的第一步就是打开终端配置环境
$npm install
$npm install react-native-tab-navigator --save
然后我们就可以打开文件运行程序了
(2)修改名称
用Xcode打开文件navtabbar.xcodeproj,进入AppDelegate.m文件中把
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"navtabbar"
initialProperties:nil
launchOptions:launchOptions];
中的moduleName改为你想要的名字,然后在plist文件中修改Bundle name为你修改过的名字,最后最重要的一步,打开index.ios.js文件修改注册入口,
AppRegistry.registerComponent('你修改的名字', () => NavIndex)
现在iOS的App名称修改完成,可以运行一下看看是不是修改成功!
2.首页搭建
(1)首页界面代码修改
进入login.js文件,删除 <Text onPress={this._onPage.bind(this)} style={styles.textStyle}>登录</Text>
然后添加Image,咱们待会给首页设置一个背景图,添加
TouchableOpacity,
Dimensions,
TextInput
OK,添加这些组件就够了!
(2)界面搭建
首先,我们先在src文件夹中新建一个images的文件夹,用于存放我们的图片
现在就可以找一些图片存进去。
<Image source={require('./images/background.jpg')} style={styles.backgroundStyle}>
然后简单的登录一下,当然只是一个界面而已
<FormText style={{marginTop:60}}
placeholder='账号'
placeholderTextColor='gray'
defaultValue='Demon404'
/>
<FormText style={{marginTop:10}}
placeholder='请输入密码'
placeholderTextColor='orange'
defaultValue=''
/>
<TouchableOpacity onPress={this._onPage.bind(this)}>
<Button style={{marginTop:20,width:Width/2,height:40,backgroundColor:'blue',borderRadius:10}}
buttonTitle="登录" />
</TouchableOpacity>
这里的FormText是我自己写的一个小控件。
下面可以看一下界面效果
由于没有post请求,所以这个页面大家就简单的乐呵乐呵就好了,反正下个页面跟这个页面没什么太大关系.......
(3)主页搭建
主页就是一个Tabbar界面,目前考虑先有三个模块!,日后再考虑删减,嗯,就是这么任性!
一个是推送的文章模块,一个是搜索模块,最后的是设置模块。
咱们先看文章模块主页面
cellRow(data) {
return (
<View style={styles.cellStyle}>
<Image style={{width:WIDTH-40, height: 100}}
source={{uri: data.pic}}
/>
<Text style={styles.title}>{data.excerpt}</Text>
</View>
);
} render() {
return (
<View style={styles.container}>
<NavBar name='看知乎'/>
<ListView
initiaListSize={1}
onEndReachedThreshold={10}
dataSource={this.state.dataSource}
renderRow={this.cellRow.bind(this)}
style={styles.listView}
/>
</View>
);
}
这是我们的ListView页面的代码,只是简单的抓取看知乎的一个接口页面,
怎么实现数据同步呢?
这就要说到组件的生命周期了:一般来说,一个组件类由 extends Component
创建,并且提供一个 render
方法以及其他可选的生命周期函数、组件相关的事件或方法来定义。
咱们这里简单说一下生命周期函数
componentWillMount:只会在装载之前调用一次,在
render
之前调用
componentDidMount:只会在装载完成之后调用一次,在 render
之后调用
componentWillUnmount: 卸载组件时调用,
constructor(props, context):构造函数,在创建组件的时候调用一次
目前使用的也就这几个,当然声明周期所调用的函数不仅仅这几个,这些咱们日后再讲。
在这里,我们简单的用到了componentDidMount,
首先var GET_URL = 'http://api.kanzhihu.com/getposts';
然后在listView页面定义数据解析方法
componentDidMount(){
this.fetchData();
}
实现:
fetchData(){
fetch(GET_URL)
//ES6的写法左边代表输入的参数右边是逻辑处理和返回结果
.then((response) => response.json())
.then((responseData) => {
this.setState({
dataSource : this.state.dataSource.cloneWithRows(responseData.posts),
});
})
.done();
}
constructor(props) {
super(props);
//state内部维护的一个状态,我们刚开始进来的为空,来加载空的view
this.state = {
dataSource: new ListView.DataSource({
rowHasChanged: (row1, row2) => row1 !== row2,
}),
};
}
,然后根据上面的RowData就可以实现下面的页面效果
1.2.
图1就是咱们搭建的主页,图2是详细页。
图1和图2实现原理是相同的,都是用listView来搭建页面,那么如何来传值呢?
Nav 有个属性renderScene 回调方法有两个参数route和navigator。
大家还记得{...route.params}吧,
咱们需要做的就是在第一个页面push到第二个页面的时候这样写,
this.props.navigator.push({
component:Detail,
params:{nextdata: rowdata},
})
第二个页面直接写this.props.nextdata就可以调用传过去的rowdata了,那么第二个页面实现起来还难吗?这里就不在多说了,
ps:大家可以想一下renderRow={this.cellRow.bind(this)}为什么要这么写?当初renderRow={this.cellRow()}不也可以吗?
(4)搜索页搭建
咱么先来看图吧,这个模块暂时实现了两个页面的功能,以后慢慢添加,不着急....
这就是那两个页面,也非常简单,我就把思路说一下,大家可以想着做就行了,程序猿嘛,多动脑还是很好的!,一看就知道,搜索页就是几个简单的UI,然后出发几个方法,这里我是在搜索页把接口传到下一页了,这个其实不推荐,主要是我为了省代码,并且搜索名称和排行榜搜索的接口不太一样,大家理解就行,
首先,搜索框这里我用了textinput来代替,其实功能也是一样的。点击放大镜,把输入框里的内容拼接到接口上,传到下一页,下一页直接用收到的接口解析就可以了,那么怎么得到textinput里面的值呢?
来看代码
<TextInput
style={styles.inputStyle}
placeholder="请输入搜索条件!"
onChangeText={(text) => this.setState({text})}
/> constructor(props) {
super(props);
this.state = {text: ''};
}
searchUser(){
console.log(this.state.text);
看过文档的朋友应该都知道onChangeText的作用是干嘛的,我也不多说,那么列表页也如同前几个页面一样,一通则百通。
3.最后
把完整的gif图放给大家
手把手教你写一个RN小程序!的更多相关文章
- 微信小程序——手把手教你写一个微信小程序
前言 微信小程序年前的跳一跳确实是火了一把,然后呢一直没有时间去实践项目,一直想搞但是工作上不需要所以,嗯嗯嗯嗯嗯emmmmm..... 需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 ...
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...
- 手把手教你写一个java的orm(一)
写之前的说明 其实吧. 这个东西已经写好了,地址在:https://github.com/hjx601496320/JdbcPlus 这系列文章算是我写的过程的总结吧.(恩系列,说明我可能会写好久,╮ ...
- 手把手教你写一个RPC
1.1 RPC 是什么 定义:RPC(Remote Procedure Call Protocol)--远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...
- 用Taro写一个微信小程序(一)——开始一个项目
一.Taro简介 1.名字由来 Taro['tɑ:roʊ],泰罗·奥特曼,宇宙警备队总教官,实力最强的奥特曼. 2.taro是什么 Taro 是一个开放式跨端跨框架解决方案,支持使用 React/Vu ...
- 让我手把手教你写一个强大、方便使用的 IOC 容器
一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...
- 手把手教你写一个java的orm(五)
生成sql:where 上一篇里我们实现了生成insert的sql,下面要开始实现update,delete,select的sql语句了.但是这些语句有一个比较麻烦的地方是:它们一般后面都会有wher ...
- 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}
1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...
- 手把手教你写一个SpringMVC框架
一.介绍 在日常的 web 开发中,熟悉 java 的同学一定知道,Spring MVC 可以说是目前最流行的框架,之所以如此的流行,原因很简单:编程简洁.上手简单! 我记得刚开始入行的时候,最先接触 ...
随机推荐
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容
我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...
- [转载]强制不使用“兼容性视图”的HTML代码
在IE8浏览器以后版本,都有一个"兼容性视图",让不少新技术无法使用.那么如何禁止浏览器自动选择"兼容性视图",强制IE以最高级别的可用模式显示内容呢?下面就介 ...
- python 数据类型 --- 集合
1. 注意列表和集合的区别 set 列表表现形式: list_1 = [1,3,4]; 集合表现形式:set_1= set() list_1 = [1,2,3,4,23,4,2] print(lis ...
- WebLogic的安装和配置以及MyEclipse中配置WebLogic
WebLogic 中间件: 是基础软件的一大类,属于可复用软件的范畴,顾名思义,中间件属于操作系统软件与应用软件的中间,比如:JDK,框架,weblogic. weblogic与tomcat区别 : ...
- C# 序列化与反序列化几种格式的转换
这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...
- [Android]使用Dagger 2来构建UserScope(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6237731.html 使用Dagger 2来构建UserSco ...
- T-SQL学习记录
T-sql是对SQL(structure query language )的升级.可以加函数. 系统数据库:master管理数据库.model模版数据库,msdb备份等操作需要用到的数据库,tempd ...
- ASP.NET Core MVC 配置全局路由前缀
前言 大家好,今天给大家介绍一个 ASP.NET Core MVC 的一个新特性,给全局路由添加统一前缀.严格说其实不算是新特性,不过是Core MVC特有的. 应用背景 不知道大家在做 Web Ap ...
- 使用C#给Linux写Shell脚本
在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...