落とし穴

クラス�?δ»£γ‚γ‚Šγ«ι–’ζ•°γ§γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ‚’ζŽ¨ε₯¨γ—γΎγ™γ€‚η§»θ‘Œζ–Ήζ³•γ―こけら。

Component は React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?εŸΊεΊ•γ‚―γƒ©γ‚Ήγ§γ‚γ‚Šγ€JavaScript οΏ½?クラスとして�?οΏ½ηΎ©γ•γ‚Œγ¦γ„γΎγ™γ€‚React γ―ηΎεœ¨γ§γ‚‚γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚΅γƒγƒΌγƒˆγ—γ¦γ„γΎγ™γŒγ€ζ–°γ—γ„γ‚³γƒΌγƒ‰γ§οΏ½?δ½Ώη”¨γ―ζŽ¨ε₯¨γ•γ‚ŒγΎγ›γ‚“γ€‚

class Greeting extends Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}

γƒͺフゑレンス

Component

クラスとして React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?�義するには、硄み込み�? Component クラスを碙承し、render パソッドを�?�義します。

import { Component } from 'react';

class Greeting extends Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}

render パソッド�?γΏγŒεΏ…ι ˆγ§γ™γ€‚δ»–οΏ½?パソッドはγ‚ͺプションです。

さらに例を見る


context

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γ―γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’ this.context οΏ½?ε½’γ§εˆ©η”¨γ§γγΎγ™γ€‚γ“γ‚Œγ―γ€static contextTypeοΌˆηΎθ‘Œη‰ˆοΌ‰γΎγŸγ― static contextTypes(非推ε₯¨οΌ‰γ‚’δ½Ώη”¨γ—γ¦ε—γ‘ε–γ‚ŠγŸγ„γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’ζŒ‡οΏ½?οΏ½γ—γŸε ΄εˆγ«οΏ½?γΏεˆ©η”¨γ§γγΎγ™γ€‚

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€δΈ€εΊ¦γ« 1 οΏ½?鑞�?γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ—γ‹θͺ­γΏε–γ‚‹γ“γ¨γŒγ§γγΎγ›γ‚“γ€‚

class Button extends Component {
static contextType = ThemeContext;

render() {
const theme = this.context;
const className = 'button-' + theme;
return (
<button className={className}>
{this.props.children}
</button>
);
}
}

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ this.context γ‚’θͺ­γΏε–γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ useContext γ‚’η”¨γ„γ‚‹γ“γ¨γ¨εŒη­‰γ§γ™γ€‚

η§»θ‘Œζ–Ήζ³•γ‚’θ¦‹γ‚‹


props

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«ζΈ‘γ•γ‚ŒγŸ props は this.props οΏ½?ε½’γ§εˆ©η”¨γ§γγΎγ™γ€‚

class Greeting extends Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}

<Greeting name="Taylor" />

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ this.props γ‚’θͺ­γΏε–γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ props γ‚’οΏ½?οΏ½θ¨€γ™γ‚‹γ“γ¨γ¨εŒη­‰γ§γ™γ€‚

η§»θ‘Œζ–Ήζ³•γ‚’θ¦‹γ‚‹


refs

Deprecated

こ�? API は React οΏ½?ε°†ζ₯οΏ½?γƒ‘γ‚Έγƒ£γƒΌγƒγƒΌγ‚Έγƒ§γƒ³γ§ε‰Šι™€γ•γ‚ŒγΎγ™γ€‚δ»£γ‚γ‚Šγ« createRef を使用してください。

こ�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?レガシーγͺζ–‡ε­—εˆ—ε½’εΌ ref にをクセスできます。


state

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? state は this.state οΏ½?ε½’γ§εˆ©η”¨γ§γγΎγ™γ€‚state フィールドはγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ§γͺγ‘γ‚Œγ°γͺγ‚ŠγΎγ›γ‚“γ€‚state γ‚’η›΄ζŽ₯ζ›Έγζ›γˆγ¦γ―γ„γ‘γΎγ›γ‚“γ€‚state γ‚’ε€‰ζ›΄γ—γŸγ„ε ΄εˆγ―γ€ζ–°γ—γ„ state を引数にして setState を呼び出します。

class Counter extends Component {
state = {
age: 42,
};

handleAgeChange = () => {
this.setState({
age: this.state.age + 1
});
};

render() {
return (
<>
<button onClick={this.handleAgeChange}>
Increment age
</button>
<p>You are {this.state.age}.</p>
</>
);
}
}

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ state γ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ useState γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ¨εŒη­‰γ§γ™γ€‚

η§»θ‘Œζ–Ήζ³•γ‚’θ¦‹γ‚‹


constructor(props)

γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώγ―γ€γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒžγ‚¦γƒ³γƒˆοΌˆη”»ι’γ«θΏ½εŠ οΌ‰γ•γ‚Œγ‚‹ε‰γ«οΏ½?οΏ½θ‘Œγ•γ‚ŒγΎγ™γ€‚ι€šεΈΈ React γ§γ―γ€γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώγ― 2 ぀�?οΏ½?ηš„γ§οΏ½?γΏεˆ©η”¨γ•γ‚ŒγΎγ™γ€‚state οΏ½?οΏ½?�言と、クラスパソッド�?クラスむンスタンスへ�?バむンドです。

class Counter extends Component {
constructor(props) {
super(props);
this.state = { counter: 0 };
this.handleClick = this.handleClick.bind(this);
}

handleClick() {
// ...
}

ヒダンγͺ JavaScript ζ§‹ζ–‡γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ€γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώγ―γ»γ¨γ‚“γ©εΏ…θ¦γ‚γ‚ŠγΎγ›γ‚“γ€‚δ»£γ‚γ‚Šγ«δΈŠθ¨˜οΏ½?コードは、ヒダンブラウアや Babel γͺど�?γƒ„γƒΌγƒ«γ§γ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γ‚‹γƒ‘γƒ–γƒͺγƒƒγ‚―γ‚―γƒ©γ‚Ήγƒ•γ‚£γƒΌγƒ«γƒ‰ζ§‹ζ–‡γ‚’δ½Ώη”¨γ—γ¦ζ›Έγη›΄γ™γ“γ¨γŒγ§γγΎγ™γ€‚

class Counter extends Component {
state = { counter: 0 };

handleClick = () => {
// ...
}

γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώγ«γ―ε‰―δ½œη”¨γ‚„γ‚΅γƒ–γ‚Ήγ‚―γƒͺγƒ—γ‚·γƒ§γƒ³οΌˆsubscription, γ‚€γƒ™γƒ³γƒˆη™»ιŒ²γ‚„ε€–ιƒ¨γƒ‡γƒΌγ‚Ώθ³Όθͺ­οΌ‰γ‚’δΈ€εˆ‡ε«γ‚γ¦γ―いけません。

εΌ•ζ•°

  • props: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?初期 props。

θΏ”γ‚Šε€€

constructor は何も返してはいけません。

注意点

  • γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώε†…γ§ε‰―δ½œη”¨γ‚„γ‚΅γƒ–γ‚Ήγ‚―γƒͺプションを�?οΏ½θ‘Œγ—γͺγ„γ§γγ γ•γ„γ€‚δ»£γ‚γ‚Šγ« componentDidMount を使用してください。

  • γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώε†…γ§γ―γ€δ»–οΏ½?すべて�?γ‚Ήγƒ†γƒΌγƒˆγƒ‘γƒ³γƒˆοΏ½?前に super(props) γ‚’ε‘Όγ³ε‡Ίγ™εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γ“γ‚Œγ‚’θ‘Œγ‚γͺγ„γ¨γ€γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚ΏγŒοΏ½?οΏ½θ‘Œγ•γ‚Œγ¦γ„γ‚‹ι–“ this.props が undefined にγͺγ‚‹γŸγ‚γ€ζ··δΉ±γ‚’ζ‹›γγƒγ‚°οΏ½?εŽŸε› γ¨γͺγ‚‹ε―θƒ½ζ€§γŒγ‚γ‚ŠγΎγ™γ€‚

  • this.state γ‚’η›΄ζŽ₯γ‚»γƒƒγƒˆγ—γ¦θ‰―γ„ε”―δΈ€οΏ½?ε ΄ζ‰€γŒγ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώγ§γ™γ€‚δ»–οΏ½?すべて�?γƒ‘γ‚½γƒƒγƒ‰ε†…γ§γ―γ€δ»£γ‚γ‚Šγ« this.setState() γ‚’δ½Ώη”¨γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώε†…γ§ setState を呼び出さγͺいでください。

  • ァーバレンダγƒͺγƒ³γ‚°γ‚’δ½Ώη”¨γ™γ‚‹ε ΄εˆγ€γ‚³γƒ³γ‚Ήγƒˆγƒ©γ‚―γ‚Ώγ‚‚γ‚΅γƒΌγƒδΈŠγ§οΏ½?οΏ½θ‘Œγ•γ‚Œγ€γοΏ½?後に render γƒ‘γ‚½γƒƒγƒ‰γŒηΆšγγΎγ™γ€‚γŸγ γ—γ€componentDidMount γ‚„ componentWillUnmount οΏ½?γ‚ˆγ†γͺγƒ©γ‚€γƒ•γ‚΅γ‚€γ‚―γƒ«γƒ‘γ‚½γƒƒγƒ‰γ―γ‚΅γƒΌγƒδΈŠγ§γ―οΏ½?οΏ½θ‘Œγ•γ‚ŒγΎγ›γ‚“γ€‚

  • Strict Mode γŒζœ‰εŠΉοΏ½?ε ΄εˆγ€React γ―ι–‹η™Ίη’°ε’ƒγ«γŠγ„γ¦ constructor γ‚’ 2 ε›žε‘Όγ³ε‡Ίγ—γ€2 ぀�?むンスタンス�?うけ 1 γ€γ‚’η ΄ζ£„γ—γΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€constructor ε€–γ«η§»ε‹•γ™γ‚‹γΉγεΆη™Ίηš„γͺε‰―δ½œη”¨γ«ζ°—γ₯きやすくγͺγ‚ŠγΎγ™γ€‚

補袳

ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ― constructor γ¨γΎγ£γŸγεŒη­‰οΏ½?γ‚‚οΏ½?γ―ε­˜εœ¨γ—γΎγ›γ‚“γ€‚ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ state γ‚’οΏ½?�言するには useState γ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚εˆζœŸ state οΏ½?ε†θ¨ˆοΏ½?οΏ½γ‚’ιΏγ‘γŸγ„ε ΄εˆγ― useState に閒数を渑します。


componentDidCatch(error, info)

componentDidCatch γ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ¨γ€ε­γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΌˆι γοΏ½?ε­γ‚’ε«γ‚€οΌ‰γŒγƒ¬γƒ³γƒ€γƒΌδΈ­γ«γ‚¨γƒ©γƒΌγ‚’γ‚Ήγƒ­γƒΌγ—γŸγ¨γγ« React γŒγγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€ζœ¬η•ͺ環咃でそ�?γ‚¨γƒ©γƒΌγ‚’γ‚¨γƒ©γƒΌγƒ¬γƒγƒΌγƒˆγ‚΅γƒΌγƒ“γ‚Ήγ«γƒ­γ‚°γ¨γ—γ¦θ¨˜ιŒ²γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

ι€šεΈΈγ“γ‚Œγ―γ€γ‚¨γƒ©γƒΌγ«εεΏœγ—γ¦ state γ‚’ζ›΄ζ–°γ—γ€γƒ¦γƒΌγ‚Άγ«γ‚¨γƒ©γƒΌγƒ‘γƒƒγ‚»γƒΌγ‚Έγ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚οΏ½? static getDerivedStateFromError γ¨δΈ€η·’γ«δ½Ώη”¨γ•γ‚ŒγΎγ™γ€‚γ“γ‚Œγ‚‰οΏ½?γƒ‘γ‚½γƒƒγƒ‰γ‚’ζŒγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ことをエラーバウンダγƒͺ (error boundary) と呼びます。

例を見る

εΌ•ζ•°

  • error: γ‚Ήγƒ­γƒΌγ•γ‚ŒγŸγ‚¨γƒ©γƒΌγ€‚ηΎοΏ½?οΏ½ηš„γ«γ―ι€šεΈΈ Error οΏ½?むンスタンスにγͺγ‚ŠγΎγ™γŒγ€γ“οΏ½?γ“γ¨γ―δΏθ¨Όγ•γ‚Œγ¦γ„γΎγ›γ‚“γ€‚JavaScript γ§γ―ζ–‡ε­—εˆ—γ‚„ null すら含む、任意�?ε€€γ‚’ throw γ™γ‚‹γ“γ¨γŒθ¨±γ•γ‚Œγ¦γ„γ‚‹γŸγ‚γ§γ™γ€‚

  • info: γ‚¨γƒ©γƒΌγ«ι–’γ™γ‚‹θΏ½εŠ ζƒ…ε ±γ‚’ε«γ‚€γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ€‚γοΏ½? componentStack γƒ•γ‚£γƒΌγƒ«γƒ‰γ«γ―γ€γ‚Ήγƒ­γƒΌγ—γŸγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ¨γοΏ½?すべて�?θ¦ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?εε‰γŠγ‚ˆγ³γ‚½γƒΌγ‚ΉδΈŠοΏ½?位�?γ‚’ε«γ‚“γ γ‚Ήγ‚Ώγƒƒγ‚―γƒˆγƒ¬γƒΌγ‚ΉγŒε«γΎγ‚ŒγΎγ™γ€‚ζœ¬η•ͺη’°ε’ƒγ§γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆεγ―γƒŸγƒ‹γƒ•γ‚‘γ‚€γ•γ‚Œγ¦γ„γΎγ™γ€‚ζœ¬η•ͺη’°ε’ƒη”¨γ«γ‚¨γƒ©γƒΌγƒ¬γƒγƒΌγƒˆγ‚’θ¨­οΏ½?οΏ½γ™γ‚‹ε ΄εˆγ―γ€ι€šεΈΈοΏ½? JavaScript γ‚¨γƒ©γƒΌγ‚Ήγ‚Ώγƒƒγ‚―γ¨εŒγ˜γ‚ˆγ†γ«γ€γ‚½γƒΌγ‚Ήγƒžγƒƒγƒ—γ‚’δ½Ώη”¨γ—γ¦γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚Ήγ‚Ώγƒƒγ‚―γ‚’γƒ‡γ‚³γƒΌγƒ‰γ§γγΎγ™γ€‚

θΏ”γ‚Šε€€

componentDidCatch は何も返してはいけません。

注意点

  • δ»₯前は、UI を更新してフォールバック�?γ‚¨γƒ©γƒΌγƒ‘γƒƒγ‚»γƒΌγ‚Έγ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚γ« componentDidCatch 内で setState γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γŒδΈ€θˆ¬ηš„γ§γ—γŸγ€‚γ“γ‚Œγ―ιžζŽ¨ε₯¨γ¨γͺγ‚Šγ€δ»£γ‚γ‚Šγ« static getDerivedStateFromError γ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ“γ¨γŒζŽ¨ε₯¨γ•γ‚Œγ¦γ„γΎγ™γ€‚

