`

React组件属性类型(propTypes)校验

阅读更多

Prop 验证

随着应用不断变大,保证组件被正确使用变得非常有用。为此我们引入propTypesReact.PropTypes 提供很多验证器 (validator) 来验证传入数据的有效性。当向 props 传入无效数据时,JavaScript 控制台会抛出警告。注意为了性能考虑,只在开发环境验证 propTypes。下面用例子来说明不同验证器的区别:

React.createClass({
  propTypes: {
    // 可以声明 prop 为指定的 JS 基本类型。默认
    // 情况下,这些 prop 都是可传可不传的。
    optionalArray: React.PropTypes.array,
    optionalBool: React.PropTypes.bool,
    optionalFunc: React.PropTypes.func,
    optionalNumber: React.PropTypes.number,
    optionalObject: React.PropTypes.object,
    optionalString: React.PropTypes.string,

    // 所有可以被渲染的对象:数字,
    // 字符串,DOM 元素或包含这些类型的数组。
    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),

    // 特定形状参数的对象
    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!');
      }
    }
  },
  /* ... */
});

默认 Prop 值

React 支持以声明式的方式来定义 props 的默认值。

var ComponentWithDefaultProps = React.createClass({
  getDefaultProps: function() {
    return {
      value: 'default value'
    };
  }
  /* ... */
});

当父级没有传入 props 时,getDefaultProps() 可以保证 this.props.value 有默认值,注意 getDefaultProps 的结果会被 缓存。得益于此,你可以直接使用 props,而不必写手动编写一些重复或无意义的代码。

传递 Props:小技巧

有一些常用的 React 组件只是对 HTML 做简单扩展。通常,你想少写点代码来把传入组件的 props 复制到对应的 HTML 元素上。这时 JSX 的 spread 语法会帮到你:

var CheckLink = React.createClass({
  render: function() {
    // 这样会把 CheckList 所有的 props 复制到 <a>
    return <a {...this.props}>{'√ '}{this.props.children}</a>;
  }
});

React.render(
  <CheckLink href="/checked.html">
    Click here!
  </CheckLink>,
  document.getElementById('example')
);

单个子级

React.PropTypes.element 可以限定只能有一个子级传入。

var MyComponent = React.createClass({
  propTypes: {
    children: React.PropTypes.element.isRequired
  },

  render: function() {
    return (
      <div>
        {this.props.children} // 有且仅有一个元素,否则会抛异常。
      </div>
    );
  }

});

Mixins

组件是 React 里复用代码最佳方式,但是有时一些复杂的组件间也需要共用一些功能。有时会被称为 跨切面关注点。React 使用 mixins 来解决这类问题。

一个通用的场景是:一个组件需要定期更新。用 setInterval() 做很容易,但当不需要它的时候取消定时器来节省内存是非常重要的。React 提供 生命周期方法 来告知组件创建或销毁的时间。下面来做一个简单的 mixin,使用 setInterval() 并保证在组件销毁时清理定时器。

var SetIntervalMixin = {
  componentWillMount: function() {
    this.intervals = [];
  },
  setInterval: function() {
    this.intervals.push(setInterval.apply(null, arguments));
  },
  componentWillUnmount: function() {
    this.intervals.map(clearInterval);
  }
};

var TickTock = React.createClass({
  mixins: [SetIntervalMixin], // 引用 mixin
  getInitialState: function() {
    return {seconds: 0};
  },
  componentDidMount: function() {
    this.setInterval(this.tick, 1000); // 调用 mixin 的方法
  },
  tick: function() {
    this.setState({seconds: this.state.seconds + 1});
  },
  render: function() {
    return (
      <p>
        React has been running for {this.state.seconds} seconds.
      </p>
    );
  }
});

React.render(
  <TickTock />,
  document.getElementById('example')
);

关于 mixin 值得一提的优点是,如果一个组件使用了多个 mixin,并且有多个 mixin 定义了同样的生命周期方法(如:多个 mixin 都需要在组件销毁时做资源清理操作),所有这些生命周期方法都保证会被执行到。方法执行顺序是:首先按 mixin 引入顺序执行 mixin 里方法,最后执行组件内定义的方法。

分享到:
评论

相关推荐

    react-element-proptypes:React组件的PropTypes

    React元素属性 对props-elements的PropTypes进行React 安装 npm install --save react-element-proptypes 用法 const ElementPropTypes = require ( 'react-element-proptypes' ) ; const Modal = ( { header , ...

    react-desc:根据React PropTypes向您的React组件添加一个模式

    import ReactPropTypes from 'prop-types' ; import { describe , PropTypes } from 'react-desc' ; const Anchor = ( props ) =&gt; { const { path , ... rest } = props ; return ( &lt; a xss=removed&gt; { props . ...

    react-SVGR将SVG转换为React组件

    此外,`react-SVGR`还支持转换后的组件使用TypeScript类型定义,这对于有强类型需求的项目非常有用。 在项目实际应用中,`react-SVGR`的组件可以像其他React组件一样导入和使用: ```jsx import MyIcon from './my...

    react-svgtocomponent将SVG转成ReactVue组件

    这是一个用于将SVG文件转换为React组件的工具,它能够自动处理SVG的属性,将其转化为React组件的props,使得在项目中使用SVG如同使用普通组件一样方便。 使用步骤通常包括以下几点: 1. **安装**:在你的项目中,...

    react-googlemapreact通用google地图react组件能够在谷歌地图上渲染react组件

    这意味着开发者可以像处理其他React组件一样,通过props来设置地图的各种属性,如中心点坐标、缩放级别、地图类型等。例如,可以通过`center` prop设定地图的初始位置,通过`zoom` prop设置初始缩放级别。 其次,这...

    react PropTypes校验传递的值操作示例

    React PropTypes 是一个用于在开发时检查组件属性类型(props)的库,它可以帮助我们确保组件接收到正确的输入数据,从而提高代码的健壮性和可维护性。在本示例中,我们将深入探讨如何使用React PropTypes来校验传递...

    ReactV 15.5.0 从入门到精通第四章 React组件属性和状态

    ReactV 15.5.0 从入门到精通第四章 React组件属性和状态实战

    react-moment-proptypes:Reactmoment.js的proptype验证器

    React时刻属性 一个React Proptype Validator来检查传递的prop是否是moment.js构造 例子 var momentPropTypes = require ( 'react-moment-proptypes' ) ; var TestClass = React . createClass ( { propTypes : { ...

    react-CompositorKit用于开发文档化和测试React组件库的工具

    React-CompositorKit在这一方面提供了帮助,它可以自动化生成组件的API文档,展示组件的属性、用法示例以及API接口等。 现在,我们来看看CompositorKit如何帮助优化这些开发过程: 1. **组件工作流**:...

    react-react组件用于各种圆形方形进度条环形图饼状图等

    "react-super-progress"是一个专门为React设计的库,它提供了一组易于使用的组件,用于创建各种类型的进度条和图表。这个库的名称"react-super-progress-master"暗示了它是项目的主要分支,可能包含了库的完整源代码...

    react组件 课程ppt

    react组件的ppt,格式为key,组件的概念,定义,创建方法

    react 组件 规范

    - 使用propTypes进行组件属性校验,确保传入的属性符合预期的类型和结构,而且不要在组件外部直接修改属性的值。 4. **ref的使用**: - 应避免使用字符串形式的ref,因为它们可能导致内存泄露。而应该使用函数...

    react-vuetoreactVue组件转React组件

    - **处理指令和属性**:Vue的特殊指令(如`v-bind`,`v-model`)需要替换为React的属性。例如,`v-bind:class`可以转换为`className`,`v-model`转换为`onChange`事件处理。 - **状态管理**:Vue的`data`、`...

    11 React propTypes defaultProps

    在React开发中,propTypes和defaultProps是两个非常重要的概念,它们帮助我们确保组件的属性(props)具有正确的类型和默认值。接下来,我们将详细探讨这两个特性。 **propTypes** propTypes是React组件的一个静态...

    react-immutable-proptypes:与Immutable.js一起使用的PropType验证器

    React不可变属性 与Immutable.js一起使用的PropType验证器。关于我厌倦了看到的React.PropTypes.instanceOf(Immutable.List)或React.PropTypes.instanceOf(Immutable.Map)作为PropTypes为应指定部件Immutable.List的...

    react-reactlightbarcode条形码react组件支持多种类型按需引

    `react-light-barcode`是一个专门为React设计的轻量级条形码组件,它允许开发者根据需求选择性地引入不同类型的条形码,从而避免了引入庞大库的困扰。 `react-light-barcode`组件的核心特性体现在以下几个方面: 1...

    React组件的生命周期

    React组件的生命周期

    react-proptable:React组件PropTypes文档

    1. **定义组件属性**:通过在组件类上设置propTypes属性,指定每个属性的数据类型、默认值和其他详细信息。 2. **生成文档**:react-proptable读取这些定义,生成一份详细的文档,包括属性名、类型、是否必需、...

    react-reactleafletLeaflet地图的React组件

    它将Leaflet的地图对象封装为React组件,使得在React应用中添加、更新和管理地图如同操作其他React组件一样简单。这大大简化了地图应用的开发流程,因为开发者可以利用React的状态管理和生命周期方法来控制地图的...

Global site tag (gtag.js) - Google Analytics