zoukankan      html  css  js  c++  java
  • 【React系列】Props 验证

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

    常见的验证器:

    
        React.createClass({
          propTypes: {
            // 可以声明 prop 为指定的 JS 基本数据类型,默认情况,这些数据是可选的
            optionalArray: React.PropTypes.array,
            optionalBool: React.PropTypes.bool,
            optionalFunc: React.PropTypes.func,
            optionalNumber: React.PropTypes.number,
            optionalObject: React.PropTypes.object,
            optionalString: React.PropTypes.string,
         
            // 可以被渲染的对象 numbers, strings, elements 或 array
            optionalNode: React.PropTypes.node,
         
            //  React 元素
            optionalElement: React.PropTypes.element,
         
            // 用 JS 的 instanceof 操作符声明 prop 为类的实例。
            optionalMessage: React.PropTypes.instanceOf(Message),
         
            // 用 enum 来限制 prop 只接受指定的值。
            optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
         
            // 可以是多个对象类型中的一个
            optionalUnion: React.PropTypes.oneOfType([
              React.PropTypes.string,
              React.PropTypes.number,
              React.PropTypes.instanceOf(Message)
            ]),
         
            // 指定类型组成的数组
            optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
         
            // 指定类型的属性构成的对象
            optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
         
            // 特定 shape 参数的对象
            optionalObjectWithShape: React.PropTypes.shape({
              color: React.PropTypes.string,
              fontSize: React.PropTypes.number
            }),
         
            // 任意类型加上 `isRequired` 来使 prop 不可空。
            requiredFunc: React.PropTypes.func.isRequired,
         
            // 不可空的任意类型
            requiredAny: React.PropTypes.any.isRequired,
         
            // 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接使用 `console.warn` 或抛异常,
            // 因为这样 `oneOfType` 会失效。
            customProp: function(props, propName, componentName) {
              if (!/matchme/.test(props[propName])) {
                return new Error('Validation failed!');
              }
            }
          }
        });
    
    注意: React.PropTypes 自 React v15.5 起已弃用。请使用 prop-types 库代替。
    
    import PropTypes from 'prop-types';
    
    MyComponent.propTypes = {
      // 你可以将属性声明为以下 JS 原生类型
      optionalArray: PropTypes.array,
      optionalBool: PropTypes.bool,
      optionalFunc: PropTypes.func,
      optionalNumber: PropTypes.number,
      optionalObject: PropTypes.object,
      optionalString: PropTypes.string,
      optionalSymbol: PropTypes.symbol,
    
      // 任何可被渲染的元素(包括数字、字符串、子元素或数组)。
      optionalNode: PropTypes.node,
    
      // 一个 React 元素
      optionalElement: PropTypes.element,
    
      // 你也可以声明属性为某个类的实例,这里使用 JS 的
      // instanceof 操作符实现。
      optionalMessage: PropTypes.instanceOf(Message),
    
      // 你也可以限制你的属性值是某个特定值之一
      optionalEnum: PropTypes.oneOf(['News', 'Photos']),
    
      // 限制它为列举类型之一的对象
      optionalUnion: PropTypes.oneOfType([
        PropTypes.string,
        PropTypes.number,
        PropTypes.instanceOf(Message)
      ]),
    
      // 一个指定元素类型的数组
      optionalArrayOf: PropTypes.arrayOf(PropTypes.number),
    
      // 一个指定类型的对象
      optionalObjectOf: PropTypes.objectOf(PropTypes.number),
    
      // 一个指定属性及其类型的对象
      optionalObjectWithShape: PropTypes.shape({
        color: PropTypes.string,
        fontSize: PropTypes.number
      }),
    
      // 你也可以在任何 PropTypes 属性后面加上 `isRequired` 
      // 后缀,这样如果这个属性父组件没有提供时,会打印警告信息
      requiredFunc: PropTypes.func.isRequired,
    
      // 任意类型的数据
      requiredAny: PropTypes.any.isRequired,
    
      // 你也可以指定一个自定义验证器。它应该在验证失败时返回
      // 一个 Error 对象而不是 `console.warn` 或抛出异常。
      // 不过在 `oneOfType` 中它不起作用。
      customProp: function(props, propName, componentName) {
        if (!/matchme/.test(props[propName])) {
          return new Error(
            'Invalid prop `' + propName + '` supplied to' +
            ' `' + componentName + '`. Validation failed.'
          );
        }
      },
    
      // 不过你可以提供一个自定义的 `arrayOf` 或 `objectOf` 
      // 验证器,它应该在验证失败时返回一个 Error 对象。 它被用
      // 于验证数组或对象的每个值。验证器前两个参数的第一个是数组
      // 或对象本身,第二个是它们对应的键。
      customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
        if (!/matchme/.test(propValue[key])) {
          return new Error(
            'Invalid prop `' + propFullName + '` supplied to' +
            ' `' + componentName + '`. Validation failed.'
          );
        }
      })
    };
    

    来源:https://segmentfault.com/a/1190000010921839

  • 相关阅读:
    HDU 2112 HDU Today,最短路径算法,Dijkstra
    最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)
    图基本算法 最小生成树 Prim算法(邻接表/邻接矩阵+优先队列STL)
    合并相同值得单元格(纵向)
    request.startAsync()不支持异步操作
    DIV强制不换行
    兼容各浏览器的css背景图片拉伸代码
    程序猿之八荣八耻
    使用JEECG过程中的问题汇总(持续更新)
    Firefox的缓存问题
  • 原文地址:https://www.cnblogs.com/qixidi/p/10160755.html
Copyright © 2011-2022 走看看