react-native组件学习(二)

今天初步学习了react中的一些组件,跟大家分享一下:

DrawerLayoutAndroid

DrawerLayoutAndroid是android上专有的组件,类似有android上的DrawerLayout布局,用来设置滑动抽屉的,该组件是通过renderNavigationView方法来渲染的:

DrawerLayoutAndroid 常用属性

有如下属性:

  • drawerPosition 指定抽屉从屏幕的那一侧划出
  • drawerWidth 指定抽屉的宽度
  • keyboardDismissMode
    指定在滑动过程中是否隐藏软键盘。有如下取值:
    1.none 默认值,在滑动过程中不隐藏软键盘
    2.on-drag 在滑动开始时候,即隐藏软键盘
  • onDrawerClose 当抽屉关闭时候,回调该方法
  • onDrawerOpen 当抽屉打开时候回调该方法
  • onDrawerSlide 当抽屉产生交互效果时候,回调该方法
  • onDrawerStateChanged 当抽屉的状态发生变化时,回调该方法
    先看下效果吧。
    这里写图片描述
    全部代码如下:
'use strict'; //启用严苛模式

var React = require('react-native');  

//声明需要使用到的组件
var {
  AppRegistry,
  DrawerLayoutAndroid,
  StyleSheet,
  Text,
  View,
} = React;


var firstProject = React.createClass({
// render方法用于将下面一系列的末班转换成html,用来显示
 render: function() {
 // 创建抽屉栏需要显示的内容
  var navigationView = (
    <View style={{flex: 1, backgroundColor: '#fff'}}>
      <Text style={{margin: 20, fontSize: 20,backgroundColor: "red", textAlign: 'left'}}>First drawer</Text>
      <Text style={{margin: 20, fontSize: 20,backgroundColor: "blue", textAlign: 'left'}}>Second drawer</Text>
    </View>
  );
  return (
    <DrawerLayoutAndroid
      drawerWidth={300} //抽屉组件的宽度
      drawerPosition={DrawerLayoutAndroid.positions.Left}  //指定弹出的方向
      // 通过renderNavigationView方法渲染一个抽屉组件,其内容就是显示主视图
      renderNavigationView={() => navigationView}>
      <View style={{flex: 1, alignItems: 'center'}}>
        <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>Hello</Text>
        <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>World!</Text>
      </View>
    </DrawerLayoutAndroid>
  );
  }
})

AppRegistry.registerComponent('firstProject', () => firstProject);

查看log

在开发中,经常会遇到log的打印,而我们可以通过google浏览器的开发者模式来查看react中打印的log,先看代码:

var firstProject = React.createClass({
// render方法用于将下面一系列的末班转换成html,用来显示
 render: function() {
 // 创建抽屉栏需要显示的内容
  var navigationView = (
    <View style={{flex: 1, backgroundColor: '#fff'}}>
      <Text style={{margin: 20, fontSize: 20,backgroundColor: "red", textAlign: 'left'}}>First drawer</Text>
      <Text style={{margin: 20, fontSize: 20,backgroundColor: "blue", textAlign: 'left'}}>Second drawer</Text>
    </View>
  );
  return (
    <DrawerLayoutAndroid
      drawerWidth={200} //抽屉组件的宽度
      drawerPosition={DrawerLayoutAndroid.positions.Right}  //指定弹出的方向
      // 通过renderNavigationView方法渲染一个抽屉组件,其内容就是显示主视图
      renderNavigationView={() => navigationView}
      onDrawerClose={() => console.log('DrawerLayoutAndroid onDrawerClose!')}
      onDrawerOpen={() => console.log('DrawerLayoutAndroid onDrawerOpen!')}
      onDrawerStateChanged={() => console.log('DrawerLayoutAndroid onDrawerStateChanged!')} 

      >
      <View style={{flex: 1, alignItems: 'center'}}>
        <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>Hello</Text>
        <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>World!</Text>
      </View>
    </DrawerLayoutAndroid>
  );
  }
})

