編集:の導入によりHooks
、それが行動のライフサイクルの種類だけでなく、機能性成分で状態を実現することが可能です。現在
フックは、クラスを作成せずに状態やその他のReact機能を使用できるようにする新しい機能の提案です。これらはv16.8.0の一部としてReactでリリースされています。
useEffect
フックは、ライフサイクルの動作を複製useState
するために使用でき、状態を関数コンポーネントに格納するために使用できます。
基本的な構文:
useEffect(callbackFunction, [dependentProps]) => cleanupFunction
次のようなフックでユースケースを実装できます
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, []); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
useEffect
コンポーネントがアンマウントされたときに実行される関数を返すこともできます。これを使用して、リスナーのサブスクリプションを解除し、動作を複製できます。componentWillUnmount
。
例:componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, [])
useEffect
特定のイベントを条件とするために、変更を確認するための値の配列をイベントに提供できます。
例:componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== prevState.counter) {
// some action here
}
}
同等のフック
useEffect(() => {
// action here
}, [props.counter]); // checks for changes in the values in this array
この配列を含める場合は、時間の経過とともに変化するコンポーネントスコープのすべての値(props、state)を必ず含めてください。そうしないと、以前のレンダリングの値を参照してしまう可能性があります。
の使用にはいくつかの微妙な点がありuseEffect
ます。APIを確認してくださいHere
。
v16.7.0より前
関数コンポーネントの特性は、Reactsライフサイクル関数またはthis
キーワードにアクセスできないことです。React.Component
ライフサイクル関数を使用する場合は、クラスを拡張する必要があります。
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
}
関数コンポーネントは、追加のロジックを必要とせずにコンポーネントをレンダリングするだけの場合に役立ちます。