在上一节中, 我们提到了props, 组件之间数据的传递使用props. 我们调用组件时可以设置props, 组件内部通过props获取. 为了props 使用更加友好, React 提供了简单的验证机制,就是我们可以标注我们的组件内部想要使用什么样的数据, 如果使用组件时传递过来的数据不符合要求, React就会抛出warnig, 有利于我们排错。

  看一下我们的content 组件, 它内部用到了四个属性, name, item, num, bool, 并且类型也不一致. 我们肯定希望传递过来参数和组件内的要求是一一对应的,从而避免组件报错。这时我们可以在组件内作出一定的要求, 就是写一些验证条件. React的验证也很简单,给组件提供一个propTypes属性,它是一个对象,键就是组件内的属性,值就是验证条件。对于Content 组件来说,name 是一个字符串,item 是一个数据,num 是一个数字,bool是一个布尔值,所以我们就可以这样写

Content.propTypes = {
  item: PropTypes.array,
  name: PropTypes.string,
  bool: PropTypes.bool,
  num: PropTypes.number
}

   这时用到了PropTypes库,array, string, bool, number 就是PropTypes 库提供的简单验证条件,只要我们写上number, React 就会帮我们验证它是不是number. 我们用script 引入PropTypes 库

<script src="https://unpkg.com/prop-types@15.6/prop-types.js"></script>

  有时有些属性非常重要,我们要求必传,这时要提供一个isRequired进行表示,比如item属性是必传的

Content.propTypes = {
  item: PropTypes.array.isRequired,
  name: PropTypes.string,
  bool: PropTypes.bool,
  num: PropTypes.number
}

  如果简单的验证不能满足我们的要求时,React 也提供了自定义验证。自定义验证,它是一个函数,有两个参数,props, 和propName,  它返回null 或 Erorr,  如果

通过验证,则返回null ,如果验证失败, 则返回一个错误。 props 和propName, 是React 自动注入的,我们不用管。我们对name提供一个自定义验证。

Content.propTypes = {
  item: PropTypes.array.isRequired,
  bool: PropTypes.bool,
  num: PropTypes.number,
  name: (props, propName) => {  // 自定义验证
    console.log(props, propName);
    if (typeof props[propName] !== 'string') {
      return new Error('必须传递一个字符串');
    } else if (props[propName].length >= 5) {
      return new Error('字符串长度必须小于5')
    } else {
      return null;
    }
  }
}

  我打印了一下两个参数props 和propName, 可以看到props 就是我们整个组件接受到的所有属性,propName 就是当前验证的属性name.  这里的验证规则就是字符串小于5.

  除了props验证之外,React 还提供了默认属性defaultProps, 给我们组件内部的属性提供默认值。它的语法与验证一样,也是一个对象,不过它的值是默认值,而不验证规则。

Content.defaultProps = {
  name: 'sam'
}

  以上props验证和defaulProps 语法,对类式组件和函数式组件都适用。对于函数式组件来说,defaultProps 还有一种更简单的方式,用ES6 的解构赋值。

const Content = ({item=[], name='', bool=false, num = 0}) => {
  return
      (<section>
          <ul>
            {
              this.props.item.map((item, index) =>
                <li key={index}>{item}</li>
              )
            }
          </ul>
          <p>name 的值是{this.props.name},类型是 {typeof this.props.name}</p>
          <p>bool 的值是{this.props.bool},类型是 {typeof this.props.bool}</p>
          <p>num 的值是{this.props.num},类型是 {typeof this.props.num}</p>
        </section>
      )
}

