近期,Facebook将**React Native
的Andorid**版本也开源了,React Native是一个用于本地UI开发的javascript框架,目前FB通过JavascriptCore解释器将Andorid的框架层调用和JS绑定实现跨语言的调用。
目前React Native Android的开发只适用于Mac系统,开发前的准备,除了安装完基本的Android SDK/NDK环境后,还需要安装brew(Mac下的软件包管理器,类似apt)、npm(node包管理器)等。详细的安装步骤见**Getting Started,安装过程中遇到的大部分问题在React的Github issues**中都有解决。
var HelloMessage = React.createClass({
render: function() {
return <h1>Hello {this.props.name}</h1>;
}
});
ReactDOM.render(
<HelloMessage name="John" />,
document.getElementById('example')
);
JSX是一种类似XML语法的脚本扩展语法,并不能直接被JS引擎直接解释执行,它需要利用其他JS脚本把JSX翻译成JS来完成执行。
初始化
模块注册
Java-JS通信
public class MyCustomViewManager extends SimpleViewManager<MyCustomView> {
private static final String REACT_CLASS = "MyCustomView";
@UIProp(UIProp.Type.STRING)
public static final String PROP_MY_CUSTOM_PROPERTY = "myCustomProperty";
@Override
public String getName() {
return REACT_CLASS;
}
@Override
protected MyCustomView createViewInstance(ThemedReactContext reactContext) {
return new MyCustomView(reactContext);
}
@Override
public void updateView(MyCustomView view, CatalystStylesDiffMap props) {
super.updateView(view, props);
if (props.hasKey(PROP_MY_CUSTOM_PROPERTY)) {
view.setMyCustomProperty(props.getString(PROP_MY_CUSTOM_PROPERTY));
}
}
}
var React = require('react-native');
var { requireNativeComponent } = React;
class MyCustomView extends React.Component {
render() {
return <NativeMyCustomView {...this.props} />;
}
}
MyCustomView.propTypes = {
myCustomProperty: React.PropTypes.oneOf(['a', 'b']),
};
var NativeMyCustomView = requireNativeComponent('MyCustomView', MyCustomView);
module.exports = MyCustomView;
在Android平台下创建一个简单的Java Native模块,只需要继承ReactContextBaseJavaModule该类,并在需要导出至JS的函数加上注解@ReactMethod
即可。
另外你需要将这个模块需要注册到ReactPackage。
public class MyCustomModule extends ReactContextBaseJavaModule {
// Available as NativeModules.MyCustomModule.processString
@ReactMethod
public void processString(String input, Callback callback) {
callback.invoke(input.replace("Goodbye", "Hello"));
}
}
下面是js调用native的代码:
var React = require('react-native');
var { NativeModules, Text } = React;
var Message = React.createClass({
getInitialState() {
return { text: 'Goodbye World.' };
},
componentDidMount() {
NativeModules.MyCustomModule.processString(this.state.text, (text) => {
this.setState({text});
});
},
render: function() {
return (
<Text>{this.state.text}</Text>
);
}
});