Як встановити реквізити за замовчуванням для компонента React


135

Я використовую код нижче, щоб встановити реквізити за замовчуванням на компонент 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,
}

Відповіді:


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-2 або властивості transform-class :

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. Оновлено, щоб відобразити це.


дякую за відповідь, але я хотів дізнатися трохи більше про це, тому переглянув react/ nativedoc і не зміг їх знайти, де док для цього?
farmcommand2

Я не думаю, що це прямо в документах React, але якщо ви розумієте, які staticзмінні класу, це має сенс, тому я пропоную прочитати про них на MDN . В основному, синтаксис в документації еквівалентний цьому, оскільки обидва додають інформацію про реквізит до самого класу, а не до окремих екземплярів.
трейхакансон

1
імпорт змінюється на: імпортувати PropTypes з 'типів prop';
tibi

1
@treyhakanson Посилання MDN говорить лише про статичні методи, а не про змінні. Я не міг знайти посилання на статичні змінні класу, за винятком Babel . Це прийняте властивість ES7?
johndodo

15

Перш за все , необхідно відокремити клас від ех додаткових розширень , ви не можете розширити AddAddressComponent.defaultPropsвсередині classзамість переміщення його назовні.

Я також порекомендую вам ознайомитись із життєвим циклом Constructor та 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;

Ви впевнені, що їм потрібні constructorі componentWillReceiveProps? Мені здається, що ОП просто забув дужку закриття для їхнього класу.
ivarni

@ivarni не обов'язково, але важливо, щоб він розумів життєвий цикл, конструктор та розширення класу. тому він буде знати, що робить. тому я додав кілька зовнішніх посилань
Іланус

2
Досить справедливо, я просто думаю, що сказати "вам потрібно" не зовсім коректно. Я вважаю за краще щось сказати: "Ви можете додати ці методи для спостереження за життєвим циклом" . Інакше гарна відповідь :)
ivarni

9

Ви також можете використовувати завдання деструктуризації.

class AddAddressComponent extends React.Component {
  render() {

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

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

Мені подобається такий підхід, оскільки вам не потрібно писати багато коду.


2
Проблема, яку я бачу тут, полягає в тому, що ви можете використовувати реквізити за замовчуванням у кількох методах.
Джерард

5

використовувати статичні параметри за замовчуванням:

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/isissue/1772

Якщо ви хочете перевірити типи, подивіться, як використовувати 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

Для опорного типу функції можна використовувати наступний код:

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' }; 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.