• React库protypes属性


    Prop 验证

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

     1 React.createClass({
     2   propTypes: {
     3     // 可以声明 prop 为指定的 JS 基本类型。默认
     4     // 情况下,这些 prop 都是可传可不传的。
     5     optionalArray: React.PropTypes.array,
     6     optionalBool: React.PropTypes.bool,
     7     optionalFunc: React.PropTypes.func,
     8     optionalNumber: React.PropTypes.number,
     9     optionalObject: React.PropTypes.object,
    10     optionalString: React.PropTypes.string,
    11 
    12     // 所有可以被渲染的对象:数字,
    13     // 字符串,DOM 元素或包含这些类型的数组。
    14     optionalNode: React.PropTypes.node,
    15 
    16     // React 元素
    17     optionalElement: React.PropTypes.element,
    18 
    19     // 用 JS 的 instanceof 操作符声明 prop 为类的实例。
    20     optionalMessage: React.PropTypes.instanceOf(Message),
    21 
    22     // 用 enum 来限制 prop 只接受指定的值。
    23     optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
    24 
    25     // 指定的多个对象类型中的一个
    26     optionalUnion: React.PropTypes.oneOfType([
    27       React.PropTypes.string,
    28       React.PropTypes.number,
    29       React.PropTypes.instanceOf(Message)
    30     ]),
    31 
    32     // 指定类型组成的数组
    33     optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
    34 
    35     // 指定类型的属性构成的对象
    36     optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
    37 
    38     // 特定形状参数的对象
    39     optionalObjectWithShape: React.PropTypes.shape({
    40       color: React.PropTypes.string,
    41       fontSize: React.PropTypes.number
    42     }),
    43 
    44     // 以后任意类型加上 `isRequired` 来使 prop 不可空。
    45     requiredFunc: React.PropTypes.func.isRequired,
    46 
    47     // 不可空的任意类型
    48     requiredAny: React.PropTypes.any.isRequired,
    49 
    50     // 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接
    51     // 使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。
    52     customProp: function(props, propName, componentName) {
    53       if (!/matchme/.test(props[propName])) {
    54         return new Error('Validation failed!');
    55       }
    56     }
    57   },
    58   /* ... */
    59 });
    View Code

    默认 Prop 值

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

    1 ar ComponentWithDefaultProps = React.createClass({
    2   getDefaultProps: function() {
    3     return {
    4       value: 'default value'
    5     };
    6   }
    7   /* ... */
    8 });
    View Code

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

    传递 Props:小技巧

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

     1 var CheckLink = React.createClass({
     2   render: function() {
     3     // 这样会把 CheckList 所有的 props 复制到 <a>
     4     return <a {...this.props}>{'√ '}{this.props.children}</a>;
     5   }
     6 });
     7 
     8 React.render(
     9   <CheckLink href="/checked.html">
    10     Click here!
    11   </CheckLink>,
    12   document.getElementById('example')
    13 );
    View Code

    单个子级

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

     1 var MyComponent = React.createClass({
     2   propTypes: {
     3     children: React.PropTypes.element.isRequired
     4   },
     5 
     6   render: function() {
     7     return (
     8       <div>
     9         {this.props.children} // 有且仅有一个元素,否则会抛异常。
    10       </div>
    11     );
    12   }
    13 
    14 });
    View Code

    Mixins

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

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

     1 var SetIntervalMixin = {
     2   componentWillMount: function() {
     3     this.intervals = [];
     4   },
     5   setInterval: function() {
     6     this.intervals.push(setInterval.apply(null, arguments));
     7   },
     8   componentWillUnmount: function() {
     9     this.intervals.map(clearInterval);
    10   }
    11 };
    12 
    13 var TickTock = React.createClass({
    14   mixins: [SetIntervalMixin], // 引用 mixin
    15   getInitialState: function() {
    16     return {seconds: 0};
    17   },
    18   componentDidMount: function() {
    19     this.setInterval(this.tick, 1000); // 调用 mixin 的方法
    20   },
    21   tick: function() {
    22     this.setState({seconds: this.state.seconds + 1});
    23   },
    24   render: function() {
    25     return (
    26       <p>
    27         React has been running for {this.state.seconds} seconds.
    28       </p>
    29     );
    30   }
    31 });
    32 
    33 React.render(
    34   <TickTock />,
    35   document.getElementById('example')
    36 );
    View Code

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

  • 相关阅读:
    【oracle】查看表空间对应文件所在位置
    【oracle】查看表空间信息
    【java异常】java.lang.Integer cannot be cast to java.lang.String
    【oracle】DATE输出是什么东西
    数字万用表的精度和分辨率,ADC的位数
    二阶系统
    Verilog中实现电平检测
    模拟信号和数字信号,直流信号和交流信号
    噪声:强度,方差信噪比(待完善)
    Simulink模块之Band-Limited White Noise
  • 原文地址:https://www.cnblogs.com/ZSG-DoBestMe/p/5278868.html
Copyright © 2020-2023  润新知