浅谈React的类型检测——PropTypes

来源:互联网 发布:开源软件许可翻译 编辑:程序博客网 时间:2024/05/10 10:47

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

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


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

1) React.PropTypes.array

正确示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         name: React.PropTypes.array.isRequired    
  4.     },    
  5.     render: function() {    
  6.         return (    
  7.             <div>{this.props.name}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox name={["Alice", 30, true]} />,    
  13.     document.getElementById('timeBox')    
  14. );   

2) React.PropTypes.bool

正确示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         student: React.PropTypes.bool.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.student ? "Hello, react!" : "Sorry!"}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox student={true}  />,    
  13.     document.getElementById('timeBox')    
  14. );  

注意:<div>{this.props.student}</div> 渲染不出包含true的div???

3) React.PropTypes.func

正确示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         sayHello: React.PropTypes.func.isRequired    
  4.     },    
  5.     render: function() {  
  6.         this.props.sayHello();  
  7.         return (    
  8.             <div>Hello, react!</div>    
  9.         );    
  10.     }    
  11. });    
  12. ReactDOM.render(    
  13.     <MyBox sayHello={function sayHello() {console.log("Hello, react!");}}  />,    
  14.     document.getElementById('timeBox')    
  15. );   

4) React.PropTypes.number

正确示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         age: React.PropTypes.number.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.age}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox age={23}  />,    
  13.     document.getElementById('timeBox')    
  14. );   

5) React.PropTypes.object

正确示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         family: React.PropTypes.object.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.family.mother} & {this.props.family.father}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox family={{mother: "Alice", father: "Bruce"}} />,    
  13.     document.getElementById('timeBox')    
  14. );   

6) React.PropTypes.string

正确示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         name: React.PropTypes.string.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.name}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox name="Alice" />,    
  13.     document.getElementById('timeBox')    
  14. );   

7) React.PropTypes.symbol

[javascript] view plain copy
  1. var MyBox = React.createClass({      
  2.     propTypes: {      
  3.         name: React.PropTypes.symbol.isRequired      
  4.     },      
  5.     render: function() {  
  6.         var obj = {  
  7.             [this.props.name]: "Alice"  
  8.         }  
  9.         return (      
  10.             <div>{obj[this.props.name]}</div>      
  11.         );      
  12.     }      
  13. });      
  14. ReactDOM.render(      
  15.     <MyBox name={Symbol()} />,      
  16.     document.getElementById('timeBox')      
  17. );   


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

React.PropTypes.node

正确示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         children: React.PropTypes.node.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.children}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox>  
  13.         [<span>Hello, react!</span>, 30, "Alice"]  
  14.     </MyBox>,    
  15.     document.getElementById('timeBox')    
  16. );   

错误示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         children: React.PropTypes.node.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.children}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox>  
  13.         {true}  
  14.     </MyBox>,    
  15.     document.getElementById('timeBox')    
  16. );   


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

React.PropTypes.element

正确示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         children: React.PropTypes.element.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.children}</div>    
  8.         );    
  9.     }    
  10. });    
  11. var Children = React.createClass({    
  12.     render: function() {  
  13.         return (    
  14.             <span>Hello</span>    
  15.         );    
  16.     }    
  17. });    
  18. ReactDOM.render(    
  19.     <MyBox>  
  20.         <div>  
  21.             <Children />  
  22.             <span> React</span>  
  23.         </div>  
  24.     </MyBox>,    
  25.     document.getElementById('timeBox')    
  26. );   
错误示范:
[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         children: React.PropTypes.element.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.children}</div>    
  8.         );    
  9.     }    
  10. });    
  11. var Children = React.createClass({    
  12.     render: function() {  
  13.         return (    
  14.             <span>Hello</span>    
  15.         );    
  16.     }    
  17. });    
  18. ReactDOM.render(    
  19.     <MyBox>  
  20.         <Children />  
  21.         <span> React</span>  
  22.     </MyBox>,    
  23.     document.getElementById('timeBox')    
  24. );   


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

React.PropTypes.instanceOf(MyBox)

[javascript] view plain copy
  1. var MyBox = React.createClass({      
  2.     propTypes: {      
  3.         children: React.PropTypes.instanceOf(Array)     
  4.     },      
  5.     render: function() {  
  6.         return (      
  7.             <div>{this.props.children}</div>      
  8.         );      
  9.     }      
  10. });        
  11. ReactDOM.render(      
  12.     <MyBox>  
  13.         {[1, 2, 3]}  
  14.     </MyBox>,      
  15.     document.getElementById('timeBox')      
  16. );   
注意:指定的类不能是自定义的React类


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

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

错误示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         name: React.PropTypes.oneOf(['Alice''Bruce'])    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.name}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox name="Cindy" />,    
  13.     document.getElementById('timeBox')    
  14. );  


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

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

错误示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         prop: React.PropTypes.oneOfType([  
  4.             React.PropTypes.string,  
  5.             React.PropTypes.number  
  6.         ])   
  7.     },    
  8.     render: function() {  
  9.         return (    
  10.             <div>{this.props.prop}</div>    
  11.         );    
  12.     }    
  13. });    
  14. ReactDOM.render(    
  15.     <MyBox prop={true} />,    
  16.     document.getElementById('timeBox')    
  17. );  


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

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

错误示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         prop: React.PropTypes.arrayOf(React.PropTypes.number)  
  4.     },  
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.prop}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox prop={["Alice", 23, true]} />,    
  13.     document.getElementById('timeBox')    
  14. );  


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

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

错误示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         family: React.PropTypes.objectOf(React.PropTypes.string)    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>{this.props.family.mother} & {this.props.family.father}</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox family={{mother: "Alice", age: 23}} />,    
  13.     document.getElementById('timeBox')    
  14. );  


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

React.PropTypes.shape({

color: React.PropTypes.string,

fontSize: React.PropTypes.number

})


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

React.PropTypes.*.isRequired

错误示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         name: React.PropTypes.string.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>Hello, react!</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox />,    
  13.     document.getElementById('timeBox')    
  14. );   


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

React.PropTypes.any.isRequired

错误示范:

[javascript] view plain copy
  1. var MyBox = React.createClass({    
  2.     propTypes: {    
  3.         name: React.PropTypes.any.isRequired    
  4.     },    
  5.     render: function() {  
  6.         return (    
  7.             <div>Hello, react!</div>    
  8.         );    
  9.     }    
  10. });    
  11. ReactDOM.render(    
  12.     <MyBox />,    
  13.     document.getElementById('timeBox')    
  14. );   
原创粉丝点击