1.propTypes:
static propTypes = { name:PropTypes.string, ID:PropTypes.number.isRequired, }
'isRequired' 表示如果不传递这个属性,那么开发阶段中,系统会出现警告,让我们对其进行属性确认,也就是说是否为必须属性。
1>属性为任何类型:
React.PropTypes.any
2>属性是否是 JavaScript 基本类型:
React.PropTypes.array; React.PropTypes.func; React.PropTypes.bool; React.PropTypes.number; React.PropTypes.object; React.PropTypes.string;
React.PropTypes.style;
3>属性是某个 React 元素:
React.PropTypes.element;
4>属性为几个特定的值:
React.PropTypes.oneOf(['value1', 'value2'])
5>属性为指定类型中的一个:
React.PropTypes.oneOfType([ React.PropTypes.node, React.PropTypes.number, React.PropTypes.string ])
6>属性为可渲染的节点:
React.PropTypes.node;
7>属性为某个指定类的实例:
React.PropTypes.instanceOf(NameOfClass);
8>属性为指定类型的数组:
React.PropTypes.arrayOf(React.PropTypes.string)
9>属性有一个指定的成员对象:
React.PropTypes..objectOf(React.PropTypes.number)
10>属性是一个指定构成方式的对象:
React.PropTypes.shape({ color:React.PropTypes.stirng, fontSize:React.PropTypes.number })
2.属性默认值(当我们没有传递属性的时候使用):
static defaultProps = { name:'思思' };
3.react-native-pull使用网络请求:
// 网络请求 fetchData(resolve) { setTimeout(() => { fetch('http://guangdiu.com/api/gethots.php') .then((response) => response.json()) .then((responseData) => { this.setState({ dataSource: this.state.dataSource.cloneWithRows(responseData.data), loaded:true, }); if (resolve !== undefined){ setTimeout(() => { resolve(); // 关闭动画 }, 1000); } }) .done(); }); }
4.DeviceEventEmitter的使用:
注意: 不管是在发送还是接收页面都需要引入DeviceEventEmitter.
// 导入 import {DeviceEventEmitter} from 'react-native'; // 接收通知 componentDidMount(){ this.listener = RCTDeviceEventEmitter.addListener('通知名称',(value)=>{ // 接受到通知后的处理 }); } componentWillUnmount(){ // 移除 一定要写 this.listener.remove(); } // 发通知 RCTDeviceEventEmitter.emit('通知名称',value);
5.处理根据服务器返回数据处理显示视图:
注意push需要给子视图设置Key值...
render() { var views = []; if (this.props.fileListData.length <= 0) { views.push(// 设置key消除警告 <View key={'1'}> </View> ); } else { views.push( <View style={styles.container} key={'1'}> <Text style={styles.textTipStyle}> 附件列表: </Text> <View style = {styles.fileListContainerStyle}> {this.renderFileListView()} </View> </View> ); } return ( <View> {views} </View> ); }
6.设置背景透明:
backgroundColor:'transparent',或者backgroundColor:'rgba(0,0,0,0)',
7.取得文件扩展名:
// 判断后缀名 var fileName = rowData.name; console.log(fileName); var index1 = fileName.lastIndexOf("."); var index2 = fileName.length; var suffixStr = fileName.substring(index1,index2);//后缀名 console.log(suffixStr);
8.ListView使用:
return ( <ListView initialListSize={1} dataSource={dataSource} renderRow={this.renderItem} style={styles.listView} onEndReached={() => this.onEndReached(typeId)} onEndReachedThreshold={10} renderFooter={this.renderFooter} refreshControl={ <RefreshControl style={styles.refreshControlBase} refreshing={read.isRefreshing} onRefresh={() => this.onRefresh(typeId)} title="Loading..." colors={['#ffaa66cc', '#ff00ddff', '#ffffbb33', '#ffff4444']} /> } />
9.FlatList使用:
const AnimatedFlatList = Animated.createAnimatedComponent(FlatList);
renderData() { return ( <View style={styles.container}> <AnimatedFlatList style={{backgroundColor: 'white'}} data={this.state.dataArray} renderItem={this.renderItemView.bind(this)} onEndReached={this.loadMoreData.bind(this)} onRefresh={this.onRefresh.bind(this)} refreshing={this.state.refreshing} ListFooterComponent={this.renderFooter.bind(this)} onEndReachedThreshold={60} keyExtractor={(item,index)=>item.key=index}/> <Toast ref="toast" position='top'/> </View> ); }
10.循环遍历数组方式:
this.state.typeIds.map((typeId) => { // 数据处理 });
for (var i = 0; i < this.props.fileListData.length; i++) { // 数据处理 }
// for in 注意index是下标,不是元素 for (var index in data.orgUsersBeanList) { // 数据处理 }
// for of value是元素值 for (var value of data.orgUsersBeanList) { }
11.监听Android的返回按钮点击:
componentWillMount() { BackHandler.addEventListener('hardwareBackPress', this.onBackAndroid); this.getUserInfo(); } componentWillUnmount() { BackHandler.removeEventListener('hardwareBackPress', this.onBackAndroid); } onBackAndroid = () => { BackHandler.exitApp(); return true; }
12.ref的使用:
ref 接受值为string类型的参数或者一个函数function.
<WebView ref={(ref) => { this.webview = ref; }} />
只有在组件的render方法被调用时,ref才会被调用,组件才会返回ref。如果你在调用this.refs.xx时render方法还没被调用,那么你得到的是undefined。
心得:ref属性在开发中使用频率很高,使用它你可以获取到任何你想要获取的组件的对象,有个这个对象你就可以灵活地做很多事情,比如:读写对象的变量,甚至调用对象的函数。
13.让组件做到局部刷新setNativeProps :
不使用state或是props。
setNativeProps 方法可以理解为web的直接修改dom。使用该方法修改 View 、 Text 等 RN自带的组件 ,则不会触发组件的 componentWillReceiveProps 、 shouldComponentUpdate 、componentWillUpdate 等组件生命周期中的方法。
buttonPressed() { //当按钮按下的时候执行此函数 let textInputValue = 'yuanmenglong'; this.setState({textInputValue}); //修改文本输入框的属性值 this.refs.textInputRefer.setNativeProps({ editable:false }); this.refs.text2.setNativeProps({ style:{ color:'blue', fontSize:30 } }); //使文本输入框变为不可编辑 }
}
render( <View style={styles.container}> <Text style={styles.buttonStyle} onPress={this.buttonPressed}> 按我 </Text> <Text style={styles.textPromptStyle} ref="text2"> 文字提示 </Text> <View> <TextInput style={styles.textInputStyle} ref="textInputRefer" value={this.state.textInputValue} onChangeText={(textInputValue)=>this.setState({textInputValue})} /> </View> );
14....this.props:
render() { return <Category {...this.props} />; }
获取来自父组件的属性,再传递给Category这个子组件.