私の React の旅は 4 年前に機能コンポーネントとフックから始まりました。次に、ブートキャンプの参加者であり、常駐クラスのコンポーネントの愛好家である 'Siswe 氏がやって来ました。私たちの残りのメンバーが機能コンポーネントを使用したチーム プロジェクトで共同作業している間、「Siswe は揺るぎない忠誠心でクラス コンポーネントにしがみつきました。
」これらをレゴ ブロックと考えてください。さまざまな方法で組み合わせて、複雑な構造を作成できます。これらは、UI とロジックをカプセル化する独立した再利用可能なコード部分です。
別のコンポーネント内でコンポーネントを再利用する場合、通常は次のようになります:
import MyComponent from './MyComponent'; function ParentComponent() { return (); }
クラス コンポーネントと関数コンポーネントは、React でコンポーネントを作成する 2 つの主な方法です。
import React, { Component } from 'react'; class Counter extends Component { constructor(props) { super(props); this.state = { count: 0 }; } handleClick = () => { this.setState({ count: this.state.count 1 }); }; render() { return (); } } export default Counter;You clicked {this.state.count} times
これは、React.Component クラスを拡張する JavaScript クラスを使用して作成されたクラス コンポーネントです。
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); const handleClick = () => { setCount(count 1); }; return (); } export default Counter;You clicked {count} times
一方、これは機能コンポーネントであり、単純な JavaScript 関数として記述されます。
クラス コンポーネントは、this.state を使用して独自の内部状態を管理します。上記のコード ブロックに見られるように、これは通常、コンストラクターで初期化され、this.state オブジェクトを使用してアクセスされ、this.setState メソッドを使用して更新されます。
機能コンポーネントは当初ステートレスでした。しかし、フックの導入により、状態とライフサイクル ロジックを管理できるようになりました。状態を管理するために useState フックを利用して、上記のように、現在の状態とそれを更新する関数という値のペアを返します。単純な状態管理にはこれで十分です。複数のサブ値を含むより複雑な状態ロジックの場合、または次の状態が前の状態に依存する場合は、 useReducer.
を使用します。
例えば:
import React, { useReducer } from 'react'; const initialState = { count: 0, step: 1, }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { ...state, count: state.count state.step }; case 'decrement': return { ...state, count: state.count - state.step }; case 'setStep': return { ...state, step: action.payload }; default: throw new Error(); } }; function Counter() { const [state, dispatch] = useReducer(reducer, initialState); const increment = () => dispatch({ type: 'increment' }); const decrement = () => dispatch({ type: 'decrement' }); const setStep = (newStep) => dispatch({ type: 'setStep', payload: newStep }); return (); } export default Counter;Count: {state.count}
Step: {state.step}
setStep(Number(e.target.value))} />
ここで、useReducer は複数の状態値と複雑な更新ロジックを構造化された保守可能な方法で管理しています。フックは機能部品専用です。
コンポーネントの種類に関係なく、状態オブジェクトを直接変更または変更しないでください。代わりに、更新された値を使用して新しいオブジェクトを作成します。このアプローチは、React が変更を効率的に追跡し、再レンダリングを最適化するのに役立ちます。
機能要素の例:
import React, { useState } from 'react'; function UserProfile() { const [user, setUser] = useState({ name: 'Jane Doe', age: 30 }); const handleNameChange = (newName) => { setUser({ ...user, name: newName }); // Create a new object with updated name }; return (); } export default UserProfile;Name: {user.name}
Age: {user.age}
handleNameChange(e.target.value)} />
クラスコンポーネントの例:
import React, { Component } from 'react'; class UserProfile extends Component { state = { user: { name: 'Jane Doe', age: 30 } }; handleNameChange = (newName) => { this.setState(prevState => ({ user: { ...prevState.user, name: newName } // Create a new object with updated name })); }; render() { return (); } } export default UserProfile;Name: {this.state.user.name}
Age: {this.state.user.age}
this.handleNameChange(e.target.value)} />
どちらの例でも、元のオブジェクトの整合性を維持しながら、ユーザー オブジェクトの name プロパティを更新しています。これにより、新しい状態オブジェクトが確実に作成され、不変性が維持され、状態の更新に関する潜在的な問題が防止されます。これに従うことで、予測可能な動作、パフォーマンスの最適化、およびデバッグの容易化が保証されます。
一般に、関数型アプローチの方が簡潔で読みやすいと考えられており、単純さと効率のおかげで十分であることがよくあります。ただし、クラス コンポーネントは、特に複雑なロジックやパフォーマンスの最適化を扱う場合に、状態管理とライフサイクル メソッドをより詳細に制御できます。これは、複雑なロジックを整理するためのより良い構造を意味します。
厳密なルールがないため、クラス コンポーネントと機能コンポーネントのどちらを選択するかは必ずしも明確ではありません。コンポーネントの要件を評価し、プロジェクトの要件に最も適合するタイプを選択してください。
どのコンポーネントを使って作業するのが一番楽しいですか?
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3