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

Zha*_* Yi 119 ecmascript-6 reactjs

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

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,
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*iuk 129

你忘了关上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')
)
Run Code Online (Sandbox Code Playgroud)
<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" />
Run Code Online (Sandbox Code Playgroud)


tre*_*son 88

对于那些使用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' }
   };

   ...

}
Run Code Online (Sandbox Code Playgroud)

更新

从React v15.5开始,PropTypes被移出主React包(链接):

import PropTypes from 'prop-types';
Run Code Online (Sandbox Code Playgroud)

编辑

正如@johndodo所指出的,static类属性实际上不是ES7规范的一部分,而是目前只有babel支持.更新以反映这一点.


Bri*_*rns 26

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

export default ({ children, id="menu", side="left", image={menu} }) => {
  ...
};
Run Code Online (Sandbox Code Playgroud)


Ila*_*nus 13

首先,您需要将您的课程与其他扩展分开,前提是您无法将其扩展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;
Run Code Online (Sandbox Code Playgroud)

  • 很公平,我只是想说*"你需要"*并不严格正确.我宁愿说一些*"你可以添加这些方法来观察生命周期"*.否则,好答案:) (2认同)

小智 8

您还可以使用解构分配.

class AddAddressComponent extends React.Component {
  render() {

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

    return (
      <div>{province}</div>
      <div>{city}</div>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我在这里看到的问题是您可能希望在多种方法中使用默认道具。 (3认同)

Bra*_*ggs 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,
}
Run Code Online (Sandbox Code Playgroud)

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

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


Roh*_*ali 5

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

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

// Specifies the default values for props:
Greeting.defaultProps = {
  name: 'Stranger'
};
Run Code Online (Sandbox Code Playgroud)

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