props

props 是 properties 的缩写,它与 state 的地位不分上下。

我们一定会遇到组件之间相互通信的需求,就像方法的参数一样,我们会根据参数进行操作达成某些需求,props 就可以简单的理解为组件的参数。

基础用法

在函数式组件内 props 可以这样用:

  1. function Demo(props) {
  2. const { name } = props;
  3. return (
  4. <div>hello {name}</div>
  5. );
  6. }
  7. // 调用
  8. <Demo name="cxy" />

class component 内使用:

  1. class Demo extends React.Component {
  2. render() {
  3. const { name } = this.props;
  4. return (
  5. <div>hello {name}</div>
  6. );
  7. }
  8. }
  9. // 调用
  10. <Demo name="cxy" />

我们可以往组件的 props 内传入任何类型的参数,例如:

  1. class Button extends React.Component {
  2. render() {
  3. const { say } = this.props;
  4. return (
  5. <button onClick={say}>btn</button>
  6. );
  7. }
  8. }
  9. <Button say={() => console.log('hello')} />

甚至可以传入 JSX:

  1. class Button extends React.Component {
  2. render() {
  3. return this.props.render;
  4. }
  5. }
  6. <Button render={<button>btns</button>} />

props.children

props.children 是 React 内置的 prop,它代表组件的子组件的集合。
React 为 children 设计了一个非常巧妙的语法糖:

  1. class Button extends React.Component {
  2. render() {
  3. const { children } = this.props;
  4. return (
  5. <button>{children}</button>
  6. );
  7. }
  8. }
  9. <Button>我是 children</Button>
  10. // 等同于
  11. <Button children={'我是 children'}/>

props 不可变

这里的不可变是指组件内部不可修改传入的 props,如:this.props.name = 'frank' (React: 你敢改我就敢报错)。

如同 state 一样,永远不要直接修改 props,因为 React 并不知道如何处理直接修改后的 props。

当然修改还是需要的,不可以在组件内修改 props,我们可以更改传入的 props,这样组件接受到了新的 props 后就可以主动渲染。

defaultProps

我们写函数时,经常会给参数加默认值,同样地 React 也给 props 提供了默认配置:通过定义静态变量 defaultProps 的方式定义。

  1. class Demo extends React.Component {
  2. static defaultProps = {
  3. name: 'cxy'
  4. }
  5. render() {
  6. return (
  7. <div>{this.props.name}</div>
  8. )
  9. }
  10. }
  11. <Demo />

上例中我们调用 Demo 组件却没有传入 name,此时会直接使用 defaultProps 中的默认属性,从而保证了渲染后始终有值。

propTypes

propTypes 用来记录传递给组件的预期属性类型。

在开发环境下 React 将会根据定义的 propTypes 检查传递给组件的 props,如果不匹配,将在控制台内 warning,在生产环境下则不进行检查。

Importing

React 16 以前:

  1. import React, { PropTypes } from 'react';

从 React 16 开始,PropTypes 被放在一个独立的npm包 prop-types 里。

在 React 16 以后的项目内,需要单独安装 prop-types

  1. npm install --save prop-types

import:

  1. import PropTypes from 'prop-types';

定义 propTypes

我们这里列举一些常用的 propTypes

  1. import PropTypes from 'prop-types';
  2. class Demo extends React.Component {
  3. static propTypes = {
  4. optionalArray: PropTypes.array,
  5. optionalBool: PropTypes.bool,
  6. optionalFunc: PropTypes.func,
  7. optionalNumber: PropTypes.number,
  8. optionalObject: PropTypes.object,
  9. optionalString: PropTypes.string,
  10. optionalSymbol: PropTypes.symbol,
  11. optionalAny: PropTypes.any,
  12. optionalRequired: PropTypes.any.isRequired,
  13. }
  14. // ...
  15. }

当然除了上述基本类型以外,prop-types 还支持枚举类型和自定义类型等,有兴趣的可自行了解。