这里我为DrawerLayoutAndroid添加了三个事件的监听,点击menu,选择”chrome debug”选项。打开谷歌浏览器,F12,此时效果如下:
这里写图片描述

ProgressBarAndroid

该组件类似于android平台的ProgressBar,用于显示正在加载的进度条,有如下属性:

color string 

进度条的颜色。

indeterminate indeterminateType 

决定进度条是否要显示一个不确定的进度。注意这个在styleAttr是Horizontal的时候必须是false。

progress number 

当前的进度值(在01之间)。

styleAttr STYLE_ATTRIBUTES 

进度条的样式。可取值有:

Horizontal
Small
Large
Inverse
SmallInverse

这里写图片描述
先看下运行效果:
这里写图片描述

完整代码如下:

'use strict';

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

var secondProject = React.createClass({
render: function() { 
  return (
    <View>
      <Text style={styles.fontstyle}> styleAttr="Inverse"</Text>
      <ProgressBar styleAttr="Inverse" style={{color: "red"}}/>
      <View style={styles.viewstyle}></View>

      <Text style={styles.fontstyle}> styleAttr="Horizontal"</Text>
      <ProgressBar styleAttr="Horizontal" style={{color: "blue", width:300 ,height: 20}}/>
      <View style={styles.viewstyle}></View>

      <Text style={styles.fontstyle}> styleAttr="Small"</Text>
      <ProgressBar styleAttr="Small"/>
      <View style={styles.viewstyle}></View>

      <Text style={styles.fontstyle}> styleAttr="Large"</Text>
      <ProgressBar styleAttr="Large" style={{color: "green"}}/>
      <View style={styles.viewstyle}></View>

      <Text style={styles.fontstyle}> styleAttr="SmallInverse"</Text>
      <ProgressBar styleAttr="SmallInverse"/>
      <View style={styles.viewstyle}></View>

      <Text style={styles.fontstyle}> styleAttr="LargeInverse"</Text>
      <ProgressBar styleAttr="LargeInverse"/>
      <View style={styles.viewstyle}></View>

    </View>
  );
  },
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
  },
  fontstyle: {
    color: "blue",
    fontSize: 20,
    textAlign: "center",
  },
  viewstyle: {
    borderColor: "red",
    borderWidth: 1,
  }
});

AppRegistry.registerComponent('secondProject', () => secondProject);

为ProgressBarAndroid 进度条指定进度

先看下效果吧:
这里写图片描述

引入的模块
var React = require('react-native');
var ProgressBar = require('ProgressBarAndroid'); //引入ProgressBarAndroid模块
var TimerMixin = require('react-timer-mixin'); //引入计时器模块
创建一个MovingBar组件
var MovingBar = React.createClass({
  mixins: [TimerMixin],
  //通过getInitialState方法为progress设置初始值
  getInitialState: function() {
    return {
      progress: 0
    };
  },
  //componentDidMount,该方法在初始化渲染执行之后立刻调用一次
  componentDidMount: function() {
    //调用setInterval方法,每隔50毫秒,将当前进度增加5个
    this.setInterval(
      () => {
        var progress = (this.state.progress + 0.02) % 1;
        this.setState({progress: progress});
      }, 50
    );
  },

  render: function() {
    //这里由于返回用于显示的组件是一个数组,即有多个组件,因此使用()来包裹起来
    return (
         <View>
            <ProgressBar progress={this.state.progress} {...this.props} />
            <Text>
            当前进度:{Math.round(this.state.progress * 100) + "%"}
            </Text>
         </View>
      );
  },
});
在项目中显示自定义的Movingbar组件
var secondProject = React.createClass({
render: function() { 
  return (
    <View>
      <MovingBar styleAttr="Horizontal" indeterminate={false} />
    </View>
  );
  },
});

这里由于是水平进度的,所有indeterminate属性值必须是false

Switch控件学习

ok,下面学习Switch空间,先看一个简单的效果吧:
这里写图片描述

Switch控件基本实例

代码也很简单:

引入SwitchAndroid模块
var SwitchAndroid = require('SwitchAndroid');
设置初始状态
getInitialState: function() {
    return {
      switchIsOn: true,
    };
},

