[关闭]
@jflame 2015-09-28T01:33:12.000000Z 字数 2459 阅读 1927

React Native

React


React

React 按照 组件(Component)组织页面结构。创建之后,就像 HTML 标准标签中添加了新标签一样 (Web Components)。
比如 HTML 4 是没有 <video> 标签的, HTML 5 加入 video audio nav 之类的标签,但这样太慢了。
我们可以自己实现一个标签的功能逻辑,然后使用。

  1. var HelloComponent = React.createClass({
  2. render: function() {
  3. return (
  4. <div>Hello World</div>
  5. )
  6. }
  7. });

// 然后就可以这样使用

  1. <HelloComponent />

当然最开始需要挂到HTML上

  1. React.render(
  2. <HelloComponent />,
  3. document.querySelector('body')
  4. );

React Native Android

来自 race604/ZhiHuDaily-React-Native project

抽屉导航

官方提供了 DrawerLayoutAndroid 组件,其实就是对 Android 中的 DrawerLayout 的封装

  1. <DrawerLayoutAndroid
  2. ref={(drawer) => { this.drawer = drawer; }}
  3. drawerWidth = 200
  4. keyboardDismissMode = "on-drag"
  5. drawerPosition = {DrawerLayoutAndroid.positions.Left}
  6. renderNavigationView = {this._renderNavigationView}>
  7. <View style = {styles.container}>
  8. {content}
  9. </View>
  10. </DrawerLayoutAndroid>

列表

ListView 方法和 Android 原生的也类似,需要一个数据源 dataSource 和一个绘制每行界面的函数

  1. var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
  2. var dataSource = ds.cloneWithRows(['row 1', 'row 2']),
  3. <ListView
  4. dataSource={dataSource}
  5. renderRow={(rowData) => <Text>{rowData}</Text>}
  6. />

自己封装原生组件 WebView

  1. public class ReactWebViewManager extends SimpleViewManager<WebView> {
  2. public static final String REACT_CLASS = "RCTWebView";
  3. @UIProp(UIProp.Type.STRING)
  4. public static final String PROP_URL = "url";
  5. @UIProp(UIProp.Type.STRING)
  6. public static final String PROP_HTML = "html";
  7. @UIProp(UIProp.Type.STRING)
  8. public static final String PROP_CSS = "css";
  9. @Override
  10. public String getName() {
  11. return REACT_CLASS;
  12. }
  13. @Override
  14. protected WebView createViewInstance(ThemedReactContext reactContext) {
  15. return new WebView(reactContext);
  16. }
  17. @Override
  18. public void updateView(final WebView webView, CatalystStylesDiffMap props) {
  19. super.updateView(webView, props);
  20. if (props.hasKey(PROP_URL)) {
  21. webView.loadUrl(props.getString(PROP_URL));
  22. }
  23. if (props.hasKey(PROP_HTML)) {
  24. String html = props.getString(PROP_HTML);
  25. if (props.hasKey(PROP_CSS)) {
  26. String css = props.getString(PROP_CSS);
  27. html = "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + css + "\" />" + html;
  28. }
  29. webView.loadData(html, "text/html; charset=utf-8", "UTF-8");
  30. }
  31. }
  32. }

注册 ReactWebViewManager 到 ReactInstanceManager 中,ReactInstanceManager 在 MainActivity 实例化

js 封装成模块

  1. class ObservableWebView extends React.Component {
  2. render() {
  3. return <RCTWebView {...this.props} />;
  4. }
  5. }
  6. ObservableWebView.propTypes = {
  7. url: PropTypes.string,
  8. html: PropTypes.string,
  9. css: PropTypes.string,
  10. };
  11. var RCTWebView = requireNativeComponent('RCTWebView', ObservableWebView);
  12. module.exports = ObservableWebView;

最后使用

var MyWebView = require('./WebView');

此处输入图片的描述
此处输入图片的描述
此处输入图片的描述

web 特性

/data/data/com.rctzhihudaily/ 目录(手机需要 Root 才能看到)下 files 文件夹下的 ReactNativeDevBundle.js 是 js 源码。

潜在的特性——在线更新,当然涉及到在线 native code 的,还是需要版本更新。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注