状態管理
グローバルな状態管理は、アプリケーション全体で共有されるデータを効率的に管理する方法です。SolidJS では、アプリケーションの異なる部分間で状態を共有するために、createSignal
やcreateStore
などのリアクティブプリミティブと、Context
API を使用します。このセクションでは、SolidJS でのグローバルな状態管理の基本について、具体例を通じて学びます。
Context API の使用
Context API を使用することで、プロパティを手動で渡すことなく、コンポーネントツリーを通じてデータを効率的に共有できます。これは、テーマ、言語設定、認証情報などのグローバルなデータに特に有用です。
- Context の作成と提供:
まず、新しい Context を作成し、アプリケーションの他の部分で使用できるようにします。src/contexts/UserContext.js
を作成し、以下のコードを追加します。import { createContext, useContext } from 'solid-js'; const UserContext = createContext(); export function UserProvider(props) { const [user, setUser] = createStore({ name: 'John Doe', age: 30 }); const store = { user, setUser, }; return ( <UserContext.Provider value={store}> {props.children} </UserContext.Provider> ); } export function useUser() { return useContext(UserContext); }
このコードは、ユーザー情報を格納するための Context を作成し、それを提供するUserProvider
コンポーネントと、その Context を使用するカスタムフックuseUser
を定義しています。 - Provider でアプリケーションをラップする:
アプリケーションのルートレベルでUserProvider
を使用して、コンテキストを提供します。src/App.js
を開き、UserProvider
でアプリケーションをラップします。import { UserProvider } from './contexts/UserContext'; function App() { return <UserProvider>{/* アプリケーションのその他の部分 */}</UserProvider>; } export default App;
Context の使用
Context に保存されたデータは、コンポーネントツリー内の任意の場所で簡単にアクセスできます。
- Context のデータを使用するコンポーネントの作成:
src/components/UserProfile.js
を作成し、以下のコードを追加します。import { useUser } from '../contexts/UserContext'; function UserProfile() { const { user, setUser } = useUser(); const updateAge = () => { setUser('age', (prev) => prev + 1); }; return ( <div> <p>Name: {user.name}</p> <p>Age: {user.age}</p> <button onClick={updateAge}>Increment Age</button> </div> ); } export default UserProfile;
このコンポーネントは、useUser
フックを使用してUserContext
からユーザー情報にアクセスし、それを表示します。また、ボタンをクリックすることでユーザーの年齢を増加させる機能も提供します。