  • React οΏ½?本η•ͺ用ビルドと開発用ビルドでは、componentDidCatch γŒγ‚¨γƒ©γƒΌγ‚’ε‡¦η†γ™γ‚‹ζ–Ήζ³•γŒγ‚γšγ‹γ«η•°γͺγ‚ŠγΎγ™γ€‚ι–‹η™ΊδΈ­γ―γ€γ‚¨γƒ©γƒΌγŒ window γ«γΎγ§γƒγƒ–γƒ«γ‚’γƒƒγƒ—γ™γ‚‹γŸγ‚γ€window.onerror γ‚„ window.addEventListener('error', callback) γ¨γ„γ£γŸγ‚³γƒΌγƒ‰γŒ componentDidCatch γ«γ‚ˆγ£γ¦γ‚­γƒ£γƒƒγƒγ•γ‚ŒγŸγ‚¨γƒ©γƒΌγ‚’ζ•γΎγˆγ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚δΈ€ζ–Ήγ§ζœ¬η•ͺ環咃ではエラーはバブルをップしγͺγ„γŸγ‚γ€η₯–ε…ˆοΏ½?エラーハンドラは componentDidCatch γ«γ‚ˆγ£γ¦ζ˜Žη€Ίηš„γ«γ‚­γƒ£γƒƒγƒγ•γ‚Œγͺγ‹γ£γŸγ‚¨γƒ©γƒΌοΏ½?γΏγ‚’ε—γ‘ε–γ‚ŠγΎγ™γ€‚

補袳

ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ― componentDidCatch に直ζŽ₯ε―ΎεΏœγ™γ‚‹γ‚‚οΏ½?γ―γΎγ γ‚γ‚ŠγΎγ›γ‚“γ€‚γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?δ½œζˆγ‚’γͺγ‚‹γΉγιΏγ‘γŸγ„ε ΄εˆγ―γ€δΈŠθ¨˜οΏ½?γ‚ˆγ†γͺ ErrorBoundary γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ 1 ぀だけ書いてをプγƒͺε…¨δ½“γ§δ½Ώη”¨γ—γΎγ™γ€‚γ‚γ‚‹γ„γ―γ“γ‚Œγ‚’δ»£γ‚γ‚Šγ«γ‚„γ£γ¦γγ‚Œγ‚‹ react-error-boundary パッケージを使用することもできます。


componentDidMount()

componentDidMount パソッドを�?οΏ½ηΎ©γ™γ‚‹γ¨γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒη”»ι’γ«θΏ½εŠ οΌˆγƒžγ‚¦γƒ³γƒˆοΌ‰γ•γ‚ŒγŸγ¨γγ« React γŒγγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚δΈ€θˆ¬ηš„γ«γ―γ“γ“γ§γ€γƒ‡γƒΌγ‚Ώε–εΎ—γ€γ‚΅γƒ–γ‚Ήγ‚―γƒͺプション設�?οΏ½γ‚„ DOM γƒŽγƒΌγƒ‰οΏ½?ζ“δ½œγ‚’ι–‹ε§‹γ—γΎγ™γ€‚

componentDidMount γ‚’οΏ½?οΏ½θ£…γ™γ‚‹ε ΄εˆγ€ι€šεΈΈγ―γƒγ‚°γ‚’ιΏγ‘γ‚‹γŸγ‚γ«δ»–οΏ½?ラむファむクルパソッドも�?οΏ½θ£…γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚δΎ‹γˆγ°γ€componentDidMount γŒδ½•γ‚‰γ‹οΏ½? state γ‚„ props γ‚’θͺ­γΏε–γ‚‹ε ΄εˆγ―γγ‚Œγ‚‰γ«ε€‰ζ›΄γŒγ‚γ£γŸε ΄εˆγ«ε‡¦η†γ™γ‚‹γŸγ‚γ« componentDidUpdate γ‚’οΏ½?οΏ½θ£…γ™γ‚‹εΏ…θ¦γŒγ‚γ‚Šγ€componentDidMount が�?οΏ½θ‘Œγ—γŸγ“γ¨γ‚’γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γ™γ‚‹γŸγ‚γ«γ― componentWillUnmount γ‚’οΏ½?οΏ½θ£…γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

class ChatRoom extends Component {
state = {
serverUrl: 'https://localhost:1234'
};

componentDidMount() {
this.setupConnection();
}

componentDidUpdate(prevProps, prevState) {
if (
this.props.roomId !== prevProps.roomId ||
this.state.serverUrl !== prevState.serverUrl
) {
this.destroyConnection();
this.setupConnection();
}
}

componentWillUnmount() {
this.destroyConnection();
}

// ...
}

δ»–οΏ½?例を見る

εΌ•ζ•°

componentDidMount γ―εΌ•ζ•°γ‚’ε—γ‘ε–γ‚ŠγΎγ›γ‚“γ€‚

θΏ”γ‚Šε€€

componentDidMount は何も返してはいけません。

注意点

  • Strict Mode がγ‚ͺン�?ε ΄εˆγ€React は開発中に componentDidMount γ‚’ε‘Όγ³ε‡Ίγ—γ€η›΄εΎŒγ« componentWillUnmount を呼び出し、そして再度 componentDidMount γ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€componentWillUnmount οΏ½?οΏ½?οΏ½θ£…γ‚’εΏ˜γ‚ŒγŸε ΄εˆγ‚„γ€γοΏ½?γƒ­γ‚Έγƒƒγ‚―γŒ componentDidMount οΏ½?ζŒ™ε‹•γ¨ζ­£γ—γγ€Œι‘οΏ½?γ‚ˆγ†γ«ε―ΎεΏœγ€γ—γ¦γ„γͺγ„ε ΄εˆγ«ζ°—γ₯きやすくγͺγ‚ŠγΎγ™γ€‚

  • componentDidMount οΏ½?中で直けに setState γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ―ε―θƒ½γ§γ™γŒγ€ε―θƒ½γͺι™γ‚ŠιΏγ‘γ‚‹γΉγγ§γ™γ€‚γ“γ‚Œγ―θΏ½εŠ οΏ½?γƒ¬γƒ³γƒ€γƒΌγ‚’εΌ•γθ΅·γ“γ—γΎγ™γŒγ€γƒ–γƒ©γ‚¦γ‚ΆγŒη”»ι’γ‚’ζ›΄ζ–°γ™γ‚‹ε‰γ«η™Ίη”Ÿγ—γΎγ™γ€‚γ“οΏ½?γŸγ‚γ€γ“οΏ½?ケースでは render が 2 ε›žε‘Όγ³ε‡Ίγ•γ‚Œγ―γ—γΎγ™γŒγ€γƒ¦γƒΌγ‚Άγ―δΈ­ι€”εŠη«―γͺ state γ‚’θ¦‹γšγ«ζΈˆγΏγΎγ™γ€‚γ“οΏ½?γƒ‘γ‚ΏγƒΌγƒ³γ―γ—γ°γ—γ°γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚ΉοΏ½?ε•ι‘Œγ‚’εΌ•γθ΅·γ“γ™γŸγ‚γ€ζ³¨ζ„γ—γ¦δ½Ώη”¨γ—γ¦γγ γ•γ„γ€‚γ»γ¨γ‚“γ©οΏ½?ε ΄εˆγ€εˆζœŸ state γ‚’ constructor で代ε…₯γ§γγ‚‹γ―γšγ§γ™γ€‚γŸγ γ—γ€γƒ’γƒΌγƒ€γƒ«γ‚„γƒ„γƒΌγƒ«γƒγƒƒγƒ—οΏ½?γ‚ˆγ†γͺε ΄εˆγ―γ€δ½•γ‚‰γ‹οΏ½? DOM γƒŽγƒΌγƒ‰οΏ½?位�?γ‚„γ‚΅γ‚€γ‚Ίγ«δΎε­˜γ™γ‚‹θ¦η΄ γ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹οΏ½?に DOM γƒŽγƒΌγƒ‰οΏ½?ζΈ¬οΏ½?οΏ½γ‚’θ‘Œγ†γŸγ‚γ€γ“γ‚ŒγŒεΏ…θ¦γ«γͺγ‚‹γ“γ¨γŒγ‚γ‚ŠγΎγ™γ€‚

補袳

倚く�?γƒ¦γƒΌγ‚Ήγ‚±γƒΌγ‚Ήγ«γŠγ„γ¦γ€γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ componentDidMount、componentDidUpdate、componentWillUnmount をまとめて�?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ useEffect γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ¨εŒη­‰γ§γ™γ€‚γƒ–γƒ©γ‚¦γ‚ΆοΏ½?描画前にコードを�?οΏ½θ‘Œγ™γ‚‹γ“γ¨γŒι‡θ¦γ¨γͺる稀γͺケースでは、useLayoutEffect γŒγ‚ˆγ‚ŠθΏ‘γ„γ‚‚οΏ½?にγͺγ‚ŠγΎγ™γ€‚

η§»θ‘Œζ–Ήζ³•γ‚’θ¦‹γ‚‹


componentDidUpdate(prevProps, prevState, snapshot?)

componentDidUpdate パソッドを�?οΏ½ηΎ©γ™γ‚‹γ¨γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζ›΄ζ–°εΎŒοΏ½? props γ‚„ state γ§ε†γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸη›΄εΎŒγ« React γŒγγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“οΏ½?γƒ‘γ‚½γƒƒγƒ‰γ―εˆε›žγƒ¬γƒ³γƒ€γƒΌγ§γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

ζ›΄ζ–°εΎŒγ« DOM γ‚’ζ“δ½œγ™γ‚‹γŸγ‚γ«γ“γ‚Œγ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γ“γ‚Œγ―γΎγŸγ€γƒγƒƒγƒˆγƒ―γƒΌγ‚―γƒͺγ‚―γ‚¨γ‚Ήγƒˆγ‚’θ‘Œγ†δΈ€θˆ¬ηš„γͺε ΄ζ‰€γ§γ‚‚γ‚γ‚ŠγΎγ™γŒγ€ηΎεœ¨οΏ½? props を前�? props γ¨ζ―”θΌƒγ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™οΌˆδΎ‹γˆγ° props γŒε€‰ζ›΄γ•γ‚Œγ¦γ„γͺγ„ε ΄εˆγ€ζ–°γ—γ„γƒγƒƒγƒˆγƒ―γƒΌγ‚―γƒͺγ‚―γ‚¨γ‚Ήγƒˆγ―εΏ…θ¦γͺγ„γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“οΌ‰γ€‚ι€šεΈΈγ€componentDidMount γ‚„ componentWillUnmount と一緒に使用します。

class ChatRoom extends Component {
state = {
serverUrl: 'https://localhost:1234'
};

componentDidMount() {
this.setupConnection();
}

componentDidUpdate(prevProps, prevState) {
if (
this.props.roomId !== prevProps.roomId ||
this.state.serverUrl !== prevState.serverUrl
) {
this.destroyConnection();
this.setupConnection();
}
}

componentWillUnmount() {
this.destroyConnection();
}

// ...
}

δ»–οΏ½?例を見る

εΌ•ζ•°

  • prevProps: 更新前�? props。prevProps と this.props γ‚’ζ―”θΌƒγ—γ¦δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ—γΎγ™γ€‚

  • prevState: 更新前�? state。prevState と this.state γ‚’ζ―”θΌƒγ—γ¦δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ—γΎγ™γ€‚

  • snapshot: getSnapshotBeforeUpdate γ‚’οΏ½?οΏ½θ£…γ—γŸε ΄εˆγ€snapshot にはそ�?γƒ‘γ‚½γƒƒγƒ‰γ‹γ‚‰θΏ”γ•γ‚ŒγŸε€€γŒε«γΎγ‚ŒγΎγ™γ€‚γγ‚Œδ»₯ε€–οΏ½?場合は undefined にγͺγ‚ŠγΎγ™γ€‚

θΏ”γ‚Šε€€

componentDidUpdate は何も返してはいけません。

注意点

  • shouldComponentUpdate が�?οΏ½ηΎ©γ•γ‚Œγ¦γŠγ‚Šγ€γγ‚ŒγŒ false γ‚’θΏ”γ™ε ΄εˆγ€componentDidUpdate γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

  • componentDidUpdate ε†…οΏ½?γƒ­γ‚Έγƒƒγ‚―γ―ι€šεΈΈγ€this.props と prevProps、this.state と prevState γ‚’ζ―”θΌƒγ™γ‚‹ζ‘δ»Άζ–‡γ§γƒ©γƒƒγƒ—γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γγ†γ§γͺγ‘γ‚Œγ°γ€η„‘ι™γƒ«γƒΌγƒ—γ‚’δ½œγ‚Šε‡Ίγ™γƒͺγ‚Ήγ‚―γŒγ‚γ‚ŠγΎγ™γ€‚

  • componentDidUpdate οΏ½?中で直けに setState γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ―ε―θƒ½γ§γ™γŒγ€ε―θƒ½γͺι™γ‚ŠιΏγ‘γ‚‹γΉγγ§γ™γ€‚γ“γ‚Œγ―θΏ½εŠ οΏ½?γƒ¬γƒ³γƒ€γƒΌγ‚’εΌ•γθ΅·γ“γ—γΎγ™γŒγ€γƒ–γƒ©γ‚¦γ‚ΆγŒη”»ι’γ‚’ζ›΄ζ–°γ™γ‚‹ε‰γ«η™Ίη”Ÿγ—γΎγ™γ€‚γ“οΏ½?γŸγ‚γ€γ“οΏ½?ケースでは render が 2 ε›žε‘Όγ³ε‡Ίγ•γ‚Œγ―γ—γΎγ™γŒγ€γƒ¦γƒΌγ‚Άγ―δΈ­ι€”εŠη«―γͺ state γ‚’θ¦‹γšγ«ζΈˆγΏγΎγ™γ€‚γ“οΏ½?γƒ‘γ‚ΏγƒΌγƒ³γ―γ—γ°γ—γ°γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚ΉοΏ½?ε•ι‘Œγ‚’εΌ•γθ΅·γ“γ—γΎγ™γ€‚γŸγ γ—γ€γƒ’γƒΌγƒ€γƒ«γ‚„γƒ„γƒΌγƒ«γƒγƒƒγƒ—οΏ½?γ‚ˆγ†γͺレをγͺケースでは、何らか�? DOM γƒŽγƒΌγƒ‰οΏ½?位�?γ‚„γ‚΅γ‚€γ‚Ίγ«δΎε­˜γ™γ‚‹θ¦η΄ γ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹οΏ½?に DOM γƒŽγƒΌγƒ‰οΏ½?ζΈ¬οΏ½?οΏ½γ‚’θ‘Œγ†γŸγ‚γ€γ“γ‚ŒγŒεΏ…θ¦γ«γͺγ‚‹γ“γ¨γŒγ‚γ‚ŠγΎγ™γ€‚

補袳

倚く�?γƒ¦γƒΌγ‚Ήγ‚±γƒΌγ‚Ήγ«γŠγ„γ¦γ€γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ componentDidMount、componentDidUpdate、componentWillUnmount をまとめて�?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ useEffect γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ¨εŒη­‰γ§γ™γ€‚γƒ–γƒ©γ‚¦γ‚ΆοΏ½?描画前にコードを�?οΏ½θ‘Œγ™γ‚‹γ“γ¨γŒι‡θ¦γ¨γͺる稀γͺケースでは、useLayoutEffect γŒγ‚ˆγ‚ŠθΏ‘γ„γ‚‚οΏ½?にγͺγ‚ŠγΎγ™γ€‚

η§»θ‘Œζ–Ήζ³•γ‚’θ¦‹γ‚‹


componentWillMount()

Deprecated

こ�? API は componentWillMount から UNSAFE_componentWillMount γ«εε‰γŒε€‰ζ›΄γ•γ‚ŒγΎγ—γŸγ€‚ε€γ„εε‰γ―ιžζŽ¨ε₯¨γ¨γͺγ‚ŠγΎγ—γŸγ€‚React οΏ½?ε°†ζ₯οΏ½?パジャーバージョンでは、新しい名前�?γΏγŒζ©Ÿθƒ½γ—γΎγ™γ€‚

θ‡ͺε‹•ηš„γ«γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ζ›΄ζ–°γ™γ‚‹γ«γ― rename-unsafe-lifecycles codemod γ‚’οΏ½?οΏ½θ‘Œγ—γ¦γγ γ•γ„γ€‚


componentWillReceiveProps(nextProps)

Deprecated

こ�? API は componentWillReceiveProps から UNSAFE_componentWillReceiveProps γ«εε‰γŒε€‰ζ›΄γ•γ‚ŒγΎγ—γŸγ€‚ε€γ„εε‰γ―ιžζŽ¨ε₯¨γ¨γͺγ‚ŠγΎγ—γŸγ€‚React οΏ½?ε°†ζ₯οΏ½?パジャーバージョンでは、新しい名前�?γΏγŒζ©Ÿθƒ½γ—γΎγ™γ€‚

θ‡ͺε‹•ηš„γ«γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ζ›΄ζ–°γ™γ‚‹γ«γ― rename-unsafe-lifecycles codemod γ‚’οΏ½?οΏ½θ‘Œγ—γ¦γγ γ•γ„γ€‚


componentWillUpdate(nextProps, nextState)

Deprecated

こ�? API は componentWillUpdate から UNSAFE_componentWillUpdate γ«εε‰γŒε€‰ζ›΄γ•γ‚ŒγΎγ—γŸγ€‚ε€γ„εε‰γ―ιžζŽ¨ε₯¨γ¨γͺγ‚ŠγΎγ—γŸγ€‚React οΏ½?ε°†ζ₯οΏ½?パジャーバージョンでは、新しい名前�?γΏγŒζ©Ÿθƒ½γ—γΎγ™γ€‚

θ‡ͺε‹•ηš„γ«γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ζ›΄ζ–°γ™γ‚‹γ«γ― rename-unsafe-lifecycles codemod γ‚’οΏ½?οΏ½θ‘Œγ—γ¦γγ γ•γ„γ€‚


componentWillUnmount()

componentWillUnmount パソッドを�?�義すると、React γ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒη”»ι’γ‹γ‚‰ε‰Šι™€οΌˆγ‚’γƒ³γƒžγ‚¦γƒ³γƒˆοΌ‰γ•γ‚Œγ‚‹ε‰γ«γ“γ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ“γŒγƒ‡γƒΌγ‚ΏοΏ½?ε–εΎ—γ‚’γ‚­γƒ£γƒ³γ‚»γƒ«γ—γŸγ‚Šγ€γ‚΅γƒ–γ‚Ήγ‚―γƒͺγƒ—γ‚·γƒ§γƒ³γ‚’ε‰Šι™€γ™γ‚‹οΏ½?γ«δΈ€θˆ¬ηš„γͺ場所です。

componentWillUnmount ε†…οΏ½?ロジックは componentDidMount ε†…οΏ½?γƒ­γ‚Έγƒƒγ‚―γ¨γ€Œι‘οΏ½?γ‚ˆγ†γ«ε―ΎεΏœγ€γ™γ‚‹γΉγγ§γ™γ€‚δΎ‹γˆγ°γ€componentDidMount γŒγ‚΅γƒ–γ‚Ήγ‚―γƒͺプション�?θ¨­οΏ½?οΏ½γ‚’θ‘Œγ†ε ΄εˆγ€componentWillUnmount はそ�?γ‚΅γƒ–γ‚Ήγ‚―γƒͺプションをクγƒͺーンをップするべきです。componentWillUnmount οΏ½?γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γƒ­γ‚Έγƒƒγ‚―γŒ props γ‚„ state γ‚’θͺ­γΏε–γ‚‹ε ΄εˆγ€ι€šεΈΈγ―叀い props と state γ«ε―ΎεΏœγ™γ‚‹γƒͺγ‚½γƒΌγ‚ΉοΌˆγ‚΅γƒ–γ‚Ήγ‚―γƒͺプションγͺど)をクγƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γ™γ‚‹γŸγ‚γ« componentDidUpdate γ‚‚οΏ½?οΏ½θ£…γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

class ChatRoom extends Component {
state = {
serverUrl: 'https://localhost:1234'
};

componentDidMount() {
this.setupConnection();
}

componentDidUpdate(prevProps, prevState) {
if (
this.props.roomId !== prevProps.roomId ||
this.state.serverUrl !== prevState.serverUrl
) {
this.destroyConnection();
this.setupConnection();
}
}

componentWillUnmount() {
this.destroyConnection();
}

// ...
}

δ»–οΏ½?例を見る

εΌ•ζ•°

componentWillUnmount γ―εΌ•ζ•°γ‚’ε—γ‘ε–γ‚ŠγΎγ›γ‚“γ€‚

θΏ”γ‚Šε€€

componentWillUnmount は何も返してはいけません。

注意点

