赞
踩
在之前关于组件的文章当中已经对Props有所涉及!而本篇文章主要是对Props进行更加全面介绍!以及总结props与state的区别!
组件内可以通过props来获得属性值,看下面的实例先来回顾 一下Props最基本的使用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/react.development.js"></script> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/react-dom.development.js"></script> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/babel.min_.js"></script> </head> <body> <div id="wrap"></div> </body> <script type="text/babel"> class MyComponent extends React.Component { //此处的构造器是可以省略的 constructor(props){ super(props); } render() { return <div>好神奇! {this.props.siteName}!</div>; } } var element = <MyComponent siteName="zhangpeiyue.com"/>; ReactDOM.render( element, document.querySelector("#wrap") ); </script> </html>
通过以上实例咱们知道通过props可以得到组件MyComponent的属性siteName的值。
咱们可以通过为组件类添加defaultProps属性来为props设置默认值。defaultProps是一个对象,只要将添加的值放到defaultProps的属性中即可,例如:
class MyComponent extends React.Component { render() { //此处返回 <div>小张今年18岁了</div> return <div> {this.props.userName}今年{this.props.age}岁了! </div>; } } //为组件添加默认属性 userName与age MyComponent.defaultProps={ userName:"小张", age:18 } var element = <MyComponent/>; ReactDOM.render( element, document.querySelector("#wrap") );
咱们可以通过在父组件当中设置State,然后通过在子组件上使用props来接收收父组件的state值。
//父组件 class MyComponent extends React.Component { constructor(){ super(); //设置sate,添加name与age属性 this.state={ name:"张培跃", age:18 } } render() { return <div> <Name name={this.state.name}/> <Age age={this.state.age}/> </div>; } } //子组件Name class Name extends React.Component{ render(){ return <div>{this.props.name}</div> } } //子组件Age class Age extends React.Component{ render(){ return <div>{this.props.age}</div> } } var element = <MyComponent/>; ReactDOM.render( element, document.querySelector("#wrap") );
为了保证咱们的组件被正确使用,React提供了可以对Props进行验证的功能PropTypes。PropTypes为组件类自身的属性,提供了很多验证器,来验证传入的数据是否有效。当传入的数据无效时,JavaScript控制台会抛出警告。
另外需要注意的是,在开发环境下,当你使用了一个无效的值作为prop时,控件台会出现警告;在生产环境下,为了性能考虑会将PropTypes忽略掉!
要想使用propTypes,首先要对prop-type.js文件进行引入。
<script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/prop-types.js"></script>
具体使用,可看以下示例:
var name="老大" var age=18; class MyComponent extends React.Component { render() { return <div> {this.props.name}今年{this.props.age}岁了! </div>; } } //propTypes是组件类的静态属性 MyComponent.propTypes={ //将name设置为string类型 name:PropTypes.string, //将age设置为number类型 age:PropTypes.number }; var element = <MyComponent name={name} age={age} />; ReactDOM.render( element, document.querySelector("#wrap") );
以上示例当中的name与age不合法时,会弹出类型不符的警告!所以在项目开发中使用PropTypes进行对props的验证还是很有好处的!
更多验证器说明如下:
MyComponent.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!'); } } } }
现在我们来总结下,props与state的区别:
—————END—————
喜欢本文的朋友们,欢迎关注公众号 张培跃,收看更多精彩内容!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。