一个最简单的HelloWorld页面

先不多解释,直接上代码:

import React, { Component } from 'react';
import {AppRegistry, StyleSheet, Text, View} from 'react-native'; export default class helloworldComponent extends Component
{
render()
{
return (
<View style={styles.container}>
<Text style={styles.welcome}>Hello World!</Text>
</View>
);
}
} const styles = StyleSheet.create(
{
container:
{
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome:
{
fontSize: 20,
textAlign: 'center',
margin: 10,
}
}); // 这句话就相当于Java里面的main函数,不用特别深入了解,知道即可
// 第一个参数的'helloworld'必须跟你的项目名一样
AppRegistry.registerComponent('helloworld', () => helloworldComponent);

官方推荐使用ES6语法,不熟悉ES6的同学可能看起来感觉这完全不是JS代码,可以先看看这篇文章熟悉一下区别:

react-react-native-的es5-es6写法对照表

对于Android平台而言,index.android.js就是整个项目的入口,AppRegistry.registerComponent则是入口中的main函数。我一般习惯index.android.js中只简单的写两三行代码,其它的以组件的形式加载进来:

import React, { Component } from 'react';
import { AppRegistry } from 'react-native'; import MainPage from './views/MainPage'; // 注意,这里用引号括起来的'helloworld'必须和你init创建的项目名一致
AppRegistry.registerComponent('helloworld', () => MainPage);

JSX语法

React.js基础的话可能会很熟悉这个,我在学习ReactNative的时候没有接触过React.js,所以有些吃亏。

JSX可以看做是内嵌在JS中的一段xml代码,不需要引号包裹,放在这个里面:render(){ return (JSX);}{}表示里面是一个变量或者表达式,和jsp的${}类似。

注意每个render里面返回的XML根节点只能是一个,像下面这样的写法是错误的:

render()
{
return (
<Text>Hello World!</Text>
<Text>Hello World!</Text>
);
}

只能另外用一个组件把它包裹,比如<View>

render()
{
return (
<View>
<Text>Hello World!</Text>
<Text>Hello World!</Text>
</View>
);
}

动态拼接JSX

因为JSX不是普通的字符串,我们没法像拼接字符串一样拼接它,但还是有办法的。JSX里面可以随意内嵌表达式:

class TestComponent extends Component
{
constructor(props)
{
super(props);
this.list = ['张三', '李四', '王二麻子', '小茗同学'];
}
render()
{
return (
<View style={{flex:1}}>
<Text>你好啊</Text>
{this.list.map((item, idx) => <Text key={'idx_'+idx}>{item}</Text>)}
<Image source={require('./image/logo.png')}/>
</View>
);
}
}

再复杂一点的还可以层层嵌套,代码多了则可以把遍历的代码单独写到一个方法里面然后调用,比如:

class TestComponent extends Component
{
constructor(props)
{
super(props);
this.list = ['张三', '李四', '王二麻子', '小茗同学'];
}
renderList(list)
{
return list.map((item, idx) =>
{
return (<Text key={'idx_'+idx}>{item}</Text>);
});
}
render()
{
return (
<View style={{flex:1}}>
<Text>你好啊</Text>
{this.renderList(this.list)}
<Image source={require('./image/logo.png')}/>
</View>
);
}
}

样式篇

样式的写法

样式可以直接写在style上面:

<Text style={{color: 'red', fontSize: 16}} />

也可以像css一样先单独定义好再引用,不过和css还是有很大差别的:

var styles = StyleSheet.create({
btn: {
width: 38,
height: 38,
},
background: {
backgroundColor: '#222222',
},
active: {
borderWidth: 2,
borderColor: '#00ff00',
}
});

然后这样写:

<Text style={styles.btn} /> // 单个class
<Text style={[styles.btn, styles.active]} /> // 多个class
<Text style={[styles.btn, {color: 'red'}]} /> // class与style混写

注意事项:

  • 样式写法采用的是JSON格式;
  • 字符串属性必须加引号;
  • 大小全部没有px,纯数字;
  • 采用驼峰式命名,不是中划线;

直接操作某个元素

可以使用ref给元素实现类似HTML中的id的效果,即this.refs[id]document.getElementById(id)类似:

render()
{
return (
<View ref="btn" style={{width: 100, height: 100}}/>
);
}
componentDidMount()
{
// 组件显示完毕给它设置红色边框效果
this.refs['btn'].setNativeProps
({
style: {borderColor: 'red', borderWidth: 5}
});
}

当然,一般推荐使用state来修改界面,除非你对性能特别关注才用上述方法。

已知setNativeProps无法修改Imagesource,这应该是个bug。

图片加载

加载本地图片

官网推荐使用require加载图片,路径就是相对于js的相对路径,这种方式可以自动设置宽高度:

<Image source={require('./images/check.png')} />

虽然这种方式有很多优点,但是带来了一个致命的缺点:就是图片路径无法动态指定,比如下面这个例子,如果有100种状态需要判断,难道要写100个if else

// 正确
<Image source={require('./my-icon.png')} /> // 错误
var icon = this.props.active ? 'my-icon-active' : 'my-icon-inactive';
<Image source={require('./' + icon + '.png')} /> // 正确
var icon = this.props.active ? require('./my-icon-active.png') : require('./my-icon-inactive.png');
<Image source={icon} />

目前还没有找到这个问题的有效解决方法。

加载app资源图片

加载已经打包到App中的图片资源(通过Xcode的asset类目或者Android的drawable文件夹打包):

假设有这样一个文件:android\app\src\main\res\drawable-hdpi\ic_launcher.png,那么加载时可以直接这样,注意不需要.png后缀,而且必须手动指定宽高度,否则默认是0*0

<Image source={{uri: 'ic_launcher'}} style={{width: 40, height: 40}} />

加载网络图片

加载网络图片和加载资源图片一样,也要手动指定宽高度:

<Image source={{uri: 'http://test.liuxianan.com/sample.jpg'}} style={{width: 40, height: 40}} />

组件的生命周期

附录:所有可用CSS列表

注意:部分属性安卓不支持,如shadow

RN中所有可用的CSS列表如下:

"alignItems",

"alignSelf",

"backfaceVisibility",

"backgroundColor",

"borderBottomColor",

"borderBottomLeftRadius",

"borderBottomRightRadius",

"borderBottomWidth",

"borderColor",

"borderLeftColor",

"borderLeftWidth",

"borderRadius",

"borderRightColor",

"borderRightWidth",

"borderStyle",

"borderTopColor",

"borderTopLeftRadius",

"borderTopRightRadius",

"borderTopWidth",

"borderWidth",

"bottom",

"color",

"flex",

"flexDirection",

"flexWrap",

"fontFamily",

"fontSize",

"fontStyle",

"fontWeight",

"height",

"justifyContent",

"left",

"letterSpacing",

"lineHeight",

"margin",

"marginBottom",

"marginHorizontal",

"marginLeft",

"marginRight",

"marginTop",

"marginVertical",

"opacity",

"overflow",

"padding",

"paddingBottom",

"paddingHorizontal",

"paddingLeft",

"paddingRight",

"paddingTop",

"paddingVertical",

"position",

"resizeMode",

"right",

"rotation",

"scaleX",

"scaleY",

"shadowColor",

"shadowOffset",

"shadowOpacity",

"shadowRadius",

"textAlign",

"textDecorationColor",

"textDecorationLine",

"textDecorationStyle",

"tintColor",

"top",

"transform",

"transformMatrix",

"translateX",

"translateY",

"width",

"writingDirection"

参考

http://blog.csdn.net/sbsujjbcy/article/details/50017029

ReactNative学习笔记(二)基础进阶的更多相关文章

  1. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  2. amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules

    amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules 一.总结 1.am:以 am 为命名空间 2.模块状态: {命名空间}-{模块名}-{状态描述} 3.子模块: {命名空间}- ...

  3. 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解

    什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...

  4. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  5. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

  6. amazeui学习笔记二(进阶开发1)--项目结构structure

    amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...

  7. https学习笔记二----基础密码学知识和python pycrypto库的介绍使用

    在更详细的学习HTTPS之前,我也觉得很有必要学习下HTTPS经常用到的加密编码技术的背景知识.密码学是对报文进行编解码的机制和技巧.可以用来加密数据,比如数据加密常用的AES/ECB/PKCS5Pa ...

  8. tensorflow学习笔记二:入门基础 好教程 可用

    http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础   TensorFlow用张量这种数据结构来表示所有的数据.用一 ...

  9. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  10. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

随机推荐

  1. windows密码策略

    windows域环境配置密码策略: http://www.cnblogs.com/danzhang/p/3693024.html windows配置密码策略: https://jingyan.baid ...

  2. 《从零玩转python+人工智能-3》120,122节课深度优先疑问解答

     深度优先(从左往右): 按照这个原则来:至于使用栈,或者队列:根据它们不同的特性:最终务必保证最终结果是原继承结构的“从左往右”:所以,如果是栈,就是右侧先入栈,左侧再入(这样左侧能先出来,遵循从左 ...

  3. Sphinx 与全文索引

    全文索引创建过程 第一步:将源文档传给分词组件(Tokenizer) 分词组件做了以下事情: 将文档分成一个一个的单词 去除标点符号 去除停词:英文(the / a / this / that ... ...

  4. 设置了error_reporting(E_ALL)还是不显示错误

    原因就是在php.ini里面将display_errors关闭了.可以在php.ini里面将display_errors配置为On,然后重启php-fpm ini_set('display_error ...

  5. IVideoWindow 在directshow采集链路中的使用

    dshow中一个完整采集链路一般如下: Capture Device----->SampleGraber ------>Render 如果只要采集原始数据可以不用渲染链路那就如下: Cap ...

  6. Selenium + Chrome headless 报ERROR:gpu_process_transport_factory.cc(1007)] Lost UI shared context 可忽略并配置不输出日志

    Selenium不再推荐使用PhantomJS,会报如下警告 UserWarning: Selenium support for PhantomJS has been deprecated, plea ...

  7. JS StartMove源码-简单运动框架

    这几天学习js运动应用课程时,开始接触一个小例子:“仿Flash的图片轮换播放器”,其中使用的StartMove简单运动框架我觉得挺好用的.这个源码也简单,理解其原理,自己敲即便也就熟悉了. 用的时候 ...

  8. Unity网格合并_材质合并

    [转]Unity网格合并_材质合并 原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网 ...

  9. Django提交文件的方式

    以上传图片为列, 提交图片文件后能在不刷新页面的前提下显示图片 首先写出一个简单的提交文件的页面: <h>文件上传</h> 选择文件<input type="f ...

  10. 即时通信 选择UDP还是TCP协议

    之前做过局域网的聊天软件,现在要做运行在广域网的聊天软件.开始接触网络编程,首先是接触到TCP和UDP协议 在网上查资料,都是这样描述 TCP面向连接,可靠,数据流 .UDP无连接,不可靠,数据报.但 ...