RN组件之ScrollView
一.ScrollView
该组件封装了Android平台的ScrollView(滚动组件),并且提供触摸事件"responder"系统功能.使用ScrollView的时候
确保有一个固定的高度,因为这个控件其实就是把很多不固定高度的子控件装入到固定的父容器中(通过滑动交互).
如果我们要给ScrollView进行设置高度的话,要么我们直接ScrollView进行设置高度(不建议).另一种方法就是给
ScrollView的父控件设置相关高度.使用第二种方法ScrollView中是不能加{fLex:1},不然不会有效果的.
1.属性方法(通用和Android的)
(1)View相关属性样式全部继承(例如:宽和高,背景颜色,边距等相关属性样式)
(2)contentContainerStyle:样式风格属性(传入StyleSheet创建的Style文件).该样式会作用于被ScrollView
包裹的所有子视图
(3)horizontal(bool):表示ScrollView是横向滑动还是纵向滑动.默认false表示纵向滑动
(4)keyboardDismissMode(enum):('none','interactive','on-drag')
none(默认值):拖拽时不隐藏软键盘
on-drag:当拖拽开始的时候隐藏键盘
interactive:软键盘伴随拖拽操作同步地消失,并且如果往上滑动会恢复键盘.安卓设备不支持这个选项,
会表现的和none一样.
(5)keyboardShouldPersiitTaps(bool):当此属性为false的时候,在软键盘激活之后,点击焦点文本框以外的
地方,键盘就会隐藏.如果为true,滚动视图不会响应点击操作,并且键盘不会自动消失.默认值为false.
(6)onScroll(function):在滚动的过程中,每帧最多调用一次回调函数.调用的频率可以用
scrollEventThrottle属性来控制
(7)refreshControl (element):指定RefershControl,用于为ScrollView提供下拉刷新功能.
(8)removeClippedSubviews(bool):(实验特性):当此属性为true时,屏幕之外的子视图(子视图的overflow
样式需要设为hidden)会被移除.这个可以提升大列表的滚动性能.默认值为true.
(9)showsHorizontalScollIndicator(bool):当此属性为true的时候,显示一个水平方向的滚动条
(10)showsVerticalScrollIndicator(bool):当此属性为true的时候,显示一个垂直方向的滚动条
2.style样式
(1)Flexbox...
(2)Transforms...
(3)backfaceVisibility enum('visible','hidden')
(4)borderColor string
(5)borderTopColor string
(6)borderRightColor string
(7)borderBottomColor string
(8)borderLeftColor string
(9)borderRadius number
.....
代码示例:
1 'user strict' 2 const React =require('react-native'); 3 const { 4 AppRegistry, 5 ScrollView, 6 StyleSheet, 7 RefreshControl, 8 Text, 9 View, 10 }=React; 11 const styles=StyleSheet.create({ 12 row:{ 13 borderColor:'red', 14 borderWidth:5, 15 padding:5, 16 backgroundColor:'#3a5795', 17 margin:5, 18 }, 19 text:{ 20 alignSelf:'center', 21 color:'#fff', 22 }, 23 scrollview:{ 24 flex:1, 25 } 26 }); 27 28 const Row =React.createClass({ 29 //误导新手啊,这句没用啊... 30 /* _onClick:function (){ 31 this.props.onClick(this.props.data); 32 },*/ 33 render:function(){ 34 return ( 35 <View style={styles.row}> 36 <Text style={styles.text}> 37 {this.props.data.text} 38 </Text> 39 </View> 40 ); 41 }, 42 }); 43 44 const RefreshControlDemo =React.createClass({ 45 getInitialState(){ 46 return { 47 isRefreshing:false, 48 loaded:0, 49 rowData:Array.from(new Array(20)).map( 50 (val,i) =>({text:"初始行"+i}) 51 ), 52 }; 53 }, 54 render(){ 55 const rows=this.state.rowData.map((row,ii) =>{ 56 return <Row key={ii} data={row}/> 57 }); 58 return( 59 <ScrollView 60 style={styles.scrollview} 61 refreshControl={ 62 <RefreshControl 63 refreshing={this.state.isRefreshing} 64 onRefresh={this._onRefresh} 65 colors={['#ff0000','#00ff00']} 66 progressBackgroundColor="#ffffff" 67 /> 68 }> 69 {rows} 70 </ScrollView> 71 ); 72 }, 73 74 75 _onRefresh(){ 76 this.setState({isRefreshing:true}); 77 setTimeout(() =>{ 78 //准备下拉刷新的5条数据 79 const rowData =Array.from(new Array(5)) 80 .map((val,i) =>({ 81 text:'刷新行'+(+this.state.loaded+i) 82 })) 83 .concat(this.state.rowData); 84 this.setState({ 85 loaded:this.state.loaded+5, 86 isRefreshing:false, 87 rowData:rowData, 88 }); 89 },2000); 90 }, 91 }); 92 93 AppRegistry.registerComponent('MyProject2', () => RefreshControlDemo);