浅谈React的类型检测-PropTypes

随着应用的日益变大,保证组件的正确使用显得日益重要,为此引入React.propTypes:react.PropTypes 提供很多验证器来验证传入数据的有效性,当向props传入无效数据时,JavaScript 控制台会抛出警告。

注意为了性能考虑,只在开发环境验证 propTypes。

一、声明props为指定的js基本类型,可传可不传。

1、React.PropTypes.array

正确示范:

var MyBox = React.createClass({    
    propTypes: {    
        name: React.PropTypes.array.isRequired    
    },    
    render: function() {    
        return (    
            
{this.props.name}
); } }); ReactDOM.render( , document.getElementById('timeBox') );
2、React.PropTypes.bool

正确示范:

var MyBox = React.createClass({    
    propTypes: {    
        student: React.PropTypes.bool.isRequired    
    },    
    render: function() {  
        return (    
            
{this.props.student ? "Hello, react!" : "Sorry!"}
); } }); ReactDOM.render( , document.getElementById('timeBox') );

注意:

{this.props.student}
渲染不出包含true的div???

3、React.PropTypes.func

正确示范:

var MyBox = React.createClass({    
    propTypes: {    
        sayHello: React.PropTypes.func.isRequired    
    },    
    render: function() {  
        this.props.sayHello();  
        return (    
            
Hello, react!
); } }); ReactDOM.render( , document.getElementById('timeBox') );
4、React.PropTypes.number

正确示范:

var MyBox = React.createClass({    
    propTypes: {    
        age: React.PropTypes.number.isRequired    
    },    
    render: function() {  
        return (    
            
{this.props.age}
); } }); ReactDOM.render( , document.getElementById('timeBox') );
5、React.PropTypes.object

正确示范:

var MyBox = React.createClass({    
    propTypes: {    
        family: React.PropTypes.object.isRequired    
    },    
    render: function() {  
        return (    
            
{this.props.family.mother} & {this.props.family.father}
); } }); ReactDOM.render( , document.getElementById('timeBox') );
6、React.PropTypes.string

正确示范:

var MyBox = React.createClass({    
    propTypes: {    
        name: React.PropTypes.string.isRequired    
    },    
    render: function() {  
        return (    
            
{this.props.name}
); } }); ReactDOM.render( , document.getElementById('timeBox') );
7、React.PropTypes.symbol
var MyBox = React.createClass({      
    propTypes: {      
        name: React.PropTypes.symbol.isRequired      
    },      
    render: function() {  
        var obj = {  
            [this.props.name]: "Alice"  
        }  
        return (      
            
{obj[this.props.name]}
); } }); ReactDOM.render( , document.getElementById('timeBox') );

二、声明props为数字、字符串、DOM 元素或包含这些类型的数组或fragment。

React.PropTypes.node

正确示范:

var MyBox = React.createClass({    
    propTypes: {    
        children: React.PropTypes.node.isRequired    
    },    
    render: function() {  
        return (    
            
{this.props.children}
); } }); ReactDOM.render( [Hello, react!, 30, "Alice"] , document.getElementById('timeBox') );

错误示范:

var MyBox = React.createClass({    
    propTypes: {    
        children: React.PropTypes.node.isRequired    
    },    
    render: function() {  
        return (    
            
{this.props.children}
); } }); ReactDOM.render( {true} , document.getElementById('timeBox') );

三、声明props为React元素(原生HTML元素或React类)

React.PropTypes.element

正确示范:

var MyBox = React.createClass({    
    propTypes: {    
        children: React.PropTypes.element.isRequired    
    },    
    render: function() {  
        return (    
            
{this.props.children}
); } }); var Children = React.createClass({ render: function() { return ( Hello ); } }); ReactDOM.render(
React
, document.getElementById('timeBox') );

错误示范:

var MyBox = React.createClass({    
    propTypes: {    
        children: React.PropTypes.element.isRequired    
    },    
    render: function() {  
        return (    
            
{this.props.children}
); } }); var Children = React.createClass({ render: function() { return ( Hello ); } }); ReactDOM.render( React , document.getElementById('timeBox') );

四、声明props为某个指定的类

React.PropTypes.instanceOf(MyBox)

var MyBox = React.createClass({      
    propTypes: {      
        children: React.PropTypes.instanceOf(Array)     
    },      
    render: function() {  
        return (      
            
{this.props.children}
); } }); ReactDOM.render( {[1, 2, 3]} , document.getElementById('timeBox') );

注意:指定的类不能是自定义的React类

五、声明props为某些指定值中的一个(用enum的方式)

React.PropTypes.oneOf(['Alice', 'Bruce'])

错误示范:

var MyBox = React.createClass({    
    propTypes: {    
        name: React.PropTypes.oneOf(['Alice', 'Bruce'])    
    },    
    render: function() {  
        return (    
            
{this.props.name}
); } }); ReactDOM.render( , document.getElementById('timeBox') );

六、声明props为某些类型中的一个

React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.number, ...])

错误示范:

var MyBox = React.createClass({    
    propTypes: {    
        prop: React.PropTypes.oneOfType([  
            React.PropTypes.string,  
            React.PropTypes.number  
        ])   
    },    
    render: function() {  
        return (    
            
{this.props.prop}
); } }); ReactDOM.render( , document.getElementById('timeBox') );

七、声明props为指定类型组成的数组

React.PropTypes.arrayOf(React.PropTypes.number)

错误示范:

var MyBox = React.createClass({    
    propTypes: {    
        prop: React.PropTypes.arrayOf(React.PropTypes.number)  
    },  
    render: function() {  
        return (    
            
{this.props.prop}
); } }); ReactDOM.render( , document.getElementById('timeBox') );

八、声明props为指定类型的属性构成的对象

React.PropTypes.objectOf(React.PropTypes.number)

错误示范:

var MyBox = React.createClass({    
    propTypes: {    
        family: React.PropTypes.objectOf(React.PropTypes.string)    
    },    
    render: function() {  
        return (    
            
{this.props.family.mother} & {this.props.family.father}
); } }); ReactDOM.render( , document.getElementById('timeBox') );

九、声明props为特定形状参数的对象

React.PropTypes.shape({
color: React.PropTypes.string,
fontSize: React.PropTypes.number
})

十、声明props为必须的某类型

React.PropTypes.*.isRequired

错误示范:

var MyBox = React.createClass({    
    propTypes: {    
        name: React.PropTypes.string.isRequired    
    },    
    render: function() {  
        return (    
            
Hello, react!
); } }); ReactDOM.render( , document.getElementById('timeBox') );

十一、声明props为必须的任意类型

React.PropTypes.any.isRequired

错误示范:

var MyBox = React.createClass({    
    propTypes: {    
        name: React.PropTypes.any.isRequired    
    },    
    render: function() {  
        return (    
            
Hello, react!
); } }); ReactDOM.render( , document.getElementById('timeBox') );

参考:http://blog.csdn.net/zhouziyu2011/article/details/70842310

你可能感兴趣的:(浅谈React的类型检测-PropTypes)