http://facebook.github.io/react-native/docs/scrollview.html#content
- View相关属性样式全部继承(例如:宽和高,背景颜色,边距等相关属性样式)
- disabled bool 如果该值为true,用户就无法点击switch开关控件,默认为false
- onValueChange function 方法,当该组件的状态值发生变化的时候回调方法
- value bool 该开关的值,如果该值为true的时候,开关呈打开状态,默认为false
- View相关属性样式全部继承(例如:宽和高,背景颜色,边距等相关属性样式)
- onValueChange function方法,当选择器item被选择的时候进行调用。该方法被调用的时候回传入一下两个参数
- itemValue:该属性值为被选中的item的属性值
- itemPosition:该选择器被选中的item的索引position
- selectedValue: any任何参数值,选择器选中的item所对应的值,该可以是一个字符串或者一个数字
- style pickerStyleType 该传入style样式,设置picker的样式风格
- enabled bool 如果该值为false,picker就无法被点击选中。例如:用户无法进行做出选择
- mode enum (
dialog
,dropdown
) 选择器模式。在Android平台上面,设置mode可以控制用户点击picker弹出的样式风格:dialog
: 该值为默认值,进行弹出一个模态dialog(弹出框),dropdown
:以picker视图为基础,在该视图下面弹出下拉框 - prompt string 设置picker的提示语(标题),在Android平台上面,模式设置成'dialog',显示弹出框的标题
- TouchableHighlight
- TouchableNativeFeedback(仅限安卓)
- TouchableOpacity
- TouchableWithoutFeedback
ListView.DataSource
http://reactnative.cn/docs/0.27/listviewdatasource.html#content
#### SampleAppMovies
constructor(props) {
super(props); //这一句不能省略,照抄即可
this.state = {
movies: null, //这里放你自己定义的state变量及初始值
};
// 在ES6中,如果在自定义的函数里使用了this关键字,则需要对其进行“绑定”操作,否则this的指向不对
// 像下面这行代码一样,在constructor中使用bind是其中一种做法(还有一些其他做法,如使用箭头函数等)
this.fetchData = this.fetchData.bind(this);
}
componentDidMount是React组件的一个生命周期方法,它会在组件刚加载完成的时候调用一次,以后不会再被调用
componentDidMount() {
this.fetchData();
}
在React的工作机制下,setState实际上会触发一次重新渲染的流程,此时render函数被触发,发现this.state.movies不再是null。注意我们在Promise调用链的最后调用了done() —— 这样可以抛出异常而不是简单忽略。
fetchData() {
fetch(REQUEST_URL)
.then((response) => response.json())
.then((responseData) => {
// 注意,这里使用了this关键字,为了保证this在调用时仍然指向当前组件,我们需要对其进行“绑定”操作
this.setState({
movies: responseData.movies,
});
})
.done();
}
https://zhuanlan.zhihu.com/p/19996445
// 开启严格模式
'use strict';
// 导入react-native模块
import React, { Component } from 'react';
import SearchPage from './SearchPage';
import {
AppRegistry,
Text,
StyleSheet,
NavigatorIOS,
TextInput,
View,
TouchableHighlight,
ActivityIndicatorIOS,
Image
} from 'react-native';
AppRegistry.registerComponent('AwesomeProject', function() { return PropertyFinderApp });
module.exports = SearchPage;
// 导入组件
var SearchPage = require('./SearchPage');
class PropertyFinderApp extends Component{
render(){
return(
<NavigatorIOS
style={styles.container}
initialRoute={
{
title: 'Property Finder',
component: SearchPage,
}
}/>
);
}
}
this.props.navigator.push({
title:'Result',
component: SearchResult,
passProps: {listings: response.listings}
});
constructor(props) {
super(props);
// 通过 ListView.DataSource 将 ListView 的数据引入,
// 还有一个函数来显示每一行UI
var dataSource = new ListView.DataSource({
// 在构建数据源的同时,还需要一个函数用来比较每两行之间是否重复
rowHasChanged:(r1, r2) => r1.guid !== r2.guid
});
this.state = {
dataSource: dataSource.cloneWithRows(this.props.listings)
};
}
http://www.infoq.com/cn/presentations/the-fusion-of-native-and-web/
- react 宽度基于pt为单位, 可以通过Dimensions 来获取宽高,PixelRatio 获取密度。
- 基于flex的布局
- view默认宽度为100%
- 水平居中用alignItems, 垂直居中用justifyContent
- 基于flex能够实现现有的网格系统需求,且网格能够各种嵌套无bug
- 图片布局
- 通过Image.resizeMode来适配图片布局,包括contain, cover, stretch
- 默认不设置模式等于cover模式
- contain模式自适应宽高,给出高度值即可
- cover铺满容器,但是会做截取
- stretch铺满容器,拉伸
- 定位
- 定位相对于父元素,父元素不用设置position也行
- padding 设置在Text元素上的时候会存在bug。所有padding变成了marginBottom
- 文本元素
*文字必须放在Text元素里边
- Text元素可以相互嵌套,且存在样式继承关系
- numberOfLines 需要放在最外层的Text元素上,且虽然截取了文字但是还是会占用空间
相关方法 | 用途 | 注意事项 | 参数类型 |
---|---|---|---|
RCT_EXPORT_MODULE() 宏 |
添加一个参数指定模块名字 | 如果不指定默认就是OC类名 | ------ |
RCT_REMAP_METHOD() 宏 |
明确声明给JS导出的方法 | 导出到JS的方法名是OC的方法名的第一个部分,返回值必须是void ,要返回结果给Javascript,你必须通过回调或者触发事件来进行 | ------ |
RCT_REMAP_METHOD() 宏 |
指定导出给JS的方法名 | 避免在Javascript端的名字冲突 | |
Strikethrough | ~ |
避免在Javascript端的名字冲突 | ------ |
1.指定在Javascript中访问模块的名字RCT_EXPORT_MODULE()
- 需要导入
#import "RCTBridgeModule.h"
,并实现<RCTBridgeModule>
协议 RCT_EXPORT_MODULE()
宏,可以添加一个参数指定模块名字,如果不指定默认就是OC类名
2.明确声明给JS导出的方法RCT_EXPORT_METHOD()
- 导出到JS的方法名是OC的方法名的第一个部分
- 可以使用
RCT_REMAP_METHOD()
宏,指定JS方法名 - 桥接到JS方法返回值类型必须是
void
- React Native的桥接操作是异步的,所以要返回结果给Javascript,你必须通过回调或者触发事件来进行
// CalendarManager.h
#import "RCTBridgeModule.h"
@interface CalendarManager : NSObject <RCTBridgeModule>
@end
// CalendarManager.m
@implementation CalendarManager
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location)
{
RCTLogInfo(@"Pretending to create an event %@ at %@", name, location);
}
@end
<!--js-->
var CalendarManager = require('react-native').NativeModules.CalendarManager;
CalendarManager.addEvent('Birthday Party', '4 Privet Drive, Surrey');
相关方法 | 用途 | 注意事项 | 参数类型 |
---|---|---|---|
static showActionSheetWithOptions(options: Object, callback: Function) | 显示一个ActionSheet弹出框 | options(字符串数组 cancelButtonIndex(取消按钮索引) ``destructiveButtonIndex (高亮按钮) title(标题)``message(标题下方信息) |
------ |
RCT_REMAP_METHOD() 宏 |
明确声明给JS导出的方法 | 导出到JS的方法名是OC的方法名的第一个部分,返回值必须是void ,要返回结果给Javascript,你必须通过回调或者触发事件来进行 | ------ |
-
[React/React Native 的ES5 ES6写法对照表] (http://bbs.reactnative.cn/topic/15/react-react-native-的es5-es6写法对照表)
-
[React Native专题] (http://www.lcode.org/react-native/)
-
- 第一步:进入到*.xcodeproj文件的上级目录(一定要是他的上级目录),运行React Native初始化命令react-native init [Project Name],然后输入yes
- 第二步:删除Android相关的文件
- android
- index.android.js
- node_modules/react-native/android
- node_modules/react-native/ReactAndroid
- 第三步:新建Libraries的目录,然后从ios目录下的Libraries下的*.xcodeproj文件全部拖过来
- 第四步:添加React Native shell脚本
- 选择TARGETS的Build Phases界面-> + ->选择New Run Script Phase添加一个脚本,并命名为Bundle React Native code and images,把ios工程里的脚本引用复制过来,路径为:
export NODE_BINARY=node ./node_modules/react-native/packager/react-native-xcode.sh
- 选择TARGETS的Build Phases界面-> + ->选择New Run Script Phase添加一个脚本,并命名为Bundle React Native code and images,把ios工程里的脚本引用复制过来,路径为:
- 第五步:添加.a文件和添加搜索头文件的地址
- 删除ios目录,关闭原有工程再重新打开,在工程的Build Phases界面的Link Binary With Libraries,点击最下面的+号,添加Workspace下的.a文件
- TARGETS->Build Settings->Header Search Paths中添加一条$(SRCROOT)/node_modules/react-native/React,选择recursive
- 添加JavaScriptCore.framework
- 如果有需要在
TARGETS->Build Settings-> other linker flags
添加-lstdc++
- [mac上使用g++编译出错“Undefined symbols for architecture x86_64:” 错误解决办法] (http://www.th7.cn/Program/cp/201409/284464.shtml)
-
编辑器推荐
- React Native 简单教程
- 深入浅出 React Native:使用 JavaScript 构建原生应用
- React Native开源项目-F8 App环境搭建
- example-react-native-redux | 文章
- react-native-redux-demo | 文章
https://github.com/lexrus?tab=repositories
implicit declaration of function c99
时需要添加#import "RCTConvert.h"
Fresh react-native ios app not building
http://stackoverflow.com/questions/36203184/fresh-react-native-ios-app-not-building#