31
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

React(JSX)をES6で書くときに気をつけること

Last updated at Posted at 2016-06-22

React初心者がJSXで開発するときに気づいたことを五月雨に…。
ドキュメントを読んだり、いろんな記事を読んだりするなかで、
自分なりに解釈したので、間違っていることも多数あるかと思いますが備忘録的に。

コンポーネントのライフサイクル

DOM要素が読み込まれる(更新する)前は、componentWillMount(componentWillUpdate)、
DOM要素が読み込まれた(更新された)後は、componentDidMount(componentDidUpdate)。

  • コンポーネントがマウントされたとき
    componentWillMount → componentDidMount

  • コンポーネントのpropsが変更されたとき
    componentWillReceiveProps

  • コンポーネントのstateが変更されたとき
    componentWillUpdate → componentDidUpdate

  • コンポーネントがアンマウントされるとき
    componentWillUnMount

参考: Component Specs and Lifecycle

propsとstate

数字、文字列、配列等結構なんでも代入できます。便利。
使い分けについて、様々な意見があるかとは思いますが、
stateは、変更されたら自動的にrenderが走り、DOMが再描画される。
propsは、変更されても自動的にrenderが走ることはない。という点で使い分けてみています。

props

propsは、コンポーネントがマウントされていないときに、コンポーネントに対して値を設定できる。
設定していたpropsを変更する場合、componentWillReceiveProps で、props変更後の処理を記述できる。

state

stateは、コンポーネントがマウントされているときに、
イベント等によって、コンポーネントの状態を変化させ、自動的にrenderを再読み込みする。

render

renderの中でif文

カッコが多いのでコピペ用

{(() => {
  if(this.state.view === 'top') {
     return (
       <Top/>
     );
 }
})()}

イベントを定義するときは、bind(this)

onClickなどイベントを定義するときは、constructor内でbind(this)で定義する

constructor(props, context) {
 super(props, context);
 this._clickItemHdl = this._clickItemHdl.bind(this);
}

参考: Refactoring React Components to ES6 Classes

classはclassName

理解してはいるものの、つい忘れがち…。

<li>
  <a href="javascript: void(0);" onClick={this._clickItemHdl}>テスト1</a>
</li>

styleはキャメルケースで{{}}2つずつ

とはいえ、Material-uiのインラインスタイル以外は、classNameでクラスを定義して、
CSSで記述する方が無難かと思います。

<li style={{fontSize: '20px',
            color: 'pink',
            marginBottom: '20px'
}}>
  <a href="javascript: void(0);" onClick={this._clickItemHdl} >テスト2</a>
</li>

renderで返すことができるのはDOM1つだけ

renderに定義できるテンプレートは、DOM要素1つだけです。

たとえば、コンポーネントが複数並列に並ぶような、次のようなコードは動きません。

render() {
    return (
      <Header />
      <Main />
      <Footer />
    );
  }

回避するためには、これらを何かの要素(div)等で囲むことが必要です。

render() {
    return (
            <div>
        <Header />
        <Main />
        <Footer />
     </div>
    );
  }

閉じタグを忘れずに

img要素で忘れやすいです。

<img src="hoge/hoge.jpg" />

##Reactで開発してよかったなと思ったこと

1つのJSXにDOMテンプレートと、機能を両方まとめてかける

HTMLとjQueryを使用して実装する場合、HTMLにDOM要素を記述し、JavaScriptで機能を定義する必要がありました。
Reactの場合、読み込まれるDOMと、それに付与される機能を1つのJSXにまとめられるため、コンポーネントのカプセル化できました。

31
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?