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 相关文章推荐
用于自动添加Digg This!按钮的JavaScript
Dec 23 Javascript
javascript 使用 NodeList需要注意的问题
Mar 04 Javascript
JavaScript中的函数声明和函数表达式区别浅析
Mar 27 Javascript
JQuery实现图片轮播效果
Sep 15 Javascript
Bootstrap实现响应式导航栏效果
Dec 28 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
May 10 Javascript
JS实现上传图片实时预览功能
May 22 Javascript
jQuery中each方法的使用详解
Mar 18 jQuery
深入理解Vue nextTick 机制
Apr 28 Javascript
详解如何理解vue的key属性
Apr 14 Javascript
vue cli安装使用less的教程详解
Jul 12 Javascript
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
响应式框架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
php中如何同时使用session和cookie来保存用户登录信息
2013/07/05 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
php与js的区别是什么
2013/08/05 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
vue打包后显示空白正确处理方法
2017/11/01 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
python定向爬取淘宝商品价格
2018/02/27 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
Django websocket原理及功能实现代码
2020/11/14 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
哈理工毕业生的求职信
2013/12/22 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
环卫工作汇报材料
2014/10/28 职场文书
班级联欢会主持词
2015/07/03 职场文书