一、基本介绍

1,属性确认的作用
使用 React Native 创建的组件是可以复用的,所以我们开发的组件可能会给项目组其他同事使用。但别人可能对这个组件不熟悉,常常会忘记使用某些属性,或者某些属性传递的数据类型有误。

因此我们可以在开发 React Native 自定义组件时,可以通过属性确认来声明这个组件需要哪些属性。这样,如果在调用这个自定义组件时没有提供相应的属性,则会在手机与调试工具中弹出警告信息,告知开发者该组件需要哪些属性。

注意:为了保证 React Native 代码高效运行,属性确认仅在开发环境中有效。也就是说,正式发布的 App 运行时是不会进行检查的。

2,prop-types 库的安装和配置
过去我们可以直接使用 React.PropTypes 进行属性确认,不过这个自 React v15.5 起就被移除了。所以现在我们改用 prop-types 库代替。

(1)进入项目根目录,执行如下代码安装 prop-types 库:

npm install --save prop-types
 
  • 1

(2)在需要使用的 js 文件中使用如下代码引入:

import PropTypes from 'prop-types';
 
  • 1

二、使用样例

1,未使用属性确认
(1)这里我们自定义一个 List 组件(list.js)

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
} from 'react-native';
 
export default class List extends Component {
  show(title) {
   alert(title);
  }
  render() {
   var news = [];
   for(var i in this.props.news){
     var text = (
       <View key={i} style={styles.list_item}>
         <Text
           onPress={this.show.bind(this, this.props.news[i])}
           numberOfLines={1}
           style={styles.list_item_font}>
           {this.props.news[i]}
         </Text>
       </View>
     );
     news.push(text);
   }
   return (
     <View style={styles.flex}>
       {news}
     </View>
   );
  }
}
 
const styles = StyleSheet.create({
  flex:{
     flex:1
  },
  list_item:{
    height:40,
    marginLeft:10,
    marginRight:10,
    borderBottomWidth:1,
    borderBottomColor: '#ddd',
    justifyContent: 'center'
  },
  list_item_font:{
    fontSize:16
  },
});
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

(2)下面使用这个 List 组件,组件的 news 属性需要传递一个数组进来,这里我们故意传递个其它类型的数据。

import React, { Component } from 'react';
import {
 AppRegistry,
 StyleSheet,
 View,
} from 'react-native';
 
//导入自定义的列表组件
import List from './list'
 
class Main extends Component {
   render() {
     var news = [
        'Swift - 滑块(UISlider)的用法',
        'Swift - 告警框(UIAlertView)的用法',
        'Swift - 选择框(UIPickerView)的用法',
        'Swift - 操作表(UIActionSheet)的用法',
        'Swift - 滚动视图(UIScrollView)的用法'
     ];
     return (
       <View style={styles.flex}>
         <List news={123}></List>
       </View>
     );
   }
 }
 
 const styles = StyleSheet.create({
  flex:{
     flex:1
  },
 });
 
 AppRegistry.registerComponent('HelloWorld', () => Main);
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

(3)虽然我们数据类型都错了,但界面上是没有任何提示,只是没有数据显示出来。
2,使用属性确认
(1)下面对 list.js 代码做个修改,增加属性确认代码

import React, { Component } from 'react';
 import {
   AppRegistry,
   StyleSheet,
   Text,
   View,
 } from 'react-native';
 
 import PropTypes from 'prop-types';
 
 export default class List extends Component {
   //........
 }
 
 //添加属性确认
 List.propTypes = {
   news: PropTypes.array,
 }
 
 const styles = StyleSheet.create({
   //........
 });
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

(2)再此运行程序,会发现手机上弹出相关的警告信息。如果此时运行 React Native Dev Tool,那里面也会有相关的警告信息。

三、属性确认的语法

1,要求属性是指定的 JavaScript 基本类型

  • 属性: PropTypes.array,
  • 属性: PropTypes.bool,
  • 属性: PropTypes.func,
  • 属性:PropTypes.number,
  • 属性: PropTypes.object,
  • 属性: PropTypes.string,

2,要求属性是可渲染节点

  • 属性: PropTypes.node,

3,要求属性是某个 React 元素

  • 属性: PropTypes.element,

4,要求属性是某个指定类的实例

  • 属性: PropTypes.instanceOf(NameOfAClass),

5,要求属性取值为特定的几个值

  • 属性: PropTypes.oneOf(['value1', 'value2']),

6,要求属性可以为指定类型中的任意一个

  • 属性: PropTypes.oneOfType([ PropTypes.bool, PropTypes.number,
    PropTypes.instanceOf(NameOfAClass), ])

7,要求属性为指定类型的数组

属性: PropTypes.arrayOf(PropTypes.number),

8,要求属性是一个有特定成员变量的对象

属性: PropTypes.objectOf(PropTypes.number),

9,要求属性是一个指定构成方式的对象

  • 属性: PropTypes.shape({ color: PropTypes.string, fontSize:
    PropTypes.number, }),

10,属性可以是任意类型

  • 属性: PropTypes.any

四、将属性声明为必需的

上面描述的 10 种语法,都可以通过在后面加上 isRequired 声明它是必需的。

  • 属性: PropTypes.array.isRequired,
  • 属性: PropTypes.any.isRequired,
  • 属性:PropTypes.instanceOf(NameOfAClass).isRequired,

如果将属性声明为必需的,如果使用时没有给该属性传递数据,手机上会弹出相关的警告信息。