React Native移动框架功能研究

React Native移动框架功能研究react


此篇只研究React Native框架的功能。android

1、React Natvie是什么ios

React Native是使用React(或者说JS)来开发原生APP的框架。git

2、React Native的愿景github

1.提供一直的跨平台开发原生APP的一直体验。spring

2.使用JSReact提升跨平台开发效率。react-native

3、React Native提供的特性数组

1.提供了丰富的原生组件,能够是APP得到平台一致的视觉效果和体验,同时得到最佳的性能和流畅性。babel

 
// iOS & Android

var React = require('react-native');
var { ScrollView, TouchableHighlight, Text } = React;

var TouchDemo = React.createClass({
  render: function() {
    return (
      <ScrollView>
        <TouchableHighlight onPress={() => console.log('pressed')}>
          <Text>Proper Touch Handling</Text>
        </TouchableHighlight>
      </ScrollView>
    );
  },
});
 

2.JS代码和原平生台之间的全部操做都是异步执行的,原生模块能够根据须要自由建立线程。同时二者之间的通信是彻底可序列化的,这使其能够借助Chorme开发这工具进行调试。网络

3.提供强大的触控事件处理系统,能够在复杂的UI层次结构下方便的处理触控事件。

// iOS & Android

var React = require('react-native');
var { ScrollView, TouchableHighlight, Text } = React;

var TouchDemo = React.createClass({
  render: function() {
    return (
      <ScrollView>
        <TouchableHighlight onPress={() => console.log('pressed')}>
          <Text>Proper Touch Handling</Text>
        </TouchableHighlight>
      </ScrollView>
    );
  },
});

 

4.经过Flexbox简化UI布局,提供高性能机制声明样式和布局,并可直接应用到组件中。
// iOS & Android

var React = require('react-native');
var { Image, StyleSheet, Text, View } = React;

var ReactNative = React.createClass({
  render: function() {
    return (
      <View style={styles.row}>
        <Image
          source={{uri: 'http://facebook.github.io/react/img/logo_og.png'}}
          style={styles.image}
        />
        <View style={styles.text}>
          <Text style={styles.title}>
            React Native
          </Text>
          <Text style={styles.subtitle}>
            Build high quality mobile apps using React
          </Text>
        </View>
      </View>
    );
  },
});
var styles = StyleSheet.create({
  row: { flexDirection: 'row', margin: 40 },
  image: { width: 40, height: 40, marginRight: 10 },
  text: { flex: 1, justifyContent: 'center'},
  title: { fontSize: 11, fontWeight: 'bold' },
  subtitle: { fontSize: 10 },
});

 




5.提供灵活的机制,方便自定义原生视图和模块。4、React Native的功能1.样式React NativeJS中定义和引用样式。能够经过StyleSheet定义样式
var styles = StyleSheet.create({
  base: {
    width: 38,
    height: 38,
  },
  background: {
    backgroundColor: '#222222',
  },
  active: {
    borderWidth: 2,
    borderColor: '#00ff00',
  },
});
在组件中使用样式
<Text style={styles.base} />
<View style={styles.background} />
同时能够接受多个样式,后边的会覆盖前边的样式
<View style={[styles.base, styles.background]} />
能够结合表达式控制是否应用样式
<View style={[styles.base, this.state.active && styles.active]} />
也能够直接在元素中声明样式,可是每次渲染都会重建样式,影响性能。
<View
  style={[styles.base, {
    width: this.state.width,
    height: this.state.width * this.state.aspectRatio
  }]}
/>
样式也能够做为参数传递
var List = React.createClass({
  propTypes: {
    style: View.propTypes.style,
    elementStyle: View.propTypes.style,
  },
  render: function() {
    return (
      <View style={this.props.style}>
        {elements.map((element) =>
          <View style={[styles.element, this.props.elementStyle]} />
        )}
      </View>
    );
  }
});

// ... 在别的文件中引用List组件 ...
<List style={styles.list} elementStyle={styles.listElement} />

 


2.图片加载本地静态图片,图片基于当前js的目录。若是带有平台相关的扩展名,则系统自动根据当前的系统平台自动加载相关的图片,例如my-icon.ios.png
<Image source={require('./my-icon.png')} />

 


使用@2x@3x这样的文件名后缀,能够为不一样的屏幕精度提供图片能够在React Native中直接使用内嵌到APP中的图片资源
<Image source={{uri: 'app_icon'}} style={{width: 40, height: 40}} />

 

能够加载网络图片,可是须要手动指定图片大小
<Image source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}}
       style={{width: 400, height: 400}} />

 

经过将元素嵌套到Image中实现背景图片
return (
  <Image source={...}>
    <Text>Inside</Text>
  </Image>
);

 



