  • Strict Mode がγ‚ͺン�?ε ΄εˆγ€React は開発中に componentDidMount γ‚’ε‘Όγ³ε‡Ίγ—γ€η›΄εΎŒγ« componentWillUnmount を呼び出し、そして再度 componentDidMount γ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€componentWillUnmount οΏ½?οΏ½?οΏ½θ£…γ‚’εΏ˜γ‚ŒγŸε ΄εˆγ‚„γ€γοΏ½?γƒ­γ‚Έγƒƒγ‚―γŒ componentDidMount οΏ½?ζŒ™ε‹•γ¨ζ­£γ—γγ€Œι‘οΏ½?γ‚ˆγ†γ«ε―ΎεΏœγ€γ—γ¦γ„γͺγ„ε ΄εˆγ«ζ°—γ₯きやすくγͺγ‚ŠγΎγ™γ€‚

補袳

倚く�?γƒ¦γƒΌγ‚Ήγ‚±γƒΌγ‚Ήγ«γŠγ„γ¦γ€γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ componentDidMount、componentDidUpdate、componentWillUnmount をまとめて�?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ useEffect γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ¨εŒη­‰γ§γ™γ€‚γƒ–γƒ©γ‚¦γ‚ΆοΏ½?描画前にコードを�?οΏ½θ‘Œγ™γ‚‹γ“γ¨γŒι‡θ¦γ¨γͺる稀γͺケースでは、useLayoutEffect γŒγ‚ˆγ‚ŠθΏ‘γ„γ‚‚οΏ½?にγͺγ‚ŠγΎγ™γ€‚

η§»θ‘Œζ–Ήζ³•γ‚’θ¦‹γ‚‹


forceUpdate(callback?)

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’εΌ·εˆΆηš„γ«ε†γƒ¬γƒ³γƒ€γƒΌγ—γΎγ™γ€‚

ι€šεΈΈγ€γ“γ‚Œγ―εΏ…θ¦γ‚γ‚ŠγΎγ›γ‚“γ€‚γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? render γƒ‘γ‚½γƒƒγƒ‰γŒ this.props、this.state γŠγ‚ˆγ³ this.context から�?みθͺ­γΏε–γ‚Šγ‚’θ‘Œγ†ε ΄εˆγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆε†…γΎγŸγ―そ�?θ¦ͺで setState γŒε‘Όγ³ε‡Ίγ•γ‚Œγ‚‹γ¨θ‡ͺε‹•ηš„γ«ε†γƒ¬γƒ³γƒ€γƒΌγŒη™Ίη”Ÿγ—γΎγ™γ€‚γ—γ‹γ—γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? render γƒ‘γ‚½γƒƒγƒ‰γŒε€–ιƒ¨γƒ‡γƒΌγ‚Ώγ‚½γƒΌγ‚Ήγ‹γ‚‰η›΄ζŽ₯θͺ­γΏε–γ‚Šγ‚’θ‘Œγ£γ¦γ„γ‚‹ε ΄εˆγ€γοΏ½?γƒ‡γƒΌγ‚Ώγ‚½γƒΌγ‚ΉγŒε€‰ζ›΄γ•γ‚ŒγŸγ¨γγ« React γ«γƒ¦γƒΌγ‚Άγ‚€γƒ³γ‚ΏγƒΌγƒ•γ‚§γƒΌγ‚Ήγ‚’ζ›΄ζ–°γ™γ‚‹γ‚ˆγ†γ«ζŒ‡η€Ίγ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚forceUpdate γ―γγ‚Œγ‚’θ‘Œγˆγ‚‹γ‚ˆγ†γ«γ™γ‚‹γŸγ‚οΏ½?γ‚‚οΏ½?です。

あらゆる forceUpdate οΏ½?使用は避け、render 内では this.props と this.state から�?みθͺ­γΏε–γ‚‹γ‚ˆγ†γ«γ—γ¦γγ γ•γ„γ€‚

εΌ•ζ•°

  • 省η•₯可能 callback: ζŒ‡οΏ½?οΏ½γ•γ‚ŒγŸε ΄εˆγ€React γ―ζ›΄ζ–°γŒγ‚³γƒŸγƒƒγƒˆγ•γ‚ŒγŸεΎŒγ«γ€ζΈ‘γ•γ‚ŒγŸ callback を呼び出します。

θΏ”γ‚Šε€€

forceUpdate は何も返しません。

注意点

  • forceUpdate を呼び出すと、React は shouldComponentUpdate γ‚’ε‘Όγ³ε‡Ίγ•γšγ«ε†γƒ¬γƒ³γƒ€γƒΌγ—γΎγ™γ€‚

補袳

倖部データソースをθͺ­γΏθΎΌγ‚“γ§ε€‰ζ›΄γ«εΏœγ˜γ¦ forceUpdate γ§γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ε†γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹δ»£γ‚γ‚Šγ«γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γŠγ„γ¦γ― useSyncExternalStore γ‚’δ½Ώγ†γ‚ˆγ†γ«γͺγ‚ŠγΎγ—γŸγ€‚


getChildContext()

Deprecated

こ�? API は、React οΏ½?ε°†ζ₯οΏ½?γƒ‘γ‚Έγƒ£γƒΌγƒγƒΌγ‚Έγƒ§γƒ³γ§ε‰Šι™€γ•γ‚ŒγΎγ™γ€‚δ»£γ‚γ‚Šγ« Context.Provider を使用してください。

こ�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζδΎ›γ™γ‚‹γƒ¬γ‚¬γ‚·γƒΌγ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?ε€€γ‚’ζŒ‡οΏ½?�します。


getSnapshotBeforeUpdate(prevProps, prevState)

getSnapshotBeforeUpdate γ‚’οΏ½?�装すると、React は DOM γ‚’ζ›΄ζ–°γ™γ‚‹η›΄ε‰γ«γγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ― DOM γ‹γ‚‰ζƒ…ε ±οΌˆδΎ‹γˆγ°γ‚Ήγ‚―γƒ­γƒΌγƒ«δ½οΏ½?οΌ‰γ‚’ε–εΎ—γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γ“οΏ½?γƒ©γ‚€γƒ•γ‚΅γ‚€γ‚―γƒ«γƒ‘γ‚½γƒƒγƒ‰γŒθΏ”γ™γ‚γ‚‰γ‚†γ‚‹ε€€γ―γ€componentDidUpdate γ«εΌ•ζ•°γ¨γ—γ¦ζΈ‘γ•γ‚ŒγΎγ™γ€‚

δΎ‹γˆγ°γ€ζ›΄ζ–°ι–“γ§γ‚Ήγ‚―γƒ­γƒΌγƒ«δ½οΏ½?γ‚’δΏζŒγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹γƒγƒ£γƒƒγƒˆγ‚Ήγƒ¬γƒƒγƒ‰οΏ½?γ‚ˆγ†γͺ UI γ§γ“γ‚Œγ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

class ScrollingList extends React.Component {
constructor(props) {
super(props);
this.listRef = React.createRef();
}

getSnapshotBeforeUpdate(prevProps, prevState) {
// Are we adding new items to the list?
// Capture the scroll position so we can adjust scroll later.
if (prevProps.list.length < this.props.list.length) {
const list = this.listRef.current;
return list.scrollHeight - list.scrollTop;
}
return null;
}

componentDidUpdate(prevProps, prevState, snapshot) {
// If we have a snapshot value, we've just added new items.
// Adjust scroll so these new items don't push the old ones out of view.
// (snapshot here is the value returned from getSnapshotBeforeUpdate)
if (snapshot !== null) {
const list = this.listRef.current;
list.scrollTop = list.scrollHeight - snapshot;
}
}

render() {
return (
<div ref={this.listRef}>{/* ...contents... */}</div>
);
}
}

上記�?例では、getSnapshotBeforeUpdate で直ζŽ₯ scrollHeight プロパティをθͺ­γΏε–γ‚‹γ“γ¨γŒι‡θ¦γ§γ™γ€‚render、UNSAFE_componentWillReceivePropsγ€γΎγŸγ― UNSAFE_componentWillUpdate でθͺ­γΏε–ることは�?οΏ½ε…¨γ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚γ“γ‚Œγ‚‰οΏ½?γƒ‘γ‚½γƒƒγƒ‰γŒε‘Όγ³ε‡Ίγ•γ‚Œγ¦γ‹γ‚‰ React が DOM を更新するまでに時間�?γŒγ‚γ‚‹ε―θƒ½ζ€§γŒγ‚γ‚‹γŸγ‚γ§γ™γ€‚

εΌ•ζ•°

  • prevProps: 更新前�? props。prevProps と this.props γ‚’ζ―”θΌƒγ—γ¦δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ—γΎγ™γ€‚

  • prevState: 更新前�? state。prevState と this.state γ‚’ζ―”θΌƒγ—γ¦δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ—γΎγ™γ€‚

θΏ”γ‚Šε€€

任意�?εž‹οΏ½?γ‚ΉγƒŠγƒƒγƒ—γ‚·γƒ§γƒƒγƒˆε€€γ€γΎγŸγ― null γ‚’θΏ”γ—γ¦γγ γ•γ„γ€‚θΏ”γ—γŸε€€γ―γ€componentDidUpdate οΏ½?第 3 εΌ•ζ•°γ¨γ—γ¦ζΈ‘γ•γ‚ŒγΎγ™γ€‚

注意点

  • shouldComponentUpdate が�?οΏ½ηΎ©γ•γ‚Œγ¦γŠγ‚Šγ€false γ‚’θΏ”γ™ε ΄εˆγ€getSnapshotBeforeUpdate γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

補袳

ηΎζ™‚η‚Ήγ§γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ― getSnapshotBeforeUpdate γ¨εŒη­‰οΏ½?γ‚‚οΏ½?γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚γ“οΏ½?γƒ¦γƒΌγ‚Ήγ‚±γƒΌγ‚Ήγ―ιžεΈΈγ«ηγ—γ„γ‚‚οΏ½?γ§γ™γŒγ€γ“γ‚ŒγŒγ©γ†γ—γ¦γ‚‚εΏ…θ¦γͺε ΄εˆγ€ηΎζ™‚η‚Ήγ§γ―γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ζ›ΈγεΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚


render()

render γƒ‘γ‚½γƒƒγƒ‰γ―γ€γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γŠγ‘γ‚‹ε”―δΈ€οΏ½?εΏ…ι ˆγƒ‘γ‚½γƒƒγƒ‰γ§γ™γ€‚

render γƒ‘γ‚½γƒƒγƒ‰γ―γ€η”»ι’γ«θ‘¨η€Ίγ—γŸγ„γ‚‚οΏ½?γ‚’ζŒ‡οΏ½?οΏ½γ—γΎγ™γ€‚δΎ‹γˆγ°οΌš

import { Component } from 'react';

class Greeting extends Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}

React γ―γ‚γ‚‰γ‚†γ‚‹γ‚Ώγ‚€γƒŸγƒ³γ‚°γ§ render γ‚’ε‘Όγ³ε‡Ίγ™ε―θƒ½ζ€§γŒγ‚γ‚‹γŸγ‚γ€η‰ΉοΏ½?οΏ½οΏ½?時間に�?οΏ½θ‘Œγ•γ‚Œγ‚‹γ“γ¨γ‚’ε‰ζγ«γ—γ¦γ―γ„γ‘γΎγ›γ‚“γ€‚ι€šεΈΈγ€render パソッドは JSX γ‚’θΏ”γ™γΉγγ§γ™γŒγ€γ„γγ€γ‹οΏ½?δ»–οΏ½?εž‹οΏ½?θΏ”γ‚Šε€€οΌˆζ–‡ε­—εˆ—γͺγ©οΌ‰γ‚‚γ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γΎγ™γ€‚θΏ”γ™γΉγ JSX γ‚’θ¨ˆοΏ½?οΏ½γ™γ‚‹γŸγ‚γ«γ€render パソッドは this.props、this.stateγ€γŠγ‚ˆγ³ this.context γ‚’θͺ­γΏε–γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

