TypeScriptに置き換えていく!
React+TypeScript+jQueryの共存(2)の続きです。
今回見ていくのはこちら、Tag.jsxです。
var React = require('react');
//タグ
var Tag = React.createClass({
handleAjax: function() {
apiURL = './api/article?tag=' + this.refs.tag.name;
$('.overlay').removeClass('overlay');
$('#overlay').css('display', 'none');
$('#overlay-close').css('display', 'none');
$('#spinner').css('display', 'block');
},
render: function() {
return (
<li><a ref="tag" name={this.props.id} onClick={this.handleAjax}>{this.props.tag}</a></li>
)
}
});
//タグリスト
var TagList = React.createClass({
render: function() {
var tagNodes = this.props.data.map(function(tag) {
return (
<Tag tag={tag.name} id={tag.id} key={tag.id}/>
)
});
return (
<ul className="tag-list">
{tagNodes}
</ul>
)
}
});
module.exports = TagList;
これをTypeScriptに置き換えます。
クリックイベントがおかしい?
前回やったとおり、classのところを書き換えて…
class Tag extends React.Component<any,any>
とする…のは大丈夫ですね。
でもエラーが出まくります。
このTagコンポーネントの中で、onClick={this.handleAjax}というのがあるのですが、こいつがどうも動きません。
handleAjax: function()
とか
render: function()
とかがエラーになります。
どうやら書き方が変わるみたいですね。
handleAjax(){}
render(){}
だけで良いようです( ゚д゚)!
それから、これまでfunctionの区切りごとについていた「,」も必要ないみたい。
var React = require('react');
//タグ
class Tag extends React.Component {
handleAjax() {
apiURL = './api/article?tag=' + this.refs.tag.name;
$('.overlay').removeClass('overlay');
$('#overlay').css('display', 'none');
$('#overlay-close').css('display', 'none');
$('#spinner').css('display', 'block');
}
render() {
return (
<li><a ref="tag" name={this.props.id} onClick={this.handleAjax}>{this.props.tag}</a></li>
)
}
}
…こうなりました。
でも、まだ動かない!
いろいろ調べてみると、onClickしたときには、thisをbindしてやらないといけないらしいです。
ここを書き換えます。
<li><a ref="tag" name={this.props.id} onClick={this.handleAjax.bind(this)}>{this.props.tag}</a></li>
ちなみにこれ、ほかにもやり方があるみたいで、consructor()でまとめて指定しておくこともできるようです。
URLForm.tsxのTagFormコンポーネントで使ってみました。
//新規タグ入力フォームコンポーネント
class TagForm extends React.Component<any,any> {
constructor() {
super();
this.handleSubmit = this.handleSubmit.bind(this);
this.handleEnterSubmit = this.handleEnterSubmit.bind(this);
}
//略
render(){
return (
);
}
}
それから、jQuery使ってるとよく、引数にe入れてe.stopPropagation()とか、e.preventDefault()とかしますね。
あれもそのままではうまくいきません。
eってなによ?ってエラー出ます。
そこで、e自体にもちゃんと型定義をしてあげないといけません。
handleEnterSubmit(e:any){
e.stopPropagation();
//略
雑ですね!
何を指定したらいいのかわからないからとりあえずanyにしておきました。
とにかくコンパイル通るまではany振りまいておく!
あと、privateとかつけておくこともできるそうです。
private handleEnterSubmit(e:any){
e.stopPropagation();
//略
とりあえず今回はここまで!
次回はref属性の問題と、map()がうまくいかない問題を片づけた話です。