3.手势触控系统提供TouchableTouchableHighlight来定义可触控控件。响应者的声明周期以下:是否愿意成为响应者View.props.onStartShouldSetResponder(开始触摸的时候是否愿意)View.props.onMoveShouldSetResponder(若是不是响应者,则每次开始移动触控点时询问是否缘由)若是愿意成为响应者,则接下来开始尝试成为响应者View.props.onResponderGrant(成功成为响应者)View.props.onResponderReject(被拒绝成为响应者)若是成功成为响应者,则开始具体的响应触控事件View.props.onResponderMove(响应屏幕手指移动)View.props.onResponderRelease(响应屏幕手指离开)View.props.onResponderTerminationRequest(其余组件请求接替响应者,返回true则释放本身响应者角色)View.props.onResponderTerminate(响应者角色已交出)onStartShouldSetResponderonMoveShouldSetResponder是以冒泡的形式调用的,即嵌套最深的节点最早调用。若是某个父View会但愿能先成为响应者。咱们能够利用“捕获期”来解决这一需求View.props.onStartShouldSetResponderCaptureView.props.onMoveShouldSetResponderCapture4.动画用于全局的布局动画LayoutAnimation,和用于建立更精细的交互控制的动画AnimatedAnimated库使得开发者能够很是容易地实现各类各样的动画和交互方式,而且具有极高的性能。它包括两个值类型,Value用于单个的值,而ValueXY用于向量值;还包括三种动画类型,springdecay,还有timing,以及三种组件类型,ViewTextImage。咱们可使用Animated.createAnimatedComponent方法来对其它类型的组件建立动画
class Playground extends React.Component {
  constructor(props: any) {
    super(props);
    this.state = {
      bounceValue: new Animated.Value(0),
    };
  }
  render(): ReactElement {
    return (
      <Animated.Image                         // 可选的基本组件类型: Image, Text, View
        source={{uri: 'http://i.imgur.com/XMKOH81.jpg'}}
        style={{
          flex: 1,
          transform: [                        // `transform`是一个有序数组(动画按顺序执行)
            {scale: this.state.bounceValue},  // 将`bounceValue`赋值给 `scale`
          ]
        }}
      />
    );
  }
  componentDidMount() {
    this.state.bounceValue.setValue(1.5);     // 设置一个较大的初始值
    Animated.spring(                          // 可选的基本动画类型: spring, decay, timing
      this.state.bounceValue,                 // 将`bounceValue`值动画化
      {
        toValue: 0.8,                         // 将其值以动画的形式改到一个较小值
        friction: 1,                          // Bouncier spring
      }
    ).start();                                // 开始执行动画
  }
}

 

多个动画能够经过parallel(同时执行)、sequence(顺序执行)、staggerdelay来组合使用
Animated.sequence([            // 首先执行decay动画,结束后同时执行spring和twirl动画
  Animated.decay(position, {   // 滑行一段距离后中止
    velocity: {x: gestureState.vx, y: gestureState.vy}, // 根据用户的手势设置速度
    deceleration: 0.997,
  }),
  Animated.parallel([          // 在decay以后并行执行:
    Animated.spring(position, {
      toValue: {x: 0, y: 0}    // 返回到起始点开始
    }),
    Animated.timing(twirl, {   // 同时开始旋转
      toValue: 360,
    }),
  ]),
]).start();  

 

LayoutAnimation容许在全局范围内建立和更新动画,它经常使用来更新flexbox布局
var App = React.createClass({
  componentWillMount() {
    // 建立动画
    LayoutAnimation.spring();
  },

  getInitialState() {
    return { w: 100, h: 100 }
  },

  _onPress() {
    // 让视图的尺寸变化以动画形式展示
    LayoutAnimation.spring();
    this.setState({w: this.state.w + 15, h: this.state.h + 15})
  },

  render: function() {
    return (
      <View style={styles.container}>
        <View style={[styles.box, {width: this.state.w, height: this.state.h}]} />
        <TouchableOpacity onPress={this._onPress}>
          <View style={styles.button}>
            <Text style={styles.buttonText}>Press me!</Text>
          </View>
        </TouchableOpacity>
      </View>
    );
  }
});

 





























若是对性能要求比较高setNativeProps方法可使咱们直接修改基于原生视图的组件的属性,而不须要使用setState来从新渲染整个组件树,从而可使咱们得到较好的性能。此时应该注意被render从新调用的时候覆盖掉5.提供的调试工具开发者菜单Chrome开发者工具React开发工具插件FPS监视器6.自动化测试使用Jest进行单元测试,使用Travis做为持续集成系统。集成测试和快照测试只使用IOS7.JS环境IOSAndroid模拟器和真机上,使用的是JavaScriptCoreChorme调试时,代码运行在V8引擎中。React Native0.5.0版本开始已经内置Babel转换器,使咱们可使用最新的js语法编写代码8.导航器官方提供提供通用跨平台的Navigatorjs编写方便扩展。开源社区提供的NavigatorIOS,只能在IOS中使用,依赖Object-c,积压bug无人解决,不建议使用。9.特定平台代码将代码放在特定平台的文件夹下/common/components/ /android/components//ios/components/组件命名中添加平台标志BigButtonIOS.jsBigButtonAndroid.js特定平台扩展名BigButton.ios.jsBigButton.android.jsjs中判断当前平台
var {Platform} = React;

var styles = StyleSheet.create({
  height: (Platform.OS === 'ios') ? 200 : 100,
});

 

、已知存在的问题模块和原生视图缺失,好比MapsSpinner

 某些属性仅仅支持单个平台

 有一些已经存在的组件和API没能进行统一抽象为通用的,好比ActivityIndicatorIOSProgressBarAndroid

    overflow样式在Android中没法使用

 不支持Android M6.0)的权限

    NG图片的内存问题

相关文章
相关标签/搜索