React 学习(二) ---- props验证与默认属性的更多相关文章

  1. 【React系列】Props 验证

    Props 验证使用 propTypes,它可以保证我们的应用组件被正确使用,React.PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效.当向 props 传入无效 ...

  2. react学习二 生命周期

    转自:https://www.cnblogs.com/gdsblog/p/7348375.html react 中compent getDefaultProps object getDefaultPr ...

  3. react学习之props

    中秋过后刚好结束在上一家公司的工作,明天开始要正式的找工作了,最近也投了几家公司收到几分面试邀请.在面试的过程中几个面试官聊到了react(当然也有聊了vue,angular).感觉不懂react都不 ...

  4. react学习(二)之通信篇

    react性能提升原理:虚拟DOM react把真是的DOM tree,转化成virtual DOM,每次数据更新后,重新计算virtual DOM并与上一次的作对比,然后对发生改变的部分进行批量更新 ...

  5. React 学习二 组件

    React的一个最大的特点就是组件化的开发模式.今天就来试一下: <!DOCTYPE html> <html> <head> <meta charset=&q ...

  6. nginx学习(二):nginx显示默认首页解析过程

    本篇文章分析下nginx 显示默认首页的过程 如下图所示 查看config文件: # 如果忘记nginx 安装目录.使用下面命令查看 [root@XXX]# whereis nginx nginx: ...

  7. 【react学习二】create-react-app 接入antd 并按需加载组件

    1.安装 cnpm i babel-plugin-import --save-dev 2.使用 在根目录下的package.json下的bable中添加相应代码 "babel": ...

  8. Linux day01(一) 创建Linux虚拟机,设置虚拟机默认属性,虚拟机和Xhell建立连接

    一:创建Linux虚拟机步骤: 1. 二:设置虚拟机默认属性 三:虚拟机和Xhell建立连接

  9. React Native组件、生命周期及属性传值props详解

    创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...

随机推荐

  1. selenium:断言

    在编写自动化测试脚本时,为了使“机器”去自动辨识test case的执行结果是True还是False,一般都需要在用例执行过程中获取一些信息,来判断用例的执行时成功还是失败. 判断成功失败与否,就涉及 ...

  2. Pyhton2.x 和Python3.x

    一. 异常处理和pint区别 try: ...except Exception,e: # 2.x,3.x 需要把逗号(,)变为as. print e.message # 2.x,3.需要吧print内 ...

  3. 开发手记:JedisConnectionException: Could not get a resource from the pool

    对于Redis,生产环境是集群模式,测试环境是单例模式,如果在生产环境中用单例模式会报错. 解决办法,通过云配置,将配置进行自动化配置. 另附一份Redis配置: #***************** ...

  4. 在Winform开发中使用FastReport创建报表

    FastReport.Net是一款适用于Windows Forms, ASP.NET和MVC框架的功能齐全的报表分析解决方案.可用在Microsoft Visual Studio 2005到2015, ...

  5. Git超实用总结,再也不怕记忆力不好了

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯工蜂发表于云+社区专栏 Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是 ...

  6. 52ABP模板 ASP.Net Core 与 Angular的开源实例项目

    阅读文本大概需要 5 分钟. 开始之前 自从上一篇文章".NET:持续进化的统一开发平台"发布后,已经有三个月的时间没有写过文章了. 这段时间,做了两场线下活动,一场在上海,一场在 ...

  7. ORM简介 单表添加修改删除表记录

    ---------------------------------------------------------------目标既定,在学习和实践过程中无论遇到什么困难.曲折都不灰心丧气,不轻易改变 ...

  8. Mysql:is not allowed to connect to this MySQL server

    连接mysql的时候发生这个错误:ERROR 1130: Host '192.168.1.110' is not allowed to connect to this MySQL server 解决方 ...

  9. Win10系统如何安装Linux Mint

    导读 随着windows10系统免费升级期限的靠近,越来越多朋友都将自己的电脑系统升级到了win10正式版.今天,小编就要在这里为大家分享Windows10系统安装Linux Mint的方法,希望能够 ...

  10. pip3 升级失败的解决方法!亲测有效

    pip3 --default-timeout=10000 install -U pip 注意:由于防火长城的存在,会导致更新失败,如果你加上--default-timeout=10000  这个就ok ...