render γƒ‘γ‚½γƒƒγƒ‰γ―η΄”ι–’ζ•°γ¨γ—γ¦ζ›ΈγγΉγγ§γ™γ€‚γ€γΎγ‚Šγ€props、stateγ€γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆγŒεŒγ˜γ§γ‚γ‚Œγ°εŒγ˜η΅ζžœγ‚’θΏ”γ™γΉγγ§γ™γ€‚γΎγŸγ€ε‰―δ½œη”¨οΌˆγ‚΅γƒ–γ‚Ήγ‚―γƒͺプション�?θ¨­οΏ½?οΏ½γͺγ©οΌ‰γ‚’ε«γ‚“γ γ‚Šγ€γƒ–γƒ©γ‚¦γ‚ΆοΏ½? API γ¨γ‚„γ‚Šε–γ‚Šγ—γŸγ‚Šγ™γ‚‹γΉγγ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚ε‰―δ½œη”¨γ―γ€γ‚€γƒ™γƒ³γƒˆγƒγƒ³γƒ‰γƒ©γ‚„ componentDidMount οΏ½?γ‚ˆγ†γͺγƒ‘γ‚½γƒƒγƒ‰ε†…γ§θ‘Œγ†γΉγγ§γ™γ€‚

εΌ•ζ•°

render γ―εΌ•ζ•°γ‚’ε—γ‘ε–γ‚ŠγΎγ›γ‚“γ€‚

θΏ”γ‚Šε€€

render γ―γ‚γ‚‰γ‚†γ‚‹ζœ‰εŠΉγͺ React γƒŽγƒΌγƒ‰γ‚’θΏ”γ™γ“γ¨γŒγ§γγΎγ™γ€‚γ“γ‚Œγ«γ―γ€<div /> οΏ½?γ‚ˆγ†γͺ React θ¦η΄ γ€ζ–‡ε­—εˆ—γ€ζ•°ε€€γ€γƒγƒΌγ‚Ώγƒ«γ€η©ΊοΏ½?γƒŽγƒΌγƒ‰οΌˆnull、undefined、true、falseοΌ‰γ€γŠγ‚ˆγ³ React γƒŽγƒΌγƒ‰οΏ½?ι…εˆ—γŒε«γΎγ‚ŒγΎγ™γ€‚

注意点

  • render は props、stateγ€γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ«ε―Ύγ™γ‚‹η΄”ι–’ζ•°γ¨γ—γ¦ζ›ΈγγΉγγ§γ™γ€‚ε‰―δ½œη”¨γ‚’ζŒγ£γ¦γ―γ„γ‘γΎγ›γ‚“γ€‚

  • shouldComponentUpdate が�?οΏ½ηΎ©γ•γ‚Œγ¦γŠγ‚Š false γ‚’θΏ”γ™ε ΄εˆγ€render γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

  • Strict Mode γŒζœ‰εŠΉοΏ½?ε ΄εˆγ€React は開発中に render γ‚’ 2 ε›žε‘Όγ³ε‡Ίγ—γ€γοΏ½?うけ�? 1 ぀�?η΅ζžœγ‚’η ΄ζ£„γ—γΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€render パソッド�?ε€–γ«η§»ε‹•γ™γ‚‹γΉγεΆη™Ίηš„γͺε‰―δ½œη”¨γ«ζ°—γ₯きやすくγͺγ‚ŠγΎγ™γ€‚

  • render οΏ½?呼び出しとそ�?後�? componentDidMount γ‚„ componentDidUpdate οΏ½?呼び出しと�?間に一対一�?ε―ΎεΏœι–’δΏ‚γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚React γŒεΏ…θ¦γ¨εˆ€ζ–­γ—γŸε ΄εˆγ€render οΏ½?ε‘Όγ³ε‡Ίγ—η΅ζžœοΏ½?δΈ€ιƒ¨γ―η ΄ζ£„γ•γ‚Œγ‚‹ε―θƒ½ζ€§γŒγ‚γ‚ŠγΎγ™γ€‚


setState(nextState, callback?)

setState οΏ½?呼び出しは React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? state οΏ½?ζ›΄ζ–°γ‚’θ‘Œγ„γΎγ™γ€‚

class Form extends Component {
state = {
name: 'Taylor',
};

handleNameChange = (e) => {
const newName = e.target.value;
this.setState({
name: newName
});
}

render() {
return (
<>
<input value={this.state.name} onChange={this.handleNameChange} />
<p>Hello, {this.state.name}.</p>
</>
);
}
}

setState γ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? state へ�?ζ›΄ζ–°γ‚’γ‚­γƒ₯ーにε…₯γ‚ŒγΎγ™γ€‚γ“γ‚Œγ―γ€γ“οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ¨γοΏ½?子を新しい state γ§ε†γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹γ“γ¨γ‚’ React γ«δΌγˆγΎγ™γ€‚γ“γ‚ŒγŒγ€γƒ¦γƒΌγ‚Άζ“δ½œγ«ε―ΎεΏœγ—γ¦γƒ¦γƒΌγ‚Άγ‚€γƒ³γ‚ΏγƒΌγƒ•γ‚§γƒΌγ‚Ήγ‚’ζ›΄ζ–°γ™γ‚‹γŸγ‚οΏ½?主要γͺ方法とγͺγ‚ŠγΎγ™γ€‚

落とし穴

setState を呼び出しても、すでに�?�葌中�?コード�?現在�? state γ―ε€‰ζ›΄γ•γ‚ŒγΎγ›γ‚“γ€‚

function handleClick() {
console.log(this.state.name); // "Taylor"
this.setState({
name: 'Robin'
});
console.log(this.state.name); // Still "Taylor"!
}

γ“γ‚Œγ―γ€ζ¬‘ε›žοΏ½?レンダーから this.state γŒθΏ”γ™γ‚‚οΏ½?に�?γΏε½±ιŸΏγ—γΎγ™γ€‚

γΎγŸγ€setState γ«ι–’ζ•°γ‚’ζΈ‘γ™γ“γ¨γ‚‚γ§γγΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€ε‰οΏ½? state に基γ₯いて state γ‚’ζ›΄ζ–°γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

handleIncreaseAge = () => {
this.setState(prevState => {
return {
age: prevState.age + 1
};
});
}

γ“γ†γ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹γ‚γ‘γ§γ―γ‚γ‚ŠγΎγ›γ‚“γŒγ€εŒγ˜γ‚€γƒ™γƒ³γƒˆδΈ­γ«θ€‡ζ•°ε›ž state γ‚’ζ›΄ζ–°γ—γŸγ„ε ΄εˆγ«γ―ζœ‰η”¨γ§γ™γ€‚

εΌ•ζ•°

  • nextState:γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγΎγŸγ―ι–’ζ•°γ€‚

    • nextState としてγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’ζΈ‘γ™γ¨γ€γγ‚Œγ― this.state に桅く (shallow) γƒžγƒΌγ‚Έγ•γ‚ŒγΎγ™γ€‚
    • nextState γ¨γ—γ¦ι–’ζ•°γ‚’ζΈ‘γ™γ¨γ€γγ‚Œγ―ζ›΄ζ–°η”¨ι–’ζ•° (updater function) γ¨γ—γ¦ζ‰±γ‚γ‚ŒγΎγ™γ€‚γοΏ½?閒数は純閒数でγͺγ‘γ‚Œγ°γͺγ‚‰γšγ€state と props οΏ½?ηΎεœ¨ε€€γ‚’εΌ•ζ•°γ¨γ—γ¦ε–γ‚Šγ€this.state γ«ζ΅…γγƒžγƒΌγ‚Έγ•γ‚Œγ‚‹γŸγ‚οΏ½?γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚React はこ�?更新用閒数をキγƒ₯ーにε…₯γ‚Œγ¦γ‹γ‚‰γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ε†γƒ¬γƒ³γƒ€γƒΌγ—γΎγ™γ€‚ζ¬‘οΏ½?レンダー中に、React は前�? state に対してキγƒ₯ーにε…₯γ‚Œγ‚‰γ‚ŒγŸγ™γΉγ¦οΏ½?ζ›΄ζ–°η”¨ι–’ζ•°γ‚’ι©η”¨γ—γ€ζ¬‘ε›žοΏ½? state γ‚’θ¨ˆοΏ½?�します。
  • 省η•₯可能 callback: ζŒ‡οΏ½?οΏ½γ•γ‚ŒγŸε ΄εˆγ€React γ―ζ›΄ζ–°γŒγ‚³γƒŸγƒƒγƒˆγ•γ‚ŒγŸεΎŒγ«ζΈ‘γ•γ‚ŒγŸ callback を呼び出します。

θΏ”γ‚Šε€€

setState は何も返しません。

注意点

  • setState γ―ε³ζ™‚ηš„γͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?更新命什ではγͺく、γƒͺγ‚―γ‚¨γ‚Ήγƒˆγ γ¨θ€ƒγˆγ¦γγ γ•γ„γ€‚θ€‡ζ•°οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγ‚€γƒ™γƒ³γƒˆγ«εΏœγ˜γ¦ state を更新するとき、React γ―γγ‚Œγ‚‰οΏ½?ζ›΄ζ–°γ‚’γƒγƒƒγƒοΌˆζŸγ­οΌ‰ε‡¦η†γ—γ€γ‚€γƒ™γƒ³γƒˆοΏ½?硂了時に 1 度だけ再レンダーします。特�?οΏ½οΏ½? state ζ›΄ζ–°γ‚’εΌ·εˆΆηš„γ«εŒζœŸηš„γ«ι©η”¨γ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹η¨€γͺケースでは、flushSync γ§γƒ©γƒƒγƒ—γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γŒγ€γ“γ‚Œγ―γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚Ήγ‚’δ½ŽδΈ‹γ•γ›γ‚‹ε―θƒ½ζ€§γŒγ‚γ‚ŠγΎγ™γ€‚

  • setState は this.state を即時に更新しません。こ�?γŸγ‚γ€setState γ‚’ε‘Όγ³ε‡Ίγ—γŸη›΄εΎŒγ« this.state γ‚’θͺ­γΏε–γ‚‹γ“γ¨γ―ζ½œεœ¨ηš„γͺ落とし穴とγͺγ‚ŠγΎγ™γ€‚δ»£γ‚γ‚Šγ«γ€componentDidUpdate または setState οΏ½? callback εΌ•ζ•°γ‚’δ½Ώη”¨γ—γ¦γγ γ•γ„γ€‚γ©γ‘γ‚‰γ‚‚ζ›΄ζ–°γŒι©η”¨γ•γ‚ŒγŸεΎŒγ«η™Ίη«γ™γ‚‹γ“γ¨γŒδΏθ¨Όγ•γ‚Œγ¦γ„γΎγ™γ€‚ε‰οΏ½? state に基γ₯γ„γŸ state γ‚’θ¨­οΏ½?οΏ½γ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγ€δΈŠθ¨˜γ§θͺ¬ζ˜Žγ—γŸγ‚ˆγ†γ« nextState γ¨γ—γ¦ι–’ζ•°γ‚’ζΈ‘γ™γ“γ¨γŒγ§γγΎγ™γ€‚

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ setState γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ set 閒数を呼び出すことに似ています。

η§»θ‘Œζ–Ήζ³•γ‚’θ¦‹γ‚‹


shouldComponentUpdate(nextProps, nextState, nextContext)

shouldComponentUpdate γ‚’οΏ½?�義すると、React γ―ε†γƒ¬γƒ³γƒ€γƒΌγ‚’γ‚Ήγ‚­γƒƒγƒ—γ§γγ‚‹γ‹γ©γ†γ‹γ‚’εˆ€ζ–­γ™γ‚‹γŸγ‚γ«γγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚

γ“γ‚Œγ‚’ζœ¬ε½“γ«ζ‰‹ε‹•γ§ζ›ΈγγŸγ„ε ΄εˆγ―γ€this.props と nextProps、this.state と nextState γ‚’ζ―”θΌƒγ—γŸδΈŠγ§ false を返すことで、更新をスキップできると React γ«δΌγˆγ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

class Rectangle extends Component {
state = {
isHovered: false
};

shouldComponentUpdate(nextProps, nextState) {
if (
nextProps.position.x === this.props.position.x &&
nextProps.position.y === this.props.position.y &&
nextProps.size.width === this.props.size.width &&
nextProps.size.height === this.props.size.height &&
nextState.isHovered === this.state.isHovered
) {
// Nothing has changed, so a re-render is unnecessary
return false;
}
return true;
}

// ...
}

新しい props γ‚„ state γ‚’ε—γ‘ε–γ‚‹ιš›γ« React は shouldComponentUpdate γ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γƒ‡γƒ•γ‚©γƒ«γƒˆγ― true です。こ�?γƒ‘γ‚½γƒƒγƒ‰γ―εˆε›žγƒ¬γƒ³γƒ€γƒΌοΏ½?場合と forceUpdate γŒδ½Ώη”¨γ•γ‚ŒγŸε ΄εˆγ«γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

εΌ•ζ•°

  • nextProps: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒ¬γƒ³γƒ€γƒΌγ—γ‚ˆγ†γ¨γ—γ¦γ„γ‚‹ζ¬‘οΏ½? propsγ€‚δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ™γ‚‹γŸγ‚γ« nextProps γ‚’ this.props と比較します。
  • nextState: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒ¬γƒ³γƒ€γƒΌγ—γ‚ˆγ†γ¨γ—γ¦γ„γ‚‹ζ¬‘οΏ½? stateγ€‚δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ™γ‚‹γŸγ‚γ« nextState γ‚’ this.state と比較します。
  • nextContext: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒ¬γƒ³γƒ€γƒΌγ—γ‚ˆγ†γ¨γ—γ¦γ„γ‚‹ζ¬‘οΏ½?γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ€‚δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ™γ‚‹γŸγ‚γ« nextContext γ‚’ this.context と比較します。static contextTypeοΌˆηΎθ‘Œη‰ˆοΌ‰γΎγŸγ― static contextTypesοΌˆγƒ¬γ‚¬γ‚·γƒΌοΌ‰γ‚’ζŒ‡οΏ½?οΏ½γ—γŸε ΄εˆοΏ½?γΏεˆ©η”¨ε―θƒ½γ§γ™γ€‚

θΏ”γ‚Šε€€

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ε†γƒ¬γƒ³γƒ€γƒΌγ—γŸγ„ε ΄εˆγ― true γ‚’θΏ”γ—γΎγ™γ€‚γ“γ‚ŒγŒγƒ‡γƒ•γ‚©γƒ«γƒˆοΏ½?ζŒ™ε‹•γ§γ™γ€‚

ε†γƒ¬γƒ³γƒ€γƒΌγŒγ‚Ήγ‚­γƒƒγƒ—ε―θƒ½γ§γ‚γ‚‹γ¨ React γ«δΌγˆγ‚‹γŸγ‚γ«γ― false を返します。

注意点

  • こ�?γƒ‘γ‚½γƒƒγƒ‰γ―γƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚Ήζœ€ι©εŒ–οΏ½?γŸγ‚γ γ‘γ«ε­˜εœ¨γ—γ¦γ„γΎγ™γ€‚γ‚‚γ—γ€γ“οΏ½?γƒ‘γ‚½γƒƒγƒ‰γŒγͺγ„γ¨γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒε£Šγ‚Œγ‚‹ε ΄εˆγ―γ€γΎγšγγ‚Œγ‚’οΏ½?正してください。

  • shouldComponentUpdate γ‚’ζ‰‹ζ›Έγγ™γ‚‹δ»£γ‚γ‚Šγ«γ€PureComponent οΏ½?δ½Ώη”¨γ‚’ζ€œθ¨Žγ—γ¦γγ γ•γ„γ€‚PureComponent は props と state を桅く比較し、必要γͺ更新までスキップしてしまう可能性を減らします。

  • shouldComponentUpdate γ§ζ·±γ„η­‰δΎ‘ζ€§γƒγ‚§γƒƒγ‚―γ‚’θ‘Œγ£γŸγ‚Šγ€JSON.stringify γ‚’δ½Ώη”¨γ—γŸγ‚Šγ™γ‚‹γ“γ¨γ―γŠε‹§γ‚γ—γΎγ›γ‚“γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚ΉγŒγ‚γ‚‰γ‚†γ‚‹ props と state οΏ½?γƒ‡γƒΌγ‚Ώζ§‹ι€ γ«δΎε­˜γ™γ‚‹γ‚ˆγ†γ«γͺγ‚Šγ€δΊˆζΈ¬δΈε―θƒ½γ«γͺγ‚ŠγΎγ™γ€‚γ‚ˆγγ¦γ‚‚γ‚’γƒ—γƒͺγ‚±γƒΌγ‚·γƒ§γƒ³γŒζ•°η§’ι–“γƒ•γƒͺーズするγƒͺγ‚Ήγ‚―γŒγ‚γ‚Šγ€ζœ€ζ‚ͺοΏ½?ε ΄εˆγ―γ‚―γƒ©γƒƒγ‚·γƒ₯γ™γ‚‹ε±ι™ΊγŒγ‚γ‚ŠγΎγ™γ€‚

  • false γ‚’θΏ”γ—γ¦γ‚‚γ€ε­γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? state γŒε€‰ζ›΄γ•γ‚ŒγŸε ΄εˆγ«ε­γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ε†γƒ¬γƒ³γƒ€γƒΌγŒζŠ‘ζ­’γ•γ‚Œγ‚‹γ‚γ‘γ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚

  • false γ‚’θΏ”γ—γ¦γ‚‚γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒε†γƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγͺγ„γ“γ¨γŒδΏθ¨Όγ•γ‚Œγ‚‹γ‚γ‘γ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚React γ―θΏ”γ‚Šε€€γ‚’γƒ’γƒ³γƒˆγ¨γ—γ¦δ½Ώη”¨γ—γΎγ™γŒγ€δ»–οΏ½?η†η”±γ§γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ε†γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹γ“γ¨γŒη†γ«γ‹γͺγ£γ¦γ„γ‚‹γ¨εˆ€ζ–­γ—γŸε ΄εˆγ€ε†γƒ¬γƒ³γƒ€γƒΌγ‚’θ‘Œγ†γ“γ¨γŒγ‚γ‚ŠγΎγ™γ€‚

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ shouldComponentUpdate γ§ζœ€ι©εŒ–γ™γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ memo γ§ζœ€ι©εŒ–γ™γ‚‹γ“γ¨γ¨δΌΌγ¦γ„γΎγ™γ€‚ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γ― useMemo γ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γ§γ€γ•γ‚‰γ«η΄°γ‹γ„ζœ€ι©εŒ–γ‚‚θ‘ŒγˆγΎγ™γ€‚


UNSAFE_componentWillMount()

UNSAFE_componentWillMount γ‚’οΏ½?�義すると、React は constructor οΏ½?η›΄εΎŒγ«γγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ―ζ­΄ε²ηš„γͺη†η”±γ§ε­˜εœ¨γ™γ‚‹γ‚‚οΏ½?γ§γ‚γ‚Šγ€ζ–°γ—γ„γ‚³γƒΌγƒ‰γ§γ―δ½Ώη”¨γ™γΉγγ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚δ»£γ‚γ‚Šγ«δ»₯δΈ‹οΏ½?代替手�?οΏ½οΏ½?γ„γšγ‚Œγ‹γ‚’δ½Ώη”¨γ—γ¦γγ γ•γ„γ€‚

οΏ½?�全でγͺいラむファむクルから�?η§»θ‘ŒδΎ‹γ‚’θ¦‹γ‚‹

εΌ•ζ•°

UNSAFE_componentWillMount γ―εΌ•ζ•°γ‚’ε—γ‘ε–γ‚ŠγΎγ›γ‚“γ€‚

θΏ”γ‚Šε€€

UNSAFE_componentWillMount は何も返してはいけません。

注意点

  • γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒ static getDerivedStateFromProps または getSnapshotBeforeUpdate γ‚’οΏ½?οΏ½θ£…γ—γ¦γ„γ‚‹ε ΄εˆγ€UNSAFE_componentWillMount γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

  • Suspense οΏ½?γ‚ˆγ†γͺヒダンγͺ React ζ©Ÿθƒ½γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹γ‚’γƒ—γƒͺでは、UNSAFE_componentWillMount はそ�?εε‰γ«εγ—γ¦γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζœ¬ε½“γ«γƒžγ‚¦γƒ³γƒˆγ•γ‚Œγ‚‹γ“γ¨γ‚’δΏθ¨Όγ—γΎγ›γ‚“γ€‚οΌˆδΎ‹γˆγ°ε­γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚³γƒΌγƒ‰γŒγΎγ γƒ­γƒΌγƒ‰γ•γ‚Œγ¦γ„γͺいγͺど�?理由で)レンダー�?θ©¦θ‘ŒγŒγ‚΅γ‚Ήγƒšγƒ³γƒ‰γ—γŸε ΄εˆγ€React γ―ι€²θ‘ŒδΈ­οΏ½?ツγƒͺーを破棄し、欑�?θ©¦θ‘Œγ«γ¦γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚Όγƒ­γ‹γ‚‰ζ§‹η―‰γ—γ‚ˆγ†γ¨γ—γΎγ™γ€‚γ“γ‚ŒγŒγ“οΏ½?γƒ‘γ‚½γƒƒγƒ‰γŒ β€œunsafe” とγͺっている理由です。�?οΏ½ιš›γ«γƒžγ‚¦γƒ³γƒˆγ•γ‚ŒγŸγ¨γ„γ†δΊ‹οΏ½?οΏ½γ«δΎε­˜γ™γ‚‹γ‚³γƒΌγƒ‰οΌˆγ‚΅γƒ–γ‚Ήγ‚―γƒͺプション�?追加γͺど)は componentDidMount にε…₯γ‚Œγ‚‹γΉγγ§γ™γ€‚

  • UNSAFE_componentWillMount はァーバレンダγƒͺング中に�?οΏ½θ‘Œγ•γ‚Œγ‚‹ε”―δΈ€οΏ½?ラむファむクルパソッドです。現�?οΏ½ηš„γ«γ―γ‚γ‚‰γ‚†γ‚‹εˆ©η”¨οΏ½?ηš„γ«γŠγ„γ¦γ“γ‚Œγ― constructor γ¨εŒδΈ€γ§γ‚γ‚‹γŸγ‚γ€γ“οΏ½?γ‚Ώγ‚€γƒ—οΏ½?ロジックには constructor を使用すべきです。

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? UNSAFE_componentWillMount 内で state γ‚’εˆζœŸεŒ–γ™γ‚‹γŸγ‚γ« setState γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? useState に初期 state γ‚’ζΈ‘γ™γ“γ¨γ¨εŒη­‰γ§γ™γ€‚


UNSAFE_componentWillReceiveProps(nextProps, nextContext)

UNSAFE_componentWillReceiveProps γ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ¨γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζ–°γ—γ„ props を受け取るときに React γŒγγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ―ζ­΄ε²ηš„γͺη†η”±γ§ε­˜εœ¨γ™γ‚‹γ‚‚οΏ½?γ§γ‚γ‚Šγ€ζ–°γ—γ„γ‚³γƒΌγƒ‰γ§γ―δ½Ώη”¨γ™γΉγγ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚δ»£γ‚γ‚Šγ«δ»₯δΈ‹οΏ½?代替手�?οΏ½οΏ½?γ„γšγ‚Œγ‹γ‚’δ½Ώη”¨γ—γ¦γγ γ•γ„γ€‚

  • props οΏ½?ε€‰ζ›΄γ«εΏœγ˜γ¦ε‰―δ½œη”¨γ‚’οΏ½?οΏ½θ‘Œγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆοΌˆδΎ‹γˆγ°γ€γƒ‡γƒΌγ‚ΏοΏ½?取得、をニパーション�?οΏ½?οΏ½θ‘Œγ€γΎγŸγ―γ‚΅γƒ–γ‚Ήγ‚―γƒͺプション�?ε†εˆζœŸεŒ–οΌ‰γ€γοΏ½?γƒ­γ‚Έγƒƒγ‚―γ‚’δ»£γ‚γ‚Šγ« componentDidUpdate に移動してください。
  • 一部�? props γŒε€‰ζ›΄γ•γ‚ŒγŸγ¨γγ«γ‚γ‚‹γƒ‡γƒΌγ‚ΏοΏ½?ε†θ¨ˆοΏ½?οΏ½γ‚’ιΏγ‘γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγ€δ»£γ‚γ‚Šγ«γƒ‘γƒ’εŒ–γƒ˜γƒ«γƒ‘γƒΌγ‚’δ½Ώη”¨γ—γ¦γγ γ•γ„γ€‚
  • props γŒε€‰ζ›΄γ•γ‚ŒγŸγ¨γγ«γ‚γ‚‹ state γ‚’γ€Œγƒͺγ‚»γƒƒγƒˆγ€γ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?οΏ½ε…¨γ«εˆΆεΎ‘γ•γ‚ŒγŸγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ™γ‚‹γ‹γ€key 付き�?ιžεˆΆεΎ‘γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ™γ‚‹γ“γ¨γ‚’ζ€œθ¨Žγ—γ¦γγ γ•γ„γ€‚
  • props γŒε€‰ζ›΄γ•γ‚ŒγŸγ¨γγ«γ‚γ‚‹ state γ‚’γ€ŒθͺΏζ•΄γ€γ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγ€γƒ¬γƒ³γƒ€γƒΌδΈ­γ« props οΏ½?みから必要γͺζƒ…ε ±γ‚’γ™γΉγ¦θ¨ˆοΏ½?�できγͺいか璺θͺγ—てください。できγͺγ„ε ΄εˆγ―γ€δ»£γ‚γ‚Šγ« static getDerivedStateFromProps を使用してください。

οΏ½?�全でγͺいラむファむクルから�?移葌�?例を見る

εΌ•ζ•°

  • nextProps: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒθ¦ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰ε—γ‘ε–γ‚γ†γ¨γ—γ¦γ„γ‚‹ζ¬‘οΏ½? propsγ€‚δ½•γŒε€‰ζ›΄γ•γ‚ŒγŸγ‹γ‚’εˆ€ζ–­γ™γ‚‹γŸγ‚γ« nextProps γ‚’ this.props と比較します。
  • nextContext: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζœ€γ‚‚θΏ‘γ„γƒ—γƒ­γƒγ‚€γƒ€γ‹γ‚‰ε—γ‘ε–γ‚γ†γ¨γ—γ¦γ„γ‚‹ζ¬‘οΏ½?γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ€‚δ½•γŒε€‰ζ›΄γ•γ‚ŒγŸγ‹γ‚’εˆ€ζ–­γ™γ‚‹γŸγ‚γ« nextContext γ‚’ this.context と比較します。static contextTypeοΌˆηΎθ‘Œη‰ˆοΌ‰γΎγŸγ― static contextTypesοΌˆγƒ¬γ‚¬γ‚·γƒΌοΌ‰γ‚’ζŒ‡οΏ½?οΏ½γ—γŸε ΄εˆοΏ½?γΏεˆ©η”¨ε―θƒ½γ§γ™γ€‚

θΏ”γ‚Šε€€

UNSAFE_componentWillReceiveProps は何も返してはいけません。

注意点

  • static getDerivedStateFromProps または getSnapshotBeforeUpdate γ‚’οΏ½?οΏ½θ£…γ—γ¦γ„γ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γ―γ€UNSAFE_componentWillReceiveProps γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

  • Suspense οΏ½?γ‚ˆγ†γͺヒダンγͺ React ζ©Ÿθƒ½γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹γ‚’γƒ—γƒͺでは、UNSAFE_componentWillReceiveProps はそ�?εε‰γ«εγ—γ¦γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγοΏ½? props γ‚’ζœ¬ε½“γ«ε—γ‘ε–γ‚‹γ“γ¨γ‚’δΏθ¨Όγ—γΎγ›γ‚“γ€‚οΌˆδΎ‹γˆγ°ε­γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚³γƒΌγƒ‰γŒγΎγ γƒ­γƒΌγƒ‰γ•γ‚Œγ¦γ„γͺいγͺど�?理由で)レンダー�?θ©¦θ‘ŒγŒγ‚΅γ‚Ήγƒšγƒ³γƒ‰γ—γŸε ΄εˆγ€React γ―ι€²θ‘ŒδΈ­οΏ½?ツγƒͺーを破棄し、欑�?θ©¦θ‘Œγ«γ¦γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚Όγƒ­γ‹γ‚‰ζ§‹η―‰γ—γ‚ˆγ†γ¨γ—γΎγ™γ€‚ζ¬‘οΏ½?レンダー�?試葌�?時点では、props は異γͺγ£γ¦γ„γ‚‹ε―θƒ½ζ€§γŒγ‚γ‚ŠγΎγ™γ€‚γ“γ‚ŒγŒγ“οΏ½?γƒ‘γ‚½γƒƒγƒ‰γŒ β€œunsafe” とγͺγ£γ¦γ„γ‚‹η†η”±γ§γ™γ€‚γ‚³γƒŸγƒƒγƒˆγ•γ‚ŒγŸζ›΄ζ–°οΏ½?みに対して�?οΏ½θ‘Œγ™γΉγγ‚³γƒΌγƒ‰οΌˆγ‚΅γƒ–γ‚Ήγ‚―γƒͺプション�?γƒͺγ‚»γƒƒγƒˆγͺど)は、componentDidUpdate にε…₯γ‚Œγ‚‹γΉγγ§γ™γ€‚

  • UNSAFE_componentWillReceiveProps γŒε‘Όγ°γ‚Œγ¦γ‚‚γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒε‰ε›žγ¨η•°γͺγ‚‹ props γ‚’ε—γ‘ε–γ£γŸγ“γ¨γ‚’ζ„ε‘³γ™γ‚‹γ‚‚οΏ½?γ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚δ½•γ‹γŒε€‰γ‚γ£γŸγ‹γ©γ†γ‹γ‚’η’Ίθͺγ™γ‚‹γ«γ― nextProps と this.props γ‚’θ‡ͺεˆ†γ§ζ―”θΌƒγ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

  • React γ―γƒžγ‚¦γƒ³γƒˆζ™‚γ« UNSAFE_componentWillReceiveProps γ‚’εˆζœŸ props γ‚’εΌ•ζ•°γ«ε‘Όγ³ε‡Ίγ™γ“γ¨γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚γ“οΏ½?γƒ‘γ‚½γƒƒγƒ‰γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? props οΏ½?δΈ€ιƒ¨γŒζ›΄ζ–°γ•γ‚Œγ‚‹δΊˆοΏ½?οΏ½οΏ½?場合に�?γΏε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ™γ€‚δΎ‹γˆγ°γ€setState γ‚’ε‘Όγ³ε‡Ίγ—γ¦γ‚‚γ€δΈ€θˆ¬ηš„γ«γ―εŒγ˜γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆε†…οΏ½? UNSAFE_componentWillReceiveProps γ―γƒˆγƒͺγ‚¬γ•γ‚ŒγΎγ›γ‚“γ€‚

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ UNSAFE_componentWillReceiveProps 内部で setState を呼び出して state γ‚’γ€ŒθͺΏζ•΄γ€γ™γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γƒ¬γƒ³γƒ€γƒΌδΈ­γ« useState οΏ½? set 閒数を呼び出す γ“γ¨γ¨εŒη­‰γ§γ™γ€‚


UNSAFE_componentWillUpdate(nextProps, nextState)

UNSAFE_componentWillUpdate γ‚’οΏ½?�義すると、新しい props または state でレンダーする前に React γŒγγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ―ζ­΄ε²ηš„γͺη†η”±γ§ε­˜εœ¨γ™γ‚‹γ‚‚οΏ½?γ§γ‚γ‚Šγ€ζ–°γ—γ„γ‚³γƒΌγƒ‰γ§γ―δ½Ώη”¨γ™γΉγγ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚δ»£γ‚γ‚Šγ«δ»₯δΈ‹οΏ½?代替手�?οΏ½οΏ½?γ„γšγ‚Œγ‹γ‚’δ½Ώη”¨γ—γ¦γγ γ•γ„γ€‚

  • prop または state οΏ½?ε€‰ζ›΄γ«εΏœγ˜γ¦ε‰―δ½œη”¨οΌˆδΎ‹γˆγ°γ€γƒ‡γƒΌγ‚ΏοΏ½?取得、をニパーション�?οΏ½?οΏ½θ‘Œγ€γ‚΅γƒ–γ‚Ήγ‚―γƒͺプション�?ε†εˆζœŸεŒ–γͺど)を�?οΏ½θ‘Œγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγ€γοΏ½?ロジックを componentDidUpdate に移動してください。
  • DOM から情報をθͺ­γΏε–γ‚ŠοΌˆδΎ‹γˆγ°γ€ηΎεœ¨οΏ½?スクロール位�?γ‚’δΏε­˜γ™γ‚‹γͺγ©οΌ‰γ€γγ‚Œγ‚’εΎŒγ§ componentDidUpdate γ§δ½Ώη”¨γ™γ‚‹ε ΄εˆγ―γ€getSnapshotBeforeUpdate 内でθͺ­γΏε–γ‚‹γ‚ˆγ†γ«γ—γ¦γγ γ•γ„γ€‚

οΏ½?�全でγͺいラむファむクルから�?η§»θ‘ŒδΎ‹γ‚’θ¦‹γ‚‹

εΌ•ζ•°

  • nextProps: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζ¬‘γ«γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹δΊˆοΏ½?οΏ½οΏ½? propsγ€‚δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ™γ‚‹γŸγ‚γ«γ€nextProps と this.props を比較します。
  • nextState: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζ¬‘γ«γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹δΊˆοΏ½?οΏ½οΏ½? stateγ€‚δ½•γŒε€‰γ‚γ£γŸγ‹γ‚’εˆ€ζ–­γ™γ‚‹γŸγ‚γ«γ€nextState と this.state を比較します。

θΏ”γ‚Šε€€

UNSAFE_componentWillUpdate は何も返してはいけません。

注意点

  • shouldComponentUpdate が�?οΏ½ηΎ©γ•γ‚Œγ¦γŠγ‚Š false γ‚’θΏ”γ™ε ΄εˆγ€UNSAFE_componentWillUpdate γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

  • γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒ static getDerivedStateFromProps または getSnapshotBeforeUpdate γ‚’οΏ½?οΏ½θ£…γ—γ¦γ„γ‚‹ε ΄εˆγ€UNSAFE_componentWillUpdate γ―ε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ›γ‚“γ€‚

  • componentWillUpdate οΏ½?呼び出し中に setStateοΌˆγΎγŸγ―ζœ€η΅‚ηš„γ« setState γŒε‘Όγ³ε‡Ίγ•γ‚Œγ‚‹γ‚ˆγ†γͺγ‚γ‚‰γ‚†γ‚‹γƒ‘γ‚½γƒƒγƒ‰γ€δΎ‹γˆγ° Redux をクション�?γƒ‡γ‚£γ‚Ήγƒ‘γƒƒγƒοΌ‰γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ―γ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γΎγ›γ‚“γ€‚

  • Suspense οΏ½?γ‚ˆγ†γͺヒダンγͺ React ζ©Ÿθƒ½γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹γ‚’γƒ—γƒͺでは、UNSAFE_componentWillUpdate はそ�?εε‰γ«εγ—γ¦γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζœ¬ε½“γ«ζ›΄ζ–°γ•γ‚Œγ‚‹γ“γ¨γ‚’δΏθ¨Όγ—γΎγ›γ‚“γ€‚οΌˆδΎ‹γˆγ°ε­γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚³γƒΌγƒ‰γŒγΎγ γƒ­γƒΌγƒ‰γ•γ‚Œγ¦γ„γͺいγͺど�?理由で)レンダー�?θ©¦θ‘ŒγŒγ‚΅γ‚Ήγƒšγƒ³γƒ‰γ—γŸε ΄εˆγ€React γ―ι€²θ‘ŒδΈ­οΏ½?ツγƒͺーを破棄し、欑�?θ©¦θ‘Œγ«γ¦γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚Όγƒ­γ‹γ‚‰ζ§‹η―‰γ—γ‚ˆγ†γ¨γ—γΎγ™γ€‚ζ¬‘οΏ½?レンダー�?試葌�?時点では props と state は異γͺγ£γ¦γ„γ‚‹ε―θƒ½ζ€§γŒγ‚γ‚ŠγΎγ™γ€‚γ“γ‚ŒγŒγ“οΏ½?γƒ‘γ‚½γƒƒγƒ‰γŒ β€œunsafe” とγͺγ£γ¦γ„γ‚‹η†η”±γ§γ™γ€‚γ‚³γƒŸγƒƒγƒˆγ•γ‚ŒγŸζ›΄ζ–°οΏ½?みに対して�?οΏ½θ‘Œγ™γΉγγ‚³γƒΌγƒ‰οΌˆγ‚΅γƒ–γ‚Ήγ‚―γƒͺプション�?γƒͺγ‚»γƒƒγƒˆγͺど)は、componentDidUpdate にε…₯γ‚Œγ‚‹γΉγγ§γ™γ€‚

  • UNSAFE_componentWillUpdate γŒε‘Όγ°γ‚Œγ¦γ‚‚γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒε‰ε›žγ¨γ―η•°γͺγ‚‹ props γ‚„ state γ‚’ε—γ‘ε–γ£γŸγ“γ¨γ‚’ζ„ε‘³γ™γ‚‹γ‚‚οΏ½?γ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚δ½•γ‹γŒε€‰γ‚γ£γŸγ‹γ©γ†γ‹γ‚’η’Ίθͺγ™γ‚‹γ«γ―、nextProps と this.props、nextState と this.state γ‚’θ‡ͺεˆ†γ§ζ―”θΌƒγ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

  • React は props γ‚„ state οΏ½?εˆζœŸε€€γ‚’δ½Ώγ£γ¦γƒžγ‚¦γƒ³γƒˆζ™‚γ« UNSAFE_componentWillUpdate を呼び出すことはしません。

補袳

ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ― UNSAFE_componentWillUpdate に直ζŽ₯ε―ΎεΏœγ™γ‚‹γ‚‚οΏ½?γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚


static childContextTypes

Deprecated

こ�? API は React οΏ½?ε°†ζ₯οΏ½?γƒ‘γ‚Έγƒ£γƒΌγƒγƒΌγ‚Έγƒ§γƒ³γ§ε‰Šι™€γ•γ‚ŒγΎγ™γ€‚δ»£γ‚γ‚Šγ« static contextType を使用してください。

こ�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ‚ˆγ£γ¦ζδΎ›γ•γ‚Œγ‚‹γƒ¬γ‚¬γ‚·γƒΌγ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’ζŒ‡οΏ½?�します。


static contextTypes

Deprecated

こ�? API は React οΏ½?ε°†ζ₯οΏ½?γƒ‘γ‚Έγƒ£γƒΌγƒγƒΌγ‚Έγƒ§γƒ³γ§ε‰Šι™€γ•γ‚ŒγΎγ™γ€‚δ»£γ‚γ‚Šγ« static contextType を使用してください。

こ�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒδ½Ώη”¨γ™γ‚‹γƒ¬γ‚¬γ‚·γƒΌγ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’ζŒ‡οΏ½?�します。


static contextType

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ this.context γ‚’θͺ­γΏε–γ‚ŠγŸγ„ε ΄εˆγ€θͺ­γΏε–γ‚ŠγŸγ„γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’γ“γ‚Œγ§ζŒ‡οΏ½?οΏ½γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚static contextType γ¨γ—γ¦ζŒ‡οΏ½?οΏ½γ™γ‚‹γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ―γ€δ»₯前に createContext γ§δ½œζˆγ•γ‚Œγ¦γ„γ‚‹ε€€γ§γͺγ‘γ‚Œγ°γͺγ‚ŠγΎγ›γ‚“γ€‚

class Button extends Component {
static contextType = ThemeContext;

render() {
const theme = this.context;
const className = 'button-' + theme;
return (
<button className={className}>
{this.props.children}
</button>
);
}
}

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§οΏ½? this.context οΏ½?θͺ­γΏε–γ‚Šγ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? useContext γ¨εŒη­‰γ§γ™γ€‚

η§»θ‘Œζ–Ήζ³•γ‚’θ¦‹γ‚‹


static defaultProps

クラス�?γƒ‡γƒ•γ‚©γƒ«γƒˆοΏ½? props γ‚’θ¨­οΏ½?οΏ½γ™γ‚‹γŸγ‚γ« static defaultProps γ‚’οΏ½?οΏ½ηΎ©γ§γγΎγ™γ€‚γ“γ‚Œγ‚‰γ― undefined γŠγ‚ˆγ³ε­˜εœ¨γ—γͺい props γ«ε―Ύγ—γ¦δ½Ώη”¨γ•γ‚ŒγΎγ™γŒγ€null である props γ«γ―δ½Ώη”¨γ•γ‚ŒγΎγ›γ‚“γ€‚

δΎ‹γˆγ°δ»₯δΈ‹οΏ½?γ‚ˆγ†γ«γ—γ¦γ€props である color γŒγƒ‡γƒ•γ‚©γƒ«γƒˆγ§ 'blue' にγͺγ‚‹γ‚ˆγ†οΏ½?�義できます。

class Button extends Component {
static defaultProps = {
color: 'blue'
};

render() {
return <button className={this.props.color}>click me</button>;
}
}

color prop γŒζΈ‘γ•γ‚Œγͺγ„ε ΄εˆγ‚„ undefined γ§γ‚γ‚‹ε ΄εˆγ€γƒ‡γƒ•γ‚©γƒ«γƒˆγ§ 'blue' γ«γ‚»γƒƒγƒˆγ•γ‚ŒγΎγ™γ€‚

<>
{/* this.props.color is "blue" */}
<Button />

{/* this.props.color is "blue" */}
<Button color={undefined} />

{/* this.props.color is null */}
<Button color={null} />

{/* this.props.color is "red" */}
<Button color="red" />
</>

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ defaultProps γ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γƒ‡γƒ•γ‚©γƒ«γƒˆε€€γ‚’δ½Ώη”¨γ™γ‚‹οΏ½?と同様�?γ‚‚οΏ½?です。


static propTypes

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒε—γ‘ε…₯γ‚Œγ‚‹ props οΏ½?εž‹γ‚’οΏ½?οΏ½θ¨€γ™γ‚‹γŸγ‚γ«γ€prop-types ラむブラγƒͺと一緒に static propTypes γ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γ“γ‚Œγ‚‰οΏ½?εž‹γ―γƒ¬γƒ³γƒ€γƒΌδΈ­γ€γ‹γ€ι–‹η™ΊδΈ­γ«οΏ½?γΏγƒγ‚§γƒƒγ‚―γ•γ‚ŒγΎγ™γ€‚

import PropTypes from 'prop-types';

class Greeting extends React.Component {
static propTypes = {
name: PropTypes.string
};

render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
}

補袳

ランタむムで�? props οΏ½?εž‹γƒγ‚§γƒƒγ‚―οΏ½?δ»£γ‚γ‚Šγ« TypeScript γ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γ‚’γŠε‹§γ‚γ—γΎγ™γ€‚


static getDerivedStateFromError(error)

static getDerivedStateFromError γ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ¨γ€ε­γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΌˆι γοΏ½?ε­γ‚’ε«γ‚€οΌ‰γŒγƒ¬γƒ³γƒ€γƒΌδΈ­γ«γ‚¨γƒ©γƒΌγ‚’γ‚Ήγƒ­γƒΌγ—γŸγ¨γγ« React γŒγγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€UI γ‚’γ‚―γƒͺγ‚’γ™γ‚‹δ»£γ‚γ‚Šγ«γ‚¨γƒ©γƒΌγƒ‘γƒƒγ‚»γƒΌγ‚Έγ‚’θ‘¨η€Ίγ§γγΎγ™γ€‚

ι€šεΈΈγ“γ‚Œγ―γ€γ‚¨γƒ©γƒΌγƒ¬γƒγƒΌγƒˆγ‚’δ½•γ‚‰γ‹οΏ½?εˆ†ζžγ‚΅γƒΌγƒ“γ‚Ήγ«ι€δΏ‘γ§γγ‚‹γ‚ˆγ†γ«γ™γ‚‹γŸγ‚οΏ½? componentDidCatch γ¨δΈ€η·’γ«δ½Ώη”¨γ•γ‚ŒγΎγ™γ€‚γ“γ‚Œγ‚‰οΏ½?γƒ‘γ‚½γƒƒγƒ‰γ‚’ζŒγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ことをエラーバウンダγƒͺと呼びます。

例を見る

εΌ•ζ•°

  • error: γ‚Ήγƒ­γƒΌγ•γ‚ŒγŸγ‚¨γƒ©γƒΌγ€‚ηΎοΏ½?οΏ½ηš„γ«γ―ι€šεΈΈ Error οΏ½?むンスタンスにγͺγ‚ŠγΎγ™γŒγ€γ“οΏ½?γ“γ¨γ―δΏθ¨Όγ•γ‚Œγ¦γ„γΎγ›γ‚“γ€‚JavaScript γ§γ―ζ–‡ε­—εˆ—γ‚„ null すら含む、任意�?ε€€γ‚’ throw γ™γ‚‹γ“γ¨γŒθ¨±γ•γ‚Œγ¦γ„γ‚‹γŸγ‚γ§γ™γ€‚

θΏ”γ‚Šε€€

static getDerivedStateFromError γ‹γ‚‰γ―γ€γ‚¨γƒ©γƒΌγƒ‘γƒƒγ‚»γƒΌγ‚Έγ‚’θ‘¨η€Ίγ™γ‚‹γ‚ˆγ†γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«ζŒ‡η€Ίγ™γ‚‹γŸγ‚οΏ½? state を返します。

注意点

  • static getDerivedStateFromError γ―η΄”ι–’ζ•°γ§γ‚γ‚‹γΉγγ§γ™γ€‚ε‰―δ½œη”¨οΌˆδΎ‹γˆγ°γ€εˆ†ζžγ‚΅γƒΌγƒ“γ‚ΉοΏ½?呼び出し)を�?οΏ½θ‘Œγ—γŸγ„ε ΄εˆγ―γ€componentDidCatch γ‚‚οΏ½?οΏ½θ£…γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

補袳

ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ― static getDerivedStateFromError に直ζŽ₯ε―ΎεΏœγ™γ‚‹γ‚‚οΏ½?γ―γΎγ γ‚γ‚ŠγΎγ›γ‚“γ€‚γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?δ½œζˆγ‚’γͺγ‚‹γΉγιΏγ‘γŸγ„ε ΄εˆγ―γ€δΈŠθ¨˜οΏ½?γ‚ˆγ†γͺ ErrorBoundary γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ 1 ぀だけ書いてをプγƒͺε…¨δ½“γ§δ½Ώη”¨γ—γΎγ™γ€‚γ‚γ‚‹γ„γ―γ“γ‚Œγ‚’δ»£γ‚γ‚Šγ«γ‚„γ£γ¦γγ‚Œγ‚‹ react-error-boundary パッケージを使用することもできます。


static getDerivedStateFromProps(props, state)

static getDerivedStateFromProps γ‚’οΏ½?�義すると、React γ―εˆε›žοΏ½?γƒžγ‚¦γƒ³γƒˆγ¨γοΏ½?後�?ζ›΄ζ–°οΏ½?丑方で、render γ‚’ε‘Όγ³ε‡Ίγ™η›΄ε‰γ«γ“γ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚state γ‚’ζ›΄ζ–°γ™γ‚‹γŸγ‚οΏ½?γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ™γ‹γ€δ½•γ‚‚ζ›΄ζ–°γ—γͺγ„ε ΄εˆγ― null γ‚’θΏ”γ™γ‚ˆγ†γ«γ—γΎγ™γ€‚

こ�?パソッドは、state が props οΏ½?η΅Œζ™‚ηš„γͺε€‰εŒ–γ«δΎε­˜γ™γ‚‹γ¨γ„γ†η¨€γͺユースケース�?γŸγ‚γ«ε­˜εœ¨γ—γΎγ™γ€‚δΎ‹γˆγ°γ€γ“οΏ½? Form γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ― props である userID γŒε€‰ζ›΄γ•γ‚ŒγŸγ¨γγ« state である email γ‚’γƒͺγ‚»γƒƒγƒˆγ—γΎγ™γ€‚

class Form extends Component {
state = {
email: this.props.defaultEmail,
prevUserID: this.props.userID
};

static getDerivedStateFromProps(props, state) {
// Any time the current user changes,
// Reset any parts of state that are tied to that user.
// In this simple example, that's just the email.
if (props.userID !== state.prevUserID) {
return {
prevUserID: props.userID,
email: props.defaultEmail
};
}
return null;
}

// ...
}

こ�?γƒ‘γ‚ΏγƒΌγƒ³γ§γ―γ€οΌˆuserID οΏ½?γ‚ˆγ†γͺοΌ‰props οΏ½?ε‰ε›žοΏ½?ε€€γ‚’γ€οΌˆprevUserID οΏ½?γ‚ˆγ†γͺοΌ‰state γ«δΏζŒγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹γ“γ¨γ«ζ³¨ζ„γ—γ¦γγ γ•γ„γ€‚

落とし穴

state ε€€οΏ½?ζ΄Ύη”Ÿγ―γ‚³γƒΌγƒ‰γ‚’ε†—ι•·γ«γ—γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’εˆ†γ‹γ‚Šγ₯γ‚‰γγ—γΎγ™γ€‚γ‚ˆγ‚Šγ‚·γƒ³γƒ—γƒ«γͺ代替手�?�に぀いて璺�?οΏ½γ«η†θ§£γ—γ¦γŠγ„γ¦γγ γ•γ„γ€‚

εΌ•ζ•°

  • props: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒ¬γƒ³γƒ€γƒΌγ—γ‚ˆγ†γ¨γ—γ¦γ„γ‚‹ζ¬‘οΏ½? props。
  • state: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒ¬γƒ³γƒ€γƒΌγ—γ‚ˆγ†γ¨γ—γ¦γ„γ‚‹ζ¬‘οΏ½? state。

θΏ”γ‚Šε€€

static getDerivedStateFromProps は、state γ‚’ζ›΄ζ–°γ™γ‚‹γŸγ‚οΏ½?γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ™γ‹γ€δ½•γ‚‚ζ›΄ζ–°γ—γͺγ„ε ΄εˆγ― null を返します。

注意点

  • こ�?γƒ‘γ‚½γƒƒγƒ‰γ―γ€εŽŸε› γ«ι–’δΏ‚γͺくすべて�?レンダーで発火します。UNSAFE_componentWillReceiveProps γ―γ“γ‚Œγ¨γ―η•°γͺγ‚Šγ€θ¦ͺγŒε†γƒ¬γƒ³γƒ€γƒΌγ‚’εΌ•γθ΅·γ“γ—γŸγ¨γοΏ½?み発火し、ローカル�? setState οΏ½?η΅ζžœγ¨γ—γ¦γ―η™Ίη«γ—γΎγ›γ‚“γ€‚

  • こ�?γƒ‘γ‚½γƒƒγƒ‰γ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚€γƒ³γ‚Ήγ‚Ώγƒ³γ‚Ήγ«γ‚’γ‚―γ‚»γ‚Ήγ§γγΎγ›γ‚“γ€‚γŠζœ›γΏγ§γ‚γ‚Œγ°γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? props と state に対する純閒数をクラス�?οΏ½ηΎ©οΏ½?ε€–ιƒ¨γ«ζŠ½ε‡Ίγ™γ‚‹γ“γ¨γ§γ€static getDerivedStateFromProps と他�?クラスパソッドと�?ι–“γ§γ‚³γƒΌγƒ‰γ‚’ε†εˆ©η”¨γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

補袳

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ static getDerivedStateFromProps γ‚’οΏ½?οΏ½θ£…γ™γ‚‹γ“γ¨γ―γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γƒ¬γƒ³γƒ€γƒΌδΈ­γ« useState οΏ½? set 閒数を呼び出す γ“γ¨γ¨εŒη­‰γ§γ™γ€‚


使用法

γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?�義する

React οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚―γƒ©γ‚Ήγ¨γ—γ¦οΏ½?�義するには、硄み込み�? Component クラスを碙承し、render パソッドを�?�義します。

import { Component } from 'react';

class Greeting extends Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}

React は、画青に何を葨瀺するかをηŸ₯γ‚‹γŸγ‚γ«γ€render γƒ‘γ‚½γƒƒγƒ‰γ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚ι€šεΈΈγ€γγ“γ‹γ‚‰γ― JSX を返します。render γƒ‘γ‚½γƒƒγƒ‰γ―η΄”ι–’ζ•°γ§γ‚γ‚‹γ€γ€γΎγ‚Š JSX οΏ½?計�?οΏ½οΏ½?γΏγ‚’θ‘Œγ†εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ¨εŒζ§˜γ«γ€γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γ‚‚θ¦ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰ props γ‚’ι€šγ˜γ¦ζƒ…ε ±γ‚’ε—γ‘ε–γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γŸγ γ—γ€props γ‚’θͺ­γΏε–γ‚‹γŸγ‚οΏ½?構文は異γͺγ‚ŠγΎγ™γ€‚δΎ‹γˆγ°γ€θ¦ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒ <Greeting name="Taylor" /> γ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹ε ΄εˆγ€γ“οΏ½? name プロパティは this.props から this.props.name οΏ½?γ‚ˆγ†γ«γ—γ¦θͺ­γΏε–γ‚ŠγΎγ™γ€‚

import { Component } from 'react';

class Greeting extends Component {
  render() {
    return <h1>Hello, {this.props.name}!</h1>;
  }
}

export default function App() {
  return (
    <>
      <Greeting name="Sara" />
      <Greeting name="Cahal" />
      <Greeting name="Edite" />
    </>
  );
}

γƒ•γƒƒγ‚―οΌˆuse で始まる useState οΏ½?γ‚ˆγ†γͺι–’ζ•°οΌ‰γ―γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆε†…γ§γ―γ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γͺいことに注意してください。

落とし穴

クラス�?δ»£γ‚γ‚Šγ«ι–’ζ•°γ§γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ‚’ζŽ¨ε₯¨γ—γΎγ™γ€‚η§»θ‘Œζ–Ήζ³•γ―こけら。


γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ« state γ‚’θΏ½εŠ γ™γ‚‹

クラスに state γ‚’θΏ½εŠ γ™γ‚‹γ«γ―γ€state というプロパティにγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’ε‰²γ‚Šε½“γ¦γΎγ™γ€‚state を更新するには、this.setState を呼び出します。

import { Component } from 'react';

export default class Counter extends Component {
  state = {
    name: 'Taylor',
    age: 42,
  };

  handleNameChange = (e) => {
    this.setState({
      name: e.target.value
    });
  }

  handleAgeChange = () => {
    this.setState({
      age: this.state.age + 1 
    });
  };

  render() {
    return (
      <>
        <input
          value={this.state.name}
          onChange={this.handleNameChange}
        />
        <button onClick={this.handleAgeChange}>
          Increment age
        </button>
        <p>Hello, {this.state.name}. You are {this.state.age}.</p>
      </>
    );
  }
}

落とし穴

クラス�?δ»£γ‚γ‚Šγ«ι–’ζ•°γ§γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ‚’ζŽ¨ε₯¨γ—γΎγ™γ€‚η§»θ‘Œζ–Ήζ³•γ―こけら。


γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γƒ©γ‚€γƒ•γ‚΅γ‚€γ‚―γƒ«γƒ‘γ‚½γƒƒγƒ‰γ‚’θΏ½εŠ γ™γ‚‹

クラスにはいく぀か�?η‰Ήεˆ₯γͺパソッドを�?οΏ½ηΎ©γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

componentDidMount パソッドを�?οΏ½ηΎ©γ™γ‚‹γ¨γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒη”»ι’γ«θΏ½εŠ γ•γ‚Œγ‚‹οΌˆγƒžγ‚¦γƒ³γƒˆγ•γ‚Œγ‚‹οΌ‰γ¨γγ« React γŒγγ‚Œγ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚props γ‚„ state οΏ½?ε€‰ζ›΄γ«γ‚ˆγ‚Šγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒε†γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸεΎŒγ«γ€React は componentDidUpdate γ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒη”»ι’γ‹γ‚‰ε‰Šι™€γ•γ‚Œγ‚‹οΌˆγ‚’γƒ³γƒžγ‚¦γƒ³γƒˆγ•γ‚Œγ‚‹οΌ‰ιš›γ«γ€React は componentWillUnmount を呼び出します。

componentDidMount γ‚’οΏ½?οΏ½θ£…γ™γ‚‹ε ΄εˆγ€ι€šεΈΈγ―γƒγ‚°γ‚’ιΏγ‘γ‚‹γŸγ‚γ« 3 ぀すべて�?ラむファむクルを�?οΏ½θ£…γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚δΎ‹γˆγ°γ€componentDidMount γŒδ½•γ‚‰γ‹οΏ½? state γ‚„ props γ‚’θͺ­γΏε–γ‚‹ε ΄εˆγ―γγ‚Œγ‚‰γ«ε€‰ζ›΄γŒγ‚γ£γŸε ΄εˆγ«ε‡¦η†γ™γ‚‹γŸγ‚γ« componentDidUpdate γ‚’οΏ½?οΏ½θ£…γ™γ‚‹εΏ…θ¦γŒγ‚γ‚Šγ€componentDidMount が�?οΏ½θ‘Œγ—γŸγ“γ¨γ‚’γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γ™γ‚‹γŸγ‚γ«γ― componentWillUnmount γ‚’οΏ½?οΏ½θ£…γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

δΎ‹γˆγ°γ€δ»₯δΈ‹οΏ½? ChatRoom γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€γƒγƒ£γƒƒγƒˆγΈοΏ½?ζŽ₯ηΆšγ‚’ props γŠγ‚ˆγ³ state γ¨εŒζœŸγ•γ›γ¦γ„γΎγ™γ€‚

import { Component } from 'react';
import { createConnection } from './chat.js';

export default class ChatRoom extends Component {
  state = {
    serverUrl: 'https://localhost:1234'
  };

  componentDidMount() {
    this.setupConnection();
  }

  componentDidUpdate(prevProps, prevState) {
    if (
      this.props.roomId !== prevProps.roomId ||
      this.state.serverUrl !== prevState.serverUrl
    ) {
      this.destroyConnection();
      this.setupConnection();
    }
  }

  componentWillUnmount() {
    this.destroyConnection();
  }

  setupConnection() {
    this.connection = createConnection(
      this.state.serverUrl,
      this.props.roomId
    );
    this.connection.connect();    
  }

  destroyConnection() {
    this.connection.disconnect();
    this.connection = null;
  }

  render() {
    return (
      <>
        <label>
          Server URL:{' '}
          <input
            value={this.state.serverUrl}
            onChange={e => {
              this.setState({
                serverUrl: e.target.value
              });
            }}
          />
        </label>
        <h1>Welcome to the {this.props.roomId} room!</h1>
      </>
    );
  }
}

開発時に Strict Mode γŒζœ‰εŠΉοΏ½?ε ΄εˆγ€React は componentDidMount γ‚’ε‘Όγ³ε‡Ίγ—γ€η›΄εΎŒγ« componentWillUnmount を呼び出し、そ�?εΎŒε†γ³ componentDidMount γ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€componentWillUnmount οΏ½?οΏ½?οΏ½θ£…γ‚’εΏ˜γ‚ŒγŸε ΄εˆγ‚„γ€γοΏ½?γƒ­γ‚Έγƒƒγ‚―γŒ componentDidMount οΏ½?ζŒ™ε‹•γ¨ζ­£γ—γγ€Œι‘οΏ½?γ‚ˆγ†γ«ε―ΎεΏœγ€γ—γ¦γ„γͺγ„ε ΄εˆγ«ζ°—γ₯きやすくγͺγ‚ŠγΎγ™γ€‚

落とし穴

クラス�?δ»£γ‚γ‚Šγ«ι–’ζ•°γ§γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?οΏ½ηΎ©γ™γ‚‹γ“γ¨γ‚’ζŽ¨ε₯¨γ—γΎγ™γ€‚η§»θ‘Œζ–Ήζ³•γ―こけら。


エラーバウンダγƒͺでレンダー中�?エラーをキャッチする

γƒ‡γƒ•γ‚©γƒ«γƒˆγ§γ―γ€γ‚’γƒ—γƒͺγ‚±γƒΌγ‚·γƒ§γƒ³γŒγƒ¬γƒ³γƒ€γƒΌδΈ­γ«γ‚¨γƒ©γƒΌγ‚’γ‚Ήγƒ­γƒΌγ™γ‚‹γ¨γ€React はそ�? UI γ‚’η”»ι’γ‹γ‚‰ε‰Šι™€γ—γΎγ™γ€‚γ“γ‚Œγ‚’ι˜²γγŸγ‚γ«γ€UI をエラーバウンダγƒͺγ«γƒ©γƒƒγƒ—γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γ‚¨γƒ©γƒΌγƒγ‚¦γƒ³γƒ€γƒͺは、クラッシγƒ₯γ—γŸιƒ¨δ½οΏ½?δ»£γ‚γ‚Šγ«γ€δΎ‹γˆγ°γ‚¨γƒ©γƒΌγƒ‘γƒƒγ‚»γƒΌγ‚Έγͺど�?フォールバック UI γ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚οΏ½?、特εˆ₯γͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γ™γ€‚

エラーバウンダγƒͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?οΏ½θ£…γ™γ‚‹γŸγ‚γ«γ―γ€γ‚¨γƒ©γƒΌγ«εεΏœγ—γ¦ state γ‚’ζ›΄ζ–°γ—γ€γƒ¦γƒΌγ‚Άγ«γ‚¨γƒ©γƒΌγƒ‘γƒƒγ‚»γƒΌγ‚Έγ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚οΏ½? static getDerivedStateFromError γ‚’ζδΎ›γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γΎγŸγ‚ͺγƒ—γ‚·γƒ§γƒ³γ§γ€δΎ‹γˆγ°γ‚¨γƒ©γƒΌγ‚’εˆ†ζžγ‚΅γƒΌγƒ“γ‚Ήγ«θ¨˜ιŒ²γ™γ‚‹γͺど�?追加�?γƒ­γ‚Έγƒƒγ‚―γ‚’θΏ½εŠ γ™γ‚‹γŸγ‚γ« componentDidCatch γ‚’οΏ½?�装することもできます。

class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}

static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}

componentDidCatch(error, info) {
// Example "componentStack":
// in ComponentThatThrows (created by App)
// in ErrorBoundary (created by App)
// in div (created by App)
// in App
logErrorToMyService(error, info.componentStack);
}

render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return this.props.fallback;
}

return this.props.children;
}
}

ζ¬‘γ«γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγƒ„γƒͺγƒΌοΏ½?δΈ€ιƒ¨γ‚’γ“γ‚Œγ§γƒ©γƒƒγƒ—γ—γΎγ™γ€‚

<ErrorBoundary fallback={<p>Something went wrong</p>}>
<Profile />
</ErrorBoundary>

もし Profile あるいはそ�?ε­γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγ‚¨γƒ©γƒΌγ‚’γ‚Ήγƒ­γƒΌγ™γ‚‹γ¨γ€ErrorBoundary はそ�?γ‚¨γƒ©γƒΌγ‚’γ€Œγ‚­γƒ£γƒƒγƒγ€γ—γ€ζŒ‡οΏ½?οΏ½γ—γŸγ‚¨γƒ©γƒΌγƒ‘γƒƒγ‚»γƒΌγ‚Έγ¨γ¨γ‚‚γ«γƒ•γ‚©γƒΌγƒ«γƒγƒƒγ‚― UI γ‚’θ‘¨η€Ίγ—γ€γ‚¨γƒ©γƒΌγƒ¬γƒγƒΌγƒˆγ‚’γ‚γͺた�?エラーレポーティングァービスに送俑します。

すべて�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’εˆ₯γ€…οΏ½?エラーバウンダγƒͺγ§γƒ©γƒƒγƒ—γ™γ‚‹εΏ…θ¦γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚γ‚¨γƒ©γƒΌγƒγ‚¦γƒ³γƒ€γƒͺοΏ½?η²’εΊ¦γ«γ€γ„γ¦θ€ƒγˆγ‚‹ιš›γ―γ€γ‚¨γƒ©γƒΌγƒ‘γƒƒγ‚»γƒΌγ‚Έγ‚’γ©γ“γ«θ‘¨η€Ίγ™γ‚‹οΏ½?γŒη†γ«γ‹γͺγ£γ¦γ„γ‚‹γ‹γ‚’θ€ƒγˆγ¦γΏγ¦γγ γ•γ„γ€‚δΎ‹γˆγ°γ€γƒ‘γƒƒγ‚»γƒΌγ‚Έγƒ³γ‚°γ‚’γƒ—γƒͺγ§γ―γ€δΌšθ©±οΏ½?γƒͺγ‚Ήγƒˆγ‚’γ‚¨γƒ©γƒΌγƒγ‚¦γƒ³γƒ€γƒͺで囲む�?γŒη†γ«γ‹γͺγ£γ¦γ„γΎγ™γ€‚γΎγŸγ€γƒ‘γƒƒγ‚»γƒΌγ‚Έγ‚’ε€‹εˆ₯に囲むことも理にかγͺっているでしょう。しかし、をバターを 1 γ€γšγ€ε›²γ‚€γ“γ¨γ«γ―ζ„ε‘³γŒγ‚γ‚ŠγΎγ›γ‚“γ€‚

補袳

ηΎεœ¨γ€ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ¨γ—γ¦γ‚¨γƒ©γƒΌγƒγ‚¦γƒ³γƒ€γƒͺγ‚’ζ›Έγζ–Ήζ³•γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚γ—γ‹γ—γ€θ‡ͺεˆ†γ§γ‚¨γƒ©γƒΌγƒγ‚¦γƒ³γƒ€γƒͺγ‚―γƒ©γ‚Ήγ‚’ζ›ΈγεΏ…θ¦γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚δΎ‹γˆγ°γ€δ»£γ‚γ‚Šγ« react-error-boundary γ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚


δ»£ζ›Ώζ‘ˆ

シンプルγͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚―γƒ©γ‚Ήγ‹γ‚‰ι–’ζ•°γΈη§»θ‘Œ

δΈ€θˆ¬ηš„γ«γ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―ι–’ζ•°γ¨γ—γ¦οΏ½?�義します。

δΎ‹γˆγ°γ€γ“οΏ½? Greeting γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ι–’ζ•°γ«ζ›Έγζ›γˆγŸγ„γ¨γ—γΎγ™γ€‚

import { Component } from 'react';

class Greeting extends Component {
  render() {
    return <h1>Hello, {this.props.name}!</h1>;
  }
}

export default function App() {
  return (
    <>
      <Greeting name="Sara" />
      <Greeting name="Cahal" />
      <Greeting name="Edite" />
    </>
  );
}

Greeting という閒数を�?�義してください。ここに render ι–’ζ•°οΏ½?ζœ¬δ½“γ‚’η§»ε‹•γ—γΎγ™γ€‚

function Greeting() {
// ... move the code from the render method here ...
}

this.props.name γ¨γ™γ‚‹δ»£γ‚γ‚Šγ«γ€props である name γ―εˆ†ε‰²δ»£ε…₯構文を使用して�?�義し、直ζŽ₯θͺ­γΏε–γ‚ŠγΎγ™οΌš

function Greeting({ name }) {
return <h1>Hello, {name}!</h1>;
}

οΏ½?οΏ½ε…¨γͺ例はδ»₯δΈ‹οΏ½?ι€šγ‚Šγ§γ™γ€‚

function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}

export default function App() {
  return (
    <>
      <Greeting name="Sara" />
      <Greeting name="Cahal" />
      <Greeting name="Edite" />
    </>
  );
}


state γ‚’ζŒγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚―γƒ©γ‚Ήγ‹γ‚‰ι–’ζ•°γΈη§»θ‘Œ

こ�? Counter γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ι–’ζ•°γ«ζ›Έγζ›γˆγŸγ„γ¨γ—γΎγ™γ€‚

import { Component } from 'react';

export default class Counter extends Component {
  state = {
    name: 'Taylor',
    age: 42,
  };

  handleNameChange = (e) => {
    this.setState({
      name: e.target.value
    });
  }

  handleAgeChange = (e) => {
    this.setState({
      age: this.state.age + 1 
    });
  };

  render() {
    return (
      <>
        <input
          value={this.state.name}
          onChange={this.handleNameChange}
        />
        <button onClick={this.handleAgeChange}>
          Increment age
        </button>
        <p>Hello, {this.state.name}. You are {this.state.age}.</p>
      </>
    );
  }
}

γΎγšγ€εΏ…θ¦γ¨γͺγ‚‹ state 倉数 γ‚’ζŒγ£γŸι–’ζ•°γ‚’οΏ½?�言します。

import { useState } from 'react';

function Counter() {
const [name, setName] = useState('Taylor');
const [age, setAge] = useState(42);
// ...

ζ¬‘γ«γ€γ‚€γƒ™γƒ³γƒˆγƒγƒ³γƒ‰γƒ©γ‚’ζ›Έγζ›γˆγΎγ™γ€‚

function Counter() {
const [name, setName] = useState('Taylor');
const [age, setAge] = useState(42);

function handleNameChange(e) {
setName(e.target.value);
}

function handleAgeChange() {
setAge(age + 1);
}
// ...

ζœ€εΎŒγ«γ€this で始まる倀へ�?ε‚η…§γ‚’γ™γΉγ¦γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§οΏ½?οΏ½ηΎ©γ—γŸε€‰ζ•°γ¨ι–’ζ•°γ«οΏ½?γζ›γˆγΎγ™γ€‚δΎ‹γˆγ°γ€this.state.age γ‚’ age に、this.handleNameChange γ‚’ handleNameChange に�?γζ›γˆγΎγ™γ€‚

οΏ½?οΏ½ε…¨γ«ζ›Έγζ›γˆγ‚‰γ‚ŒγŸγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ“γ‘γ‚‰γ§γ™γ€‚

import { useState } from 'react';

export default function Counter() {
  const [name, setName] = useState('Taylor');
  const [age, setAge] = useState(42);

  function handleNameChange(e) {
    setName(e.target.value);
  }

  function handleAgeChange() {
    setAge(age + 1);
  }

  return (
    <>
      <input
        value={name}
        onChange={handleNameChange}
      />
      <button onClick={handleAgeChange}>
        Increment age
      </button>
      <p>Hello, {name}. You are {age}.</p>
    </>
  )
}


γƒ©γ‚€γƒ•γ‚΅γ‚€γ‚―γƒ«γƒ‘γ‚½γƒƒγƒ‰γ‚’ζŒγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚―γƒ©γ‚Ήγ‹γ‚‰ι–’ζ•°γΈη§»θ‘Œ

γƒ©γ‚€γƒ•γ‚΅γ‚€γ‚―γƒ«γƒ‘γ‚½γƒƒγƒ‰γ‚’ζŒγ€δ»₯δΈ‹οΏ½? ChatRoom γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ι–’ζ•°γ«ζ›Έγζ›γˆγŸγ„γ¨γ—γΎγ™γ€‚

import { Component } from 'react';
import { createConnection } from './chat.js';

export default class ChatRoom extends Component {
  state = {
    serverUrl: 'https://localhost:1234'
  };

  componentDidMount() {
    this.setupConnection();
  }

  componentDidUpdate(prevProps, prevState) {
    if (
      this.props.roomId !== prevProps.roomId ||
      this.state.serverUrl !== prevState.serverUrl
    ) {
      this.destroyConnection();
      this.setupConnection();
    }
  }

  componentWillUnmount() {
    this.destroyConnection();
  }

  setupConnection() {
    this.connection = createConnection(
      this.state.serverUrl,
      this.props.roomId
    );
    this.connection.connect();    
  }

  destroyConnection() {
    this.connection.disconnect();
    this.connection = null;
  }

  render() {
    return (
      <>
        <label>
          Server URL:{' '}
          <input
            value={this.state.serverUrl}
            onChange={e => {
              this.setState({
                serverUrl: e.target.value
              });
            }}
          />
        </label>
        <h1>Welcome to the {this.props.roomId} room!</h1>
      </>
    );
  }
}

まずは componentWillUnmount が componentDidMount οΏ½?逆�?ε‹•δ½œγ‚’γ—γ¦γ„γ‚‹γ“γ¨γ‚’η’Ίθͺγ—γ¦γγ γ•γ„γ€‚δΈŠθ¨˜οΏ½?例では componentDidMount γ«γ‚ˆγ£γ¦η’Ίη«‹γ•γ‚ŒγŸζŽ₯ηΆšγ‚’εˆ‡ζ–­γ—γ¦γ„γ‚‹οΏ½?で、そうγͺっています。そ�?γ‚ˆγ†γͺγƒ­γ‚Έγƒƒγ‚―γŒε­˜εœ¨γ—γͺγ„ε ΄εˆγ€γΎγšγγ‚Œγ‚’θΏ½εŠ γ—γ¦γγ γ•γ„γ€‚

欑に、componentDidUpdate γƒ‘γ‚½γƒƒγƒ‰γŒγ€componentDidMount で使用している props と state οΏ½?倉更を処理していることを璺θͺγ—γ¦γγ γ•γ„γ€‚δΈŠθ¨˜οΏ½?例では、componentDidMount は setupConnection γ‚’ε‘Όγ³ε‡Ίγ—γ¦γŠγ‚Šγ€γγ‚ŒγŒ this.state.serverUrl と this.props.roomId γ‚’θͺ­γΏε–γ£γ¦γ„γΎγ™γ€‚γ—γŸγŒγ£γ¦ componentDidUpdate γ‚‚ this.state.serverUrl と this.props.roomId γŒε€‰ζ›΄γ•γ‚ŒγŸγ‹γ©γ†γ‹γ‚’η’Ίθͺγ—γ€ε€‰ζ›΄γŒγ‚γ£γŸε ΄εˆγ―ζŽ₯ηΆšγ‚’ε†η’Ίη«‹γ—γͺγ‘γ‚Œγ°γͺγ‚ŠγΎγ›γ‚“γ€‚componentDidUpdate οΏ½?γƒ­γ‚Έγƒƒγ‚―γŒε­˜εœ¨γ—γͺい、あるいは閒連するすべて�? props と state οΏ½?倉更を処理できていγͺγ„ε ΄εˆγ―γ€γΎγšγγ‚Œγ‚’οΏ½?正してください。

上記�?例では、ラむファむクルパソッド内�?ロジックは、React οΏ½?倖部�?γ‚·γ‚Ήγƒ†γƒ οΌˆγƒγƒ£γƒƒγƒˆγ‚΅γƒΌγƒοΌ‰γ«γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ζŽ₯ηΆšγ—γ¦γ„γΎγ™γ€‚γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ε€–ιƒ¨γ‚·γ‚Ήγƒ†γƒ γ«ζŽ₯ηΆšγ™γ‚‹γŸγ‚γ«γ―γ€γ“οΏ½?γƒ­γ‚Έγƒƒγ‚―γ‚’ε˜δΈ€οΏ½?γ‚¨γƒ•γ‚§γ‚―γƒˆγ¨γ—γ¦θ¨˜θΏ°γ—γΎγ™γ€‚

import { useState, useEffect } from 'react';

function ChatRoom({ roomId }) {
const [serverUrl, setServerUrl] = useState('https://localhost:1234');

useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.connect();
return () => {
connection.disconnect();
};
}, [serverUrl, roomId]);

// ...
}

こ�? useEffect οΏ½?ε‘Όγ³ε‡Ίγ—γ―γ€δΈŠθ¨˜οΏ½?ラむファむクルパソッド内�?γƒ­γ‚Έγƒƒγ‚―γ¨εŒη­‰γ§γ™γ€‚γƒ©γ‚€γƒ•γ‚΅γ‚€γ‚―γƒ«γƒ‘γ‚½γƒƒγƒ‰γŒθ€‡ζ•°οΏ½?互いに閒連しγͺγ„γ“γ¨γ‚’θ‘Œγ£γ¦γ„γ‚‹ε ΄εˆγ―γ€γγ‚Œγ‚‰γ‚’θ€‡ζ•°οΏ½?η‹¬η«‹γ—γŸγ‚¨γƒ•γ‚§γ‚―γƒˆγ«εˆ†ε‰²γ—γ¦γγ γ•γ„γ€‚δ»₯下に�?οΏ½ε…¨γͺ例を瀺します。

import { useState, useEffect } from 'react';
import { createConnection } from './chat.js';

export default function ChatRoom({ roomId }) {
  const [serverUrl, setServerUrl] = useState('https://localhost:1234');

  useEffect(() => {
    const connection = createConnection(serverUrl, roomId);
    connection.connect();
    return () => {
      connection.disconnect();
    };
  }, [roomId, serverUrl]);

  return (
    <>
      <label>
        Server URL:{' '}
        <input
          value={serverUrl}
          onChange={e => setServerUrl(e.target.value)}
        />
      </label>
      <h1>Welcome to the {roomId} room!</h1>
    </>
  );
}

補袳

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒε€–ιƒ¨γ‚·γ‚Ήγƒ†γƒ γ¨οΏ½?εŒζœŸγ‚’θ‘Œγ‚γͺγ„ε ΄εˆγ€γ‚¨γƒ•γ‚§γ‚―γƒˆγ―εΏ…θ¦γͺγ„γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γ€‚


γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’ζŒγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚―γƒ©γ‚Ήγ‹γ‚‰ι–’ζ•°γΈη§»θ‘Œ

δ»₯δΈ‹οΏ½?δΎ‹γ§γ―γ€γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γ‚γ‚‹ Panel と Button γŒγ€this.context γ‹γ‚‰γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–っています。

import { createContext, Component } from 'react';

const ThemeContext = createContext(null);

class Panel extends Component {
  static contextType = ThemeContext;

  render() {
    const theme = this.context;
    const className = 'panel-' + theme;
    return (
      <section className={className}>
        <h1>{this.props.title}</h1>
        {this.props.children}
      </section>
    );    
  }
}

class Button extends Component {
  static contextType = ThemeContext;

  render() {
    const theme = this.context;
    const className = 'button-' + theme;
    return (
      <button className={className}>
        {this.props.children}
      </button>
    );
  }
}

function Form() {
  return (
    <Panel title="Welcome">
      <Button>Sign up</Button>
      <Button>Log in</Button>
    </Panel>
  );
}

export default function MyApp() {
  return (
    <ThemeContext.Provider value="dark">
      <Form />
    </ThemeContext.Provider>
  )
}

γ“γ‚Œγ‚‰γ‚’ι–’ζ•°γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«ε€‰ζ›γ™γ‚‹ε ΄εˆγ€this.context γ‚’ useContext οΏ½?呼び出しに�?γζ›γˆγΎγ™γ€‚

import { createContext, useContext } from 'react';

const ThemeContext = createContext(null);

function Panel({ title, children }) {
  const theme = useContext(ThemeContext);
  const className = 'panel-' + theme;
  return (
    <section className={className}>
      <h1>{title}</h1>
      {children}
    </section>
  )
}

function Button({ children }) {
  const theme = useContext(ThemeContext);
  const className = 'button-' + theme;
  return (
    <button className={className}>
      {children}
    </button>
  );
}

function Form() {
  return (
    <Panel title="Welcome">
      <Button>Sign up</Button>
      <Button>Log in</Button>
    </Panel>
  );
}

export default function MyApp() {
  return (
    <ThemeContext.Provider value="dark">
      <Form />
    </ThemeContext.Provider>
  )
}