这里为其switchIsOn属性设定了一个初始状态为true的值。

使用render方法渲染需要显示的Switch控件
render: function() {
    return (
      <View style={styles.container}>
       <SwitchAndroid
              onValueChange={(value) => this.setState({switchIsOn: value})}
              style={{marginBottom: 10}}
              value={this.state.switchIsOn} />
   </View>
    );
设定container样式
var styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    justifyContent: 'center',
    alignItems: 'center',
  },
});

这里,水平垂直居中显示。

自定义可设定初始值的Switch控件

下面我自己写了一个可以设定初始值的Switch控件,比较简单,先看下效果吧:
这里写图片描述

为属性值设定初始状态
getInitialState: function() {
    return {
      switchIsOn: true,
      defaultTitle : "on"
    };
  },

这里switchIsOn用来标志当前的Switch是否被选中,defaultTitle 用来显示当前的状态。

根据用户设定,动态改变初始值
componentDidMount: function() {
var defaultOn = this.props.defaultOn;
this.setState({switchIsOn: defaultOn});
this.setState({defaultTitle: defaultOn ? "on":"off"});
},
渲染需要显示的组件
render: function() {
    return (
      <View style={styles.mySwithStyle}>
        <SwitchAndroid
              onValueChange={(value) => this.setState({switchIsOn: value},this.setState({defaultTitle: value ? "on":"off"}))}
              style={{marginBottom: 10}}
              value={this.state.switchIsOn} />
        <Text style={{color: "red",fontSize: 20}}>{this.state.defaultTitle}</Text>
      </View>
    );
  },

这里当点击Switch组件的时候,会回调onValueChange方法,因此在该方法中,根据当前的值,对其状态进行了改变。

使用MySwitch
var secondProject = React.createClass({
  render: function() {
    return (
      <View style={styles.container}>
       <MySwitch defaultOn={false}/>
       <MySwitch defaultOn={true}/>
       <MySwitch defaultOn={true}/>
   </View>
    );
  },
});

这里,我为自定义的defaultOn分别设定不同的初始状态。此时运行就是上面的效果了,好了,贴上全部的代码:

'use strict';

var React = require('react-native');
var ProgressBar = require('ProgressBarAndroid');
var SwitchAndroid = require('SwitchAndroid')
var TimerMixin = require('react-timer-mixin'); //引入计时器模块
var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Image,
} = React;

var MySwitch = React.createClass({
  getInitialState: function() {
    return {
      switchIsOn: true,
      defaultTitle : "on"
    };
  },

  componentDidMount: function() {
    var defaultOn = this.props.defaultOn;
    this.setState({switchIsOn: defaultOn});
    this.setState({defaultTitle: defaultOn ? "on":"off"});

  },

  render: function() {
    return (
      <View style={styles.mySwithStyle}>
        <SwitchAndroid
              onValueChange={(value) => this.setState({switchIsOn: value},this.setState({defaultTitle: value ? "on":"off"}))}
              style={{marginBottom: 10}}
              value={this.state.switchIsOn} />
        <Text style={{color: "red",fontSize: 20}}>{this.state.defaultTitle}</Text>
      </View>
    );
  },
});


var secondProject = React.createClass({
  render: function() {
    return (
      <View style={styles.container}>
       <MySwitch defaultOn={false}/>
       <MySwitch defaultOn={true}/>
       <MySwitch defaultOn={true}/>

   </View>
    );
  },
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    justifyContent: 'center',
    alignItems: 'center',
  },
  mySwithStyle: {
    flex: 1,
    flexDirection: 'row',
    alignItems: 'center',
    justifyContent: 'center',
  },
  fontstyle: {
    color: "blue",
    fontSize: 20,
    textAlign: "center",
  },
  viewstyle: {
    borderColor: "red",
    borderWidth: 1,
  }
});

AppRegistry.registerComponent('secondProject', () => secondProject);

ok,关于react-native组件学习,该篇就到这里了,未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值