React Native之prop-types进行属性确认详解


Posted in Javascript onDecember 19, 2017

属性确认的作用

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

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

React Native已经升级到0.51.0了,版本升级很快,但是对老项目也会有一些问题,常见的就是属性找不到的问题。例如:

React Native之prop-types进行属性确认详解 

主要原因是随着React Native的升级,系统废弃了很多的东西,过去我们可以直接使用 React.PropTypes 来进行属性确认,不过这个自 React v15.5 起就被移除了,转而使用prop-types库来进行替换

属性确认

属性确认的作用

使用 React Native 创建的组件是可以复用的,所以我们开发的组件可能会给项目组其他同事使用。但别人可能对这个组件不熟悉,常常会忘记使用某些属性,或者某些属性传递的数据类型有误。因此我们可以在开发 React Native 自定义组件时,可以通过属性确认来声明这个组件需要哪些属性。

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

prop-types 库使用

和其他的第三方库使用类似,prop-types的安装首先进入项目根目录,执行如下代码安装 prop-types 库:

npm install --save prop-types

然后在需要使用PropTypes属性的地方引入:

import PropTypes from 'prop-types';

例子

例如,我们写一个导航栏的例子,效果如下:

React Native之prop-types进行属性确认详解

import React, {
 Component
} from 'react'
import {
 StyleSheet,
 View,
 Animated,
 Image,
 TouchableOpacity,
 TouchableNativeFeedback,
 Platform
} from 'react-native'
import px2dp from '../utils/Utils'
import Icon from 'react-native-vector-icons/Ionicons'
import PropTypes from 'prop-types';

export default class NavBar extends Component{

 static propTypes = {
  title: PropTypes.string,
  leftIcon: PropTypes.string,
  rightIcon: PropTypes.string,
  leftPress: PropTypes.func,
  rightPress: PropTypes.func,
  style: PropTypes.object
 }
 static topbarHeight = (Platform.OS === 'ios' ? 64 : 44)
 renderBtn(pos){
  let render = (obj) => {
  const { name, onPress } = obj
  if(Platform.OS === 'android'){
   return (
   <TouchableNativeFeedback onPress={onPress} style={styles.btn}>
    <Icon name={name} size={px2dp(26)} color="#fff" />
   </TouchableNativeFeedback>
   )
  }else{
   return (
   <TouchableOpacity onPress={onPress} style={styles.btn}>
    <Icon name={name} size={px2dp(26)} color="#fff" />
   </TouchableOpacity>
   )
  }
  }
  if(pos == "left"){
  if(this.props.leftIcon){
   return render({
   name: this.props.leftIcon,
   onPress: this.props.leftPress
   })
  }else{
   // return (<ImageButton style={styles.btn} source={require('../images/ic_back_white.png')}/>)
   return (<View style={styles.btn}/>)
  }
  }else if(pos == "right"){
  if(this.props.rightIcon){
   return render({
   name: this.props.rightIcon,
   onPress: this.props.rightPress
   })
  }else{
   return (<View style={styles.btn}/>)
  }
  }
 }
 render(){
  return(
   <View style={[styles.topbar, this.props.style]}>
    {this.renderBtn("left")}
    <Animated.Text numberOfLines={1} style={[styles.title, this.props.titleStyle]}>{this.props.title}</Animated.Text>
    {this.renderBtn("right")}
   </View>
  )
 }
}
const styles = StyleSheet.create({
 topbar: {
  height: NavBar.topbarHeight,
  backgroundColor: "#06C1AE",
  flexDirection: 'row',
  justifyContent: 'space-between',
  alignItems: 'center',
  paddingTop: (Platform.OS === 'ios') ? 20 : 0,
  paddingHorizontal: px2dp(10)
 },
 btn: {
  width: 22,
  height: 22,
  justifyContent: 'center',
  alignItems: 'center'
 },
 title:{
  color: "#fff",
  fontWeight: "bold",
  fontSize: px2dp(16),
  marginLeft: px2dp(5),
 }
});

语法

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

将属性声明为必须

使用关键字 isRequired 声明它是必需的。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS、CSS加载中的小问题探讨
Nov 26 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
Sep 02 Javascript
javascript中clone对象详解
Dec 03 Javascript
javascript实现用户点击数量统计
Dec 25 Javascript
JavaScript运动框架 链式运动到完美运动(五)
May 18 Javascript
深入浅析JSONAPI在PHP中的应用
Dec 24 Javascript
微信小程序使用wxParse解析html的方法示例
Jan 17 Javascript
vue中nextTick用法实例
Sep 11 Javascript
javascript异常处理实现原理详解
Feb 17 Javascript
JQuery事件冒泡和默认行为代码实例
May 13 jQuery
微信小程序开发(二):页面跳转并传参操作示例
Jun 01 Javascript
前端使用crypto.js进行加密的函数代码
Aug 16 Javascript
响应式框架Bootstrap栅格系统的实例
Dec 19 #Javascript
vue.js element-ui validate中代码不执行问题解决方法
Dec 18 #Javascript
AngularJs点击状态值改变背景色的实例
Dec 18 #Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
Dec 18 #jQuery
JS实现点击复选框变更DIV显示状态的示例代码
Dec 18 #Javascript
Vue下的国际化处理方法
Dec 18 #Javascript
webpack多页面开发实践
Dec 18 #Javascript
You might like
使用 php4 加速 web 传输
2006/10/09 PHP
How do I change MySQL timezone?
2008/03/26 PHP
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
Vue如何获取数据列表展示
2019/12/11 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
python字符串编码识别模块chardet简单应用
2015/06/15 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
python django生成迁移文件的实例
2019/08/31 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
一个精品风格的世界:Atterley
2019/05/01 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
党校培训思想汇报
2014/01/03 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
大客户经理岗位职责
2015/04/09 职场文书
5道关于python基础 while循环练习题
2021/11/27 Python