Prop 验证
随着应用不断变大,保证组件被正确使用变得非常有用。为此我们引入propTypes
。React.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元素属性 对props-elements的PropTypes进行React 安装 npm install --save react-element-proptypes 用法 const ElementPropTypes = require ( 'react-element-proptypes' ) ; const Modal = ( { header , ...
import ReactPropTypes from 'prop-types' ; import { describe , PropTypes } from 'react-desc' ; const Anchor = ( props ) => { const { path , ... rest } = props ; return ( < a xss=removed> { props . ...
此外,`react-SVGR`还支持转换后的组件使用TypeScript类型定义,这对于有强类型需求的项目非常有用。 在项目实际应用中,`react-SVGR`的组件可以像其他React组件一样导入和使用: ```jsx import MyIcon from './my...
这是一个用于将SVG文件转换为React组件的工具,它能够自动处理SVG的属性,将其转化为React组件的props,使得在项目中使用SVG如同使用普通组件一样方便。 使用步骤通常包括以下几点: 1. **安装**:在你的项目中,...
这意味着开发者可以像处理其他React组件一样,通过props来设置地图的各种属性,如中心点坐标、缩放级别、地图类型等。例如,可以通过`center` prop设定地图的初始位置,通过`zoom` prop设置初始缩放级别。 其次,这...
React PropTypes 是一个用于在开发时检查组件属性类型(props)的库,它可以帮助我们确保组件接收到正确的输入数据,从而提高代码的健壮性和可维护性。在本示例中,我们将深入探讨如何使用React PropTypes来校验传递...
ReactV 15.5.0 从入门到精通第四章 React组件属性和状态实战
React时刻属性 一个React Proptype Validator来检查传递的prop是否是moment.js构造 例子 var momentPropTypes = require ( 'react-moment-proptypes' ) ; var TestClass = React . createClass ( { propTypes : { ...
React-CompositorKit在这一方面提供了帮助,它可以自动化生成组件的API文档,展示组件的属性、用法示例以及API接口等。 现在,我们来看看CompositorKit如何帮助优化这些开发过程: 1. **组件工作流**:...
"react-super-progress"是一个专门为React设计的库,它提供了一组易于使用的组件,用于创建各种类型的进度条和图表。这个库的名称"react-super-progress-master"暗示了它是项目的主要分支,可能包含了库的完整源代码...
react组件的ppt,格式为key,组件的概念,定义,创建方法
- 使用propTypes进行组件属性校验,确保传入的属性符合预期的类型和结构,而且不要在组件外部直接修改属性的值。 4. **ref的使用**: - 应避免使用字符串形式的ref,因为它们可能导致内存泄露。而应该使用函数...
- **处理指令和属性**:Vue的特殊指令(如`v-bind`,`v-model`)需要替换为React的属性。例如,`v-bind:class`可以转换为`className`,`v-model`转换为`onChange`事件处理。 - **状态管理**:Vue的`data`、`...
在React开发中,propTypes和defaultProps是两个非常重要的概念,它们帮助我们确保组件的属性(props)具有正确的类型和默认值。接下来,我们将详细探讨这两个特性。 **propTypes** propTypes是React组件的一个静态...
React不可变属性 与Immutable.js一起使用的PropType验证器。关于我厌倦了看到的React.PropTypes.instanceOf(Immutable.List)或React.PropTypes.instanceOf(Immutable.Map)作为PropTypes为应指定部件Immutable.List的...
`react-light-barcode`是一个专门为React设计的轻量级条形码组件,它允许开发者根据需求选择性地引入不同类型的条形码,从而避免了引入庞大库的困扰。 `react-light-barcode`组件的核心特性体现在以下几个方面: 1...
React组件的生命周期
1. **定义组件属性**:通过在组件类上设置propTypes属性,指定每个属性的数据类型、默认值和其他详细信息。 2. **生成文档**:react-proptable读取这些定义,生成一份详细的文档,包括属性名、类型、是否必需、...
它将Leaflet的地图对象封装为React组件,使得在React应用中添加、更新和管理地图如同操作其他React组件一样简单。这大大简化了地图应用的开发流程,因为开发者可以利用React的状态管理和生命周期方法来控制地图的...