Как настроить реквизиты компонента по умолчанию для компонента React - программирование
Подтвердить что ты не робот

Как настроить реквизиты компонента по умолчанию для компонента React

Я использую ниже код для установки реквизитов по умолчанию для компонента React, но он не работает. В методе render() я вижу, что вывод "undefined реквизит" был напечатан на консоли браузера. Как определить значение по умолчанию для реквизитов компонента?

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,
}
4b9b3361

Ответ 1

Вы забыли закрыть скобку 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" />

Ответ 2

Для тех, кто ищет решение ES7 (этап 1):

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';

Ответ 3

Сначала вам нужно отделить свой класс от дальнейших расширений, поскольку вы не можете расширить AddAddressComponent.defaultProps внутри class, а не перемещать его снаружи.

Я также порекомендую вам прочитать о Constructor и жизненном цикле React: см. "Компонентные характеристики и жизненный цикл"

Вот что вы хотите:

class AddAddressComponent extends React.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,
}

export default AddAddressComponent;

Ответ 4

используйте статические 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

Если вы хотите проверить типы, посмотрите, как использовать PropTypes в treyhakanson или Ilan Hasanov, или просмотрите множество ответов в приведенной выше ссылке.