簡體   English   中英

如何在 React 組件上設置組件默認道具

[英]How to set component default props on React component

我使用下面的代碼在 React 組件上設置默認道具,但它不起作用。 render()方法中,我可以看到輸出“undefined props”被打印在瀏覽器控制台上。 如何為組件 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,
}

您忘記關閉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" />

對於那些使用 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 包(鏈接):

import PropTypes from 'prop-types';

編輯

正如@johndodo 所指出的, static類屬性實際上不是 ES7 規范的一部分,而是目前僅受 babel 支持。 更新以反映這一點。

首先,您需要將您的類與進一步的擴展分開,例如您不能在class擴展AddAddressComponent.defaultProps而將其移到外部。

我還將建議您閱讀有關構造函數和 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;

您還可以使用解構賦值。

class AddAddressComponent extends React.Component {
  render() {

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

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

我喜歡這種方法,因為您不需要編寫太多代碼。

使用靜態 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,或查看上述鏈接中的許多答案。

您可以使用類名設置默認道具,如下所示。

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

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

您可以通過此鏈接使用 React 推薦的方式獲取更多信息

對於函數類型 prop,您可以使用以下代碼:

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

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

如果您使用的是功能組件,則可以在解構賦值中定義默認值,如下所示:

export default ({ children, id="menu", side="left", image={menu} }) => {
  ...
};
class Example extends React.Component {
  render() {
    return <h1>{this.props.text}</h1>;
  }
}

Example.defaultProps = { text: 'yo' }; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM