1. ホーム
  2. reactjs

[解決済み] React, ES6 - getInitialStateがプレーンなJavaScriptクラスで定義されていた。

2022-05-17 16:19:44

質問

以下のようなコンポーネントがあります ( radioOther.jsx ):

 'use strict';

 //module.exports = <-- omitted in update

   class RadioOther extends React.Component {

     // omitted in update 
     // getInitialState() {
     //    propTypes: {
     //        name: React.PropTypes.string.isRequired
     //    }
     //    return {
     //       otherChecked: false
     //   }
     // }

     componentDidUpdate(prevProps, prevState) {
         var otherRadBtn = this.refs.otherRadBtn.getDOMNode();

         if (prevState.otherChecked !== otherRadBtn.checked) {
             console.log('Other radio btn clicked.')
             this.setState({
                 otherChecked: otherRadBtn.checked,
             });
         }
     }

     onRadChange(e) {
         var input = e.target;
         this.setState({
             otherChecked: input.checked
         });
     }

     render() {
         return (
             <div>
                 <p className="form-group radio">
                     <label>
                         <input type="radio"
                                ref="otherRadBtn"
                                onChange={this.onRadChange}
                                name={this.props.name}
                                value="other"/>
                         Other
                     </label>
                     {this.state.otherChecked ?
                         (<label className="form-inline">
                             Please Specify:
                             <input
                                 placeholder="Please Specify"
                                 type="text"
                                 name="referrer_other"
                                 />
                         </label>)
                         :
                         ('')
                     }
                 </p>
             </div>
         )
     }
 };

ECMAScript6を使用する前はすべて順調でしたが、現在は1つのエラー、1つの警告が表示され、フォローアップの質問があります。

エラーです。 Uncaught TypeError: nullのプロパティ'otherChecked'を読み取ることができません。

警告です。 getInitialStateは、プレーンなJavaScriptクラスであるRadioOtherで定義されています。これは、以下の方法で作成されたクラスに対してのみサポートされています。 で作成されたクラスにのみサポートされています。代わりにstateプロパティを定義するつもりだったのでしょうか?


  1. DOMの条件文が原因であることは分かっていますが、どうやら初期値を正しく宣言していないようです。

  2. 私は getInitialState 静的

  3. getInitialStateが正しくない場合、私のプロティタイプを宣言する適切な場所はどこでしょうか?

UPDATEです。

   RadioOther.propTypes = {
       name: React.PropTypes.string,
       other: React.PropTypes.bool,
       options: React.PropTypes.array }

   module.exports = RadioOther;

@ssorallen さん、このコード:

     constructor(props) {
         this.state = {
             otherChecked: false,
         };
     }

プロデュース "Uncaught ReferenceError: this is not defined" を生成し、以下はそれを修正したものです。

     constructor(props) {
     super(props);
         this.state = {
             otherChecked: false,
         };
     }

をクリックすると、エラーが発生するようになりました。

Uncaught TypeError: Cannot read property 'props' of undefined

どのように解決するのですか?

  • getInitialState はES6クラスでは使用されません。代わりに this.state をコンストラクタで指定します。
  • propTypes は静的なクラス変数であるか、クラスに割り当てられるべきで、コンポーネントインスタンスに割り当てられるべきではない。
  • メンバメソッドは "オートバインド" を ES6 クラスで使用します。コールバックとして使用されるメソッドについては クラスプロパティ初期化子 を使用するか、コンストラクタでバインドインスタンスを割り当てます。
export default class RadioOther extends React.Component {

  static propTypes = {
    name: React.PropTypes.string.isRequired,
  };

  constructor(props) {
    super(props);
    this.state = {
      otherChecked: false,
    };
  }

  // Class property initializer. `this` will be the instance when
  // the function is called.
  onRadChange = () => {
    ...
  };

  ...

}

ES6クラスについては、Reactのドキュメントを参照してください。 関数をクラスに変換する