Skip to content

Instantly share code, notes, and snippets.

@shuntksh
Last active February 2, 2017 22:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shuntksh/9840d3c5b42dc4b0f8e1282c3b056402 to your computer and use it in GitHub Desktop.
Save shuntksh/9840d3c5b42dc4b0f8e1282c3b056402 to your computer and use it in GitHub Desktop.
React.jsのrenderの戻り値の中で.bindで新しい関数を定義してはいけないわけ ref: http://qiita.com/shuntksh/items/fd81ca9aa31ea8f962e2
// 悪い例:render関数内で新しい関数を定義
class MyComponent extends React.Component {
render() {
const { value, handleChange } = this.props;
return <input value={value} onChange={handleChange.bind(this)} />
}
}
// 悪い例:render関数内で新しい関数を定義
class MyComponent extends React.Component {
render() {
const { value, handleChange } = this.props;
return <input value={value} onChange={handleChange.bind(this)} />
}
}
// 修正例1:コンストラクタ内でbind関数を使用して、Thisを束縛
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.props.handleChange.bind(this);
}
render() {
const { value, handleChange } = this.props;
return <input value={value} onChange={handleChange} />
}
}
// 修正例2:クラス・プロパティとしてLambdaを使って関数を定義し、Thisを束縛
class MyComponent extends React.Component {
handleChange = ev => this.props.handleChange(ev);
render() {
const { value } = this.props;
return <input value={value} onChange={this.handleChange} />
}
}
// 悪い例
class Items extends React.Component {
render() {
const { items, handleClick } = this.props;
return (
<ul>
{items.map((item, idx) => <li key={idx} onClick={handleClick.bind(null, item.id)}
</ul>
)
}
}
// 修正例
class Item extends React.Component {
handleClick() {
const { item: { id }, onItemClick } = this.props;
onItemClick(id);
}
render() {
const { item: { name } } = this.props;
return <li onClick={this.handleClick}>{name}</li>;
}
}
class Items extends React.Component {
render() {
const { items, handleClick } = this.props;
return (
<ul>
{items.map((item, idx) => <Item item={item} onItemClick={handleClick} />}
</ul>
)
}
}
// 関数式のRef
class MyComponent extends React.Component {
render() {
return (<button ref={(el) => this.buttonElement = el}>Click Me!</button>);
}
}
// Refハンドラ関数を外出(TypeScriptで書いてます)
class MyComponent extends React.Component<P, S> {
private refHandlers: any = {
button: (ref: HTMLButtonElement): void => { this.buttonElement = ref; },
};
render() {
return (<button ref={this.refHandlers.button}>Click Me!</button>);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment