Reactコンポーネントにコンポーネントのデフォルトの小道具を設定する方法


134

以下のコードを使用して、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-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でのみサポートされています。それを反映するように更新されました。


答えをありがとう、しかし私はそれについてもう少し学びたかったのでreact/ nativedocを見て、それらを見つけることができませんでした、そのためのドキュメントはどこですか?
farmcommand2

私はそれをReactドキュメントで明示的に考えていませんが、staticクラス変数が何であるかを理解している場合、それは理にかなっているので、MDNでそれらについて読むことをお勧めします。基本的に、ドキュメントの構文はこれと同等です。どちらも、個々のインスタンスではなく、クラス自体にプロップに関する情報を追加しているためです。
treyhakanson 2017年

1
インポートは次のように変更されます。'prop-types 'からPropTypesをインポートします。
tibi 2017年

1
@treyhakanson MDNリンクは静的メソッドについてのみ話し、変数については話しません。Babelを除いて、静的クラス変数の参照を見つけることができませんでした。これは受け入れられるES7プロパティですか?
johndodo 2017

15

最初に、クラスを別の拡張機能から分離する必要があります。AddAddressComponent.defaultPropsつまり、内部で拡張できない場合は、class代わりにクラスを外部に移動します。

また、コンストラクタと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ですか?OPはクラス宣言の閉じ括弧を忘れたようです。
ivarni

@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

関数タイプの小道具の場合、次のコードを使用できます。

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' }; 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.