Remix で依存関係の注入を実装する
Remix で依存関係の注入を実装するために必要ですcontext
。簡単な例を次に示します。
- まず、プロジェクトのルート ディレクトリにファイルを作成します
context.js
。
import React from 'react';
const DependenciesContext = React.createContext({
});
function useDependencies() {
return React.useContext(DependenciesContext);
}
function DependenciesProvider({
dependencies, children }) {
return (
<DependenciesContext.Provider value={
dependencies}>
{
children}
</DependenciesContext.Provider>
);
}
export {
DependenciesProvider, useDependencies };
DependenciesContext
ここでは、コンテキストとuseDependencies
カスタム フックが作成され、DependenciesProvider
名前付きのコンポーネントも作成されます。
DependenciesProvider
コンポーネントは、React.createContext
コンテキスト オブジェクトの作成に使用するコンテキスト プロバイダーです。また、dependencies
すべての依存関係を渡すために使用されるオブジェクトである という名前のプロップもあります。
- 次に、プロジェクトのルート コンポーネント (たとえば
App.js
、 ) で次を使用しますDependenciesProvider
。
import React from 'react';
import {
DependenciesProvider } from './context';
function App() {
const dependencies = {
// 将依赖项放在此处
userService: {
getUsers: async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/users');
const users = await response.json();
return users;
},
},
};
return (
<DependenciesProvider dependencies={
dependencies}>
{
/* 在此处放置你的根组件 */}
</DependenciesProvider>
);
}
export default App;
ここでは、メソッドを定義する依存関係をdependencies
含むオブジェクトが作成されます。userService
getUsers
DependenciesProvider
このコンポーネントはルート コンポーネントをラップし、それを propdependencies
として渡しますdependencies
。コンテキストが設定され、子コンポーネントでフックを使用できるようになりましたuseDependencies
。
- これで、1 つ以上の依存関係にアクセスする必要があるコンポーネントで
useDependencies
フックを使用できるようになりました。
import React from 'react';
import {
useDependencies } from './context';
function UserList() {
const {
userService } = useDependencies();
const [users, setUsers] = React.useState([]);
React.useEffect(() => {
userService.getUsers().then(setUsers);
}, [userService]);
return (
<ul>
{
users.map(user => (
<li key={
user.id}>{
user.name}</li>
))}
</ul>
);
}
export default UserList;
ここのコンポーネントはフックUserList
を使用して依存関係を取得し、メソッドを使用して API からユーザー リストを取得し、それをローカル状態に保存します。次に、ユーザーの一覧を簡易リストで表示します。useDependencies
userService
getUsers
Remixをベースとした依存性注入の基礎知識です。
Next.js で依存関係の注入を実装する
Next.js は、サーバーでレンダリングされる React アプリケーションを迅速に構築できる React フレームワークです。_app.js
Next.js での依存関係の注入は、通常、ファイル内のメソッドを使用して実現されますgetInitialProps()
。getInitialProps()
依存関係を注入し、小道具として任意のコンポーネントに渡すことができます。
getInitialProps()
Next.js で依存関係注入のメソッドを使用する方法を示す簡単な例を次に示します。
// _app.js
import React from 'react';
import App from 'next/app';
import {
MyContext } from '../context';
class MyApp extends App {
static async getInitialProps({
Component, ctx }) {
const {
req } = ctx;
const myService = new MyService(req); // 实例化一个服务
const pageProps = Component.getInitialProps ? await Component.getInitialProps(ctx) : {
};
return {
pageProps, myService }; // 注入服务作为 props
}
render() {
const {
Component, pageProps, myService } = this.props;
return (
<MyContext.Provider value={
myService}>
<Component {
...pageProps} />
</MyContext.Provider>
);
}
}
export default MyApp;
この例では、サービスをインスタンス化し、それを のgetInitialProps()
戻り値に注入します。次に、 で_app.js
サービスをコンテキストでラップし、それを小道具としてコンポーネントに渡します。
次に、コンポーネントで、useContext()
次のようなフックを使用してサービスにアクセスできます。
// MyComponent.js
import React, {
useContext } from 'react';
import {
MyContext } from '../context';
function MyComponent() {
const myService = useContext(MyContext);
// 使用 myService 来执行业务逻辑
return (
// 组件的 JSX
);
}
export default MyComponent;
これは、単純な Next.js 依存関係注入の例です。getInitialProps()
実際のアプリケーションでは、より複雑なソリューションを使用する必要がある場合がありますが、この例では、依存関係の注入を実現するためのコンテキストの使用方法を示します。
比較の概要
Remix と Next.js はどちらも依存関係の注入を実装できますが、両者の間には次のような違いがあります。
-
実装方法は異なります。Remix は独自の特別な注入メソッドを使用しますが、Next.js はサードパーティ ライブラリ awilix を使用して依存関係注入を実装します。
-
目標は異なります。Remix の主な目標は、開発効率を向上させ、手動処理の必要性をできる限り減らすことですが、Next.js の主な目標は、開発者が迅速に開発できるようにするシンプルで強力なフレームワークを提供することです。複雑なアプリケーションを構築します。
-
アクセスは異なります。Remix は、任意のコンポーネントに依存関係を注入できるグローバル注入関数を提供しますが、Next.js ではアプリケーションのコンストラクターに依存関係を注入する必要があります。
-
柔軟性の違い: Remix は、コンポーネント間で状態やロジックを共有するなど、より多くの自動化機能を提供しますが、Next.js はより柔軟で、必要に応じて依存関係を自由に構成できます。
一般に、Remix はシンプルさと自動化に重点を置いており、Next.js は柔軟性と構成可能性に重点を置いています。開発者は、ニーズと好みに基づいてこれらの実装の 1 つを選択できます。Remix と Next.js はどちらも依存関係の注入を実装できますが、両者の間には次のような違いがあります。
-
実装方法は異なります。Remix は独自の特別な注入メソッドを使用しますが、Next.js はサードパーティ ライブラリ awilix を使用して依存関係注入を実装します。
-
目標は異なります。Remix の主な目標は、開発効率を向上させ、手動処理の必要性をできる限り減らすことですが、Next.js の主な目標は、開発者が迅速に開発できるようにするシンプルで強力なフレームワークを提供することです。複雑なアプリケーションを構築します。
-
アクセスは異なります。Remix は、任意のコンポーネントに依存関係を注入できるグローバル注入関数を提供しますが、Next.js ではアプリケーションのコンストラクターに依存関係を注入する必要があります。
-
柔軟性の違い: Remix は、コンポーネント間で状態やロジックを共有するなど、より多くの自動化機能を提供しますが、Next.js はより柔軟で、必要に応じて依存関係を自由に構成できます。
一般に、Remix はシンプルさと自動化に重点を置いており、Next.js は柔軟性と構成可能性に重点を置いています。開発者は、ニーズと好みに基づいてこれらの実装の 1 つを選択できます。