[解決済み】Reactコンポーネントはpropsから状態を初期化する
2022-04-01 01:19:24
質問
Reactでは、この2つの実装の間に実際の違いはあるのでしょうか?
一部の友人からは
FirstComponent
がパターンですが、その理由がわかりません。その
SecondComponent
は、レンダーが一度だけ呼び出されるため、よりシンプルに見えます。
まず
import React, { PropTypes } from 'react'
class FirstComponent extends React.Component {
state = {
description: ''
}
componentDidMount() {
const { description} = this.props;
this.setState({ description });
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default FirstComponent;
2番目
import React, { PropTypes } from 'react'
class SecondComponent extends React.Component {
state = {
description: ''
}
constructor (props) => {
const { description } = props;
this.state = {description};
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default SecondComponent;
更新しました。
私は
setState()
から
this.state = {}
(joewsさんありがとうございます), しかし、まだ違いが分かりません。一方が他方より優れているのでしょうか?
解決方法は?
注意すべきは、決して変化しないプロパティをステートにコピーするのはアンチパターンであるということです(その場合は.propsに直接アクセスすればよいのです)。いずれは変更されるが .props からの値で始まるステート変数がある場合、コンストラクタ呼び出しさえ必要ありません - これらのローカル変数は、親のコンストラクタを呼び出した後に初期化されます。
class FirstComponent extends React.Component {
state = {
x: this.props.initialX,
// You can even call functions and class methods:
y: this.someMethod(this.props.initialY),
};
}
これは、以下の@joewsの回答に相当する略語です。これは es6 トランスパイラの最近のバージョンでのみ動作するようで、私はいくつかの webpack のセットアップで問題が発生しました。もしこれがうまくいかない場合は、babel プラグインを追加してみてください。
babel-plugin-transform-class-properties
または、以下の@joewsによる非短縮形バージョンを使用することができます。
関連
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] React JSX内のループ
-
[解決済み] Reactのこの3つの点は何をするところなのでしょうか?
-
[解決済み] Reactのstateとpropsの違いとは?
-
[解決済み】 {this.props.children} に props を渡すには?}
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】Javascriptのコールバック関数がFirefoxで「Callback is not a function」というエラーを投げる
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート
-
[解決済み】Vueが定義されていない
-
[解決済み] Reactでes6クラスを使うときの「super()」と「super(props)」の違いとは?