この投稿は元々、2023 年 2 月 23 日に私のブログ ページで公開されたものです
私は、テクノロジー企業による最近の人員削減の影響を受けた開発者の一人です。そこで、react でフロントエンドのポジションの面接を受け始めました。
ある会社で、私は React における古典的なプロップドリルの問題を与えられました。
そしてそれを解決するように求められました。物事を簡単にするために、与えられた問題は次のようなものでした
これ:
export default function App() { const [user, setUser] = React.useState(null); const handleLogin = () => setUser(userDetails); return ( <div classname="App"> Company Logo <div> {user ? ( <dashboard user="{user}"></dashboard> ) : ( <button onclick="{handleLogin}">Login</button> )} </div> </div> ); } function Dashboard({ user }) { return ( <div> <dashboardnav user="{user}"></dashboardnav> </div> ); } function DashboardNav({ user }) { return ( <div> <welcomeuser user="{user}"></welcomeuser> <userrole user="{user}"></userrole> </div> ); } function WelcomeUser({ user }) { return <div>Welcome {user.name}</div>; } function UserRole({ user }) { return <div>Role {user.role}</div>; }
ご覧のとおり、ユーザープロパティを App コンポーネントから
に渡しています。
子コンポーネント WelcomeUser および UserRole。中間コンポーネントである Dashboard と DashboardNav は、props を転送するだけであり、実際には使用しません。
これは、React における古典的な プロップ ドリル の問題です。
興味深いことに、インタビュアーは React Context API のいずれかを使用して問題を解決するよう求めました
または Redux を使用します。
React コンテキストによる解決
コンテキスト API を使用してこの問題を解決すると、以下のコードのようになります。
const UserContext = React.createContext(undefined); export default function App() { const [user, setUser] = React.useState(null); const handleLogin = () => setUser(userDetails); return ( <div classname="App"> Company Logo: Context <div> {user ? ( <usercontext.provider value="{user}"> <dashboard></dashboard> </usercontext.provider> ) : ( <button onclick="{handleLogin}">Login</button> )} </div> </div> ); } function Dashboard() { return ( <div> <dashboardnav></dashboardnav> </div> ); } function DashboardNav() { return ( <div> <welcomeuser></welcomeuser> <userrole></userrole> </div> ); } function WelcomeUser() { const user = React.useContext(UserContext); return <div>Welcome {user.name}</div>; } function UserRole() { const user = React.useContext(UserContext); return <div>Role {user.role}</div>; }
UserContext を作成し、プロバイダーでダッシュボードをラップしています。
必要なプロパティを深くネストされた子コンポーネントに渡すことができます。この解決策
動作します。
Reduxによる解決
したがって、古典的な Redux ルートを進む場合は、同様の
を作成する必要があります。
を構造化し、ユーザー
を含む単一のグローバル ストアですべてをラップします。
物体。
には redux を使用しているため、ソリューション コードには大量の定型文が含まれることになります。
簡単な問題を解決します。
以下にコードの要点を示しましたが、実際に完全に調べたい場合は、
コード、どうぞ: redux で解決します。
export default function App() { return ( <provider store="{store}"> <reduxconnectedapp></reduxconnectedapp> </provider> ); } function ReduxApp({ user, setUser }) { const handleLogin = () => setUser(userDetails); return ( <div classname="App"> Company Logo: Redux <div> {user ? <dashboard></dashboard> : <button onclick="{handleLogin}">Login</button>} </div> </div> ); } function Dashboard() { return ( <div> <dashboardnav></dashboardnav> </div> ); } function DashboardNav() { return ( <div> <connectedwelcomeuser></connectedwelcomeuser> <connecteduserrole></connecteduserrole> </div> ); } function WelcomeUser({ user }) { return <div>Welcome {user.name}</div>; } const mapStateToPropsWelcomeUser = (state) => ({ user: state }); const ConnectedWelcomeUser = connect(mapStateToPropsWelcomeUser)(WelcomeUser); function UserRole({ user }) { return <div>Role {user.role}</div>; } const mapStateToPropsUserRole = (state) => ({ user: state }); const ConnectedUserRole = connect(mapStateToPropsUserRole)(UserRole);
グローバル状態へのアクセスが必要なコンポーネントを接続しました
redux に保存されます。
どうやって解決したか
反応構成について読んだので、次のようにして問題を解決しました
子プロップの使用は次のようになります
export default function AppSolution() { const [user, setUser] = React.useState(null); const handleLogin = () => setUser(userDetails); return ( <div classname="App"> Company Logo <div> {user ? ( <dashboard> <dashboardnav> <welcomeuser user="{user}"></welcomeuser> <userrole user="{user}"></userrole> </dashboardnav> </dashboard> ) : ( <button onclick="{handleLogin}">Login</button> )} </div> </div> ); } function Dashboard({ children }) { return <div>{children}</div>; } function DashboardNav({ children }) { return <div>{children}</div>; } function WelcomeUser({ user }) { return <div>Welcome {user.name}</div>; } function UserRole({ user }) { return <div>Role {user.role}</div>; }
考えてみれば、これは導入せずにこの問題を解決する簡単な方法です
createContextやreact-reduxなどの複雑さ。その他にも次のような特典があります
- 将来的に、ダッシュボード内に状態を導入して操作すると、 DashboardNav は再レンダリングされません。
- 必要なコンポーネントにのみ小道具を提供することで、良好な可視性が得られます。 ユーザーのすべてのコンシューマーのコンポーネント (ファイル) 間を移動する必要がなく、 探してください。
このパターンは新しいものではなく、すでに反応コミュニティで話題になっています。そのような優れたチュートリアルの 1 つは、React でコンポジションを使用して「プロップ ドリル」を回避することです
結論
しかし、面接官からのフィードバックは次のとおりです
インタビュー対象者は問題を正しく理解しておらず、期待された解決策を提供できませんでした。
その理由は、面接官がこのパターンに気づいていないか、私が求められていない方法で問題を解決しようとしたかのどちらかだと思います。
そうは言っても、私は今、react の興味深いパターンについてもっと書きたいと思っています。それがより多くの読者に届くことを願っています。
この記事を共有して、ご意見をお聞かせください。
参考文献
- コードサンドボックス ソリューション
- コンテキストを使用する前に - React Docs
- React でコンポジションを使用して「プロップドリル」を回避する
- ブログに掲載された回答: React レンダリング動作の (ほぼ) 完全なガイド
- ブログに掲載された回答: React Context が「状態管理」ツールではない理由 (そして Redux に代わらない理由)
以上がコンテキスト、Redux、それとも合成?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

Dreamweaver Mac版
ビジュアル Web 開発ツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
