如何在React组件上设置组件默认道具


134

我使用下面的代码在React组件上设置默认道具,但它不起作用。在该render()方法中,我可以看到输出“ undefined props”已打印在浏览器控制台上。如何定义组件道具的默认值?

export default class AddAddressComponent extends Component {

render() {
   let {provinceList,cityList} = this.props
    if(cityList === undefined || provinceList === undefined){
      console.log('undefined props')
    }
    ...
}

AddAddressComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
}

AddAddressComponent.defaultProps = {
  cityList: [],
  provinceList: [],
}

AddAddressComponent.propTypes = {
  userInfo: React.PropTypes.object,
  cityList: PropTypes.array.isRequired,
  provinceList: PropTypes.array.isRequired,
}

Answers:


139

您忘记合上Class支架了。

class AddAddressComponent extends React.Component {
  render() {
    let {provinceList,cityList} = this.props
    if(cityList === undefined || provinceList === undefined){
      console.log('undefined props')
    } else {
      console.log('defined props')
    }

    return (
      <div>rendered</div>
    )
  }
}

AddAddressComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
};

AddAddressComponent.defaultProps = {
  cityList: [],
  provinceList: [],
};

AddAddressComponent.propTypes = {
  userInfo: React.PropTypes.object,
  cityList: React.PropTypes.array.isRequired,
  provinceList: React.PropTypes.array.isRequired,
}

ReactDOM.render(
  <AddAddressComponent />,
  document.getElementById('app')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app" />


92

对于那些使用类似babel stage-2transform-class-properties的用户

import React, { PropTypes, Component } from 'react';

export default class ExampleComponent extends Component {
   static contextTypes = {
      // some context types
   };

   static propTypes = {
      prop1: PropTypes.object
   };

   static defaultProps = {
      prop1: { foobar: 'foobar' }
   };

   ...

}

更新资料

从React v15.5开始,已从PropTypes主要的React Package(link)中移出:

import PropTypes from 'prop-types';

编辑

正如@johndodo所指出的那样,static类属性实际上不是ES7规范的一部分,而是当前仅受babel支持。更新以反映这一点。


感谢您的回答,但我想了解更多有关它的信息,因此查看了react/ nativedoc,找不到了,那该文档在哪里?
farmcommand2

我在React文档中没有明确地认为它是合理的,但是如果您了解什么是static类变量是有意义的,那么我建议在MDN上阅读它们。基本上,文档中的语法与此等效,因为两者都将有关道具的信息添加到类本身,而不是单个实例。
treyhakanson

1
导入更改为:从'prop-types'导入PropTypes;
tibi

1
@treyhakanson MDN链接仅讨论静态方法,而不是变量。除了Babel,我找不到静态类变量的引用。这是公认的ES7属性吗?
johndodo

15

首先,您需要将您的课程与其他扩展分开,例如您无法AddAddressComponent.defaultPropsclass将其外部。

我还将建议您阅读有关 构造函数和React的生命周期的信息:请参阅组件规格和生命周期

这是您想要的:

import PropTypes from 'prop-types';

class AddAddressComponent extends React.Component {
  render() {
    let { provinceList, cityList } = this.props;
    if(cityList === undefined || provinceList === undefined){
      console.log('undefined props');
    }
  }
}

AddAddressComponent.contextTypes = {
  router: PropTypes.object.isRequired
};

AddAddressComponent.defaultProps = {
  cityList: [],
  provinceList: [],
};

AddAddressComponent.propTypes = {
  userInfo: PropTypes.object,
  cityList: PropTypes.array.isRequired,
  provinceList: PropTypes.array.isRequired,
}

export default AddAddressComponent;

您确定他们需要constructorcomponentWillReceiveProps吗?在我看来,OP只是忘记了其类声明的右括号。
ivarni'8

@ivarni不一定,但是了解生命周期,构造函数和类扩展很重要。这样他就知道自己在做什么。所以我添加了一些外部链接
Ilanus

2
公平地说,我只是说“您需要”并不完全正确。我宁愿说些“您可以添加这些方法来观察生命周期”。否则,很好的答案:)
ivarni

9

您还可以使用解构分配。

class AddAddressComponent extends React.Component {
  render() {

    const {
      province="insertDefaultValueHere1",
      city="insertDefaultValueHere2"
    } = this.props

    return (
      <div>{province}</div>
      <div>{city}</div>
    )
  }
}

我喜欢这种方法,因为您不需要编写太多代码。


2
我在这里看到的问题是,您可能想在多种方法中使用默认道具。
Gerard Brull

5

使用静态defaultProps,例如:

export default class AddAddressComponent extends Component {
    static defaultProps = {
        provinceList: [],
        cityList: []
    }

render() {
   let {provinceList,cityList} = this.props
    if(cityList === undefined || provinceList === undefined){
      console.log('undefined props')
    }
    ...
}

AddAddressComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
}

AddAddressComponent.defaultProps = {
  cityList: [],
  provinceList: [],
}

AddAddressComponent.propTypes = {
  userInfo: React.PropTypes.object,
  cityList: PropTypes.array.isRequired,
  provinceList: PropTypes.array.isRequired,
}

摘自:https : //github.com/facebook/react-native/issues/1772

如果要检查类型,请参阅如何在treyhakanson或Ilan Hasanov的答案中使用PropTypes,或在上面的链接中查看许多答案。


4

您可以使用类名设置默认道具,如下所示。

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

// Specifies the default values for props:
Greeting.defaultProps = {
  name: 'Stranger'
};

您可以通过此链接使用React推荐的方式获取更多信息


4

对于功能类型prop,可以使用以下代码:

AddAddressComponent.defaultProps = {
    callBackHandler: () => {}
};

AddAddressComponent.propTypes = {
    callBackHandler: PropTypes.func,
};

2

如果您使用的是功能组件,则可以在解构分配中定义默认值,如下所示:

export default ({ children, id="menu", side="left", image={menu} }) => {
  ...
};

0
class Example extends React.Component {
  render() {
    return <h1>{this.props.text}</h1>;
  }
}

Example.defaultProps = { text: 'yo' }; 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.