props
props 是 properties 的缩写,它与 state 的地位不分上下。
我们一定会遇到组件之间相互通信的需求,就像方法的参数一样,我们会根据参数进行操作达成某些需求,props 就可以简单的理解为组件的参数。
基础用法
在函数式组件内 props 可以这样用:
function Demo(props) {
const { name } = props;
return (
<div>hello {name}</div>
);
}
// 调用
<Demo name="cxy" />
在 class component
内使用:
class Demo extends React.Component {
render() {
const { name } = this.props;
return (
<div>hello {name}</div>
);
}
}
// 调用
<Demo name="cxy" />
我们可以往组件的 props 内传入任何类型的参数,例如:
class Button extends React.Component {
render() {
const { say } = this.props;
return (
<button onClick={say}>btn</button>
);
}
}
<Button say={() => console.log('hello')} />
甚至可以传入 JSX:
class Button extends React.Component {
render() {
return this.props.render;
}
}
<Button render={<button>btns</button>} />
props.children
props.children
是 React 内置的 prop,它代表组件的子组件的集合。
React 为 children 设计了一个非常巧妙的语法糖:
class Button extends React.Component {
render() {
const { children } = this.props;
return (
<button>{children}</button>
);
}
}
<Button>我是 children</Button>
// 等同于
<Button children={'我是 children'}/>
props 不可变
这里的不可变是指组件内部不可修改传入的 props,如:this.props.name = 'frank'
(React: 你敢改我就敢报错)。
如同 state 一样,永远不要直接修改 props,因为 React 并不知道如何处理直接修改后的 props。
当然修改还是需要的,不可以在组件内修改 props,我们可以更改传入的 props,这样组件接受到了新的 props 后就可以主动渲染。
defaultProps
我们写函数时,经常会给参数加默认值,同样地 React 也给 props 提供了默认配置:通过定义静态变量 defaultProps 的方式定义。
class Demo extends React.Component {
static defaultProps = {
name: 'cxy'
}
render() {
return (
<div>{this.props.name}</div>
)
}
}
<Demo />
上例中我们调用 Demo 组件却没有传入 name,此时会直接使用 defaultProps
中的默认属性,从而保证了渲染后始终有值。
propTypes
propTypes 用来记录传递给组件的预期属性类型。
在开发环境下 React 将会根据定义的 propTypes 检查传递给组件的 props,如果不匹配,将在控制台内 warning,在生产环境下则不进行检查。
Importing
React 16 以前:
import React, { PropTypes } from 'react';
从 React 16 开始,PropTypes 被放在一个独立的npm包 prop-types 里。
在 React 16 以后的项目内,需要单独安装 prop-types
:
npm install --save prop-types
import:
import PropTypes from 'prop-types';
定义 propTypes
我们这里列举一些常用的 propTypes
import PropTypes from 'prop-types';
class Demo extends React.Component {
static propTypes = {
optionalArray: PropTypes.array,
optionalBool: PropTypes.bool,
optionalFunc: PropTypes.func,
optionalNumber: PropTypes.number,
optionalObject: PropTypes.object,
optionalString: PropTypes.string,
optionalSymbol: PropTypes.symbol,
optionalAny: PropTypes.any,
optionalRequired: PropTypes.any.isRequired,
}
// ...
}
当然除了上述基本类型以外,prop-types
还支持枚举类型和自定义类型等,有兴趣的可自行了解。