23
18

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.jsAdvent Calendar 2014

Day 13

Componentを拡張してみる

Last updated at Posted at 2014-12-14

今回はちょっとした小ネタとして、既存のComponentを拡張したようなComponentを作りたい時の話をしたいと思います。

それには、v0.12で追加されたJSXのspread attributesを使うと簡単に出来ます。

テキスト付きの画像Component

例として、テキストと画像をセットにしたImageTextというComponentを考えてみたいと思います。

I/FとしてはimgのComponentに渡すものにプラスしてテキストで考えてみます。

var ImageText = React.createClass({
  render() {
    return (
      <span>{this.props.text}<img src={this.props.src} width={this.props.width} height={this.props.height} /></span>
    );
  }
});
<ImageText text="名前です" src="/img/foo.png" width="100" height="200" />

単純に実装するとこんな感じです。とはいえ、imgにはaltも渡せたりするのでaltも...とか考えると面倒な感じになります。

こういった場合にspead attributesを使うとこんな感じで書くことが出来ます。

var ImageText = React.createClass({
  render() {
    var {text, ...other} = this.props;
    return (
      <span>{text}<img {...other} /></span>
    );
  }
});

この時渡すimgには関係ないProp(text)は渡さない方がいいのでtextとotherでspread attributesを使って分割しています。JavaScriptでも_.omitを使うことで同じようなことは出来ます。

これを使う場合、ComponentのI/Fがわかりにくくなるので、PropTypesをなるべく指定しておく方がわかりやすくていいと思います。

クリックイベントを送信するようにしてみる

次はクリックイベントを送信するようにしてみましょう。

var request = require('superagent');
var ImageText = React.createClass({
  onClick() {
    request.get("/click_img", { img: this.props.src });
  },
  render() {
    var {text, ...other} = this.props;
    return (
      <span>{text}<img {...other} onClick={this.onClick} /></span>
    );
  }
});

こんな感じでonClickを追加することでPropの値をmergeしてくれます。onClick{...other}の前に持ってくるとonClickの挙動を上書きされてしまいます。

これをJSXなしで実装する場合は、_.extendやObject.assignなどを使うことになります。

こんな感じでComponentを拡張したい場合はJSXのspread attributesを使うと便利ですというネタでした。

明日はmixinについて書きたいと思います。

23
18
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
23
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?