Dependency Injection is a common pattern implemented in many frameworks and libraries. At a glance, React doesn’t seem to be. But really, React has support for built-in dependency injection, JSX, you must be using it.
Dependency Injection in short
Dependency Injection solves a common problem: “hardcoded dependencies” – that is, the dependencies are fixed hard in the code. When an object A depends on an object B and then create a second object, then the dependency cannot be changed (because it has been hardcode).
For example, the Calculator
class creates a logger
service, which is hard fixed as ConsoleLogger
, and cannot be changed later:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">import</span> ConsoleLogger <span class="token keyword">from</span> <span class="token string">"./ConsoleLogger"</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Calculator</span> <span class="token punctuation">{</span> <span class="token function">constructor</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> logger <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ConsoleLogger</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">add</span> <span class="token punctuation">(</span> a <span class="token punctuation">,</span> b <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> logger <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`Adding </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> a <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> to </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> b <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> a <span class="token operator">+</span> b <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
However, when implementing this test class, developers want to “mock” this service logger component (no longer log out to the console, for example). Or when running production, they want to use SysLogger or another logger example of Sentry (SaaS logger) is not possible because the dependency has been hardcode.
We can solve the above problem with a commit using Dependency Injection as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token operator">-</span> <span class="token keyword">import</span> ConsoleLogger <span class="token keyword">from</span> <span class="token string">'./ConsoleLogger'</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Calculator</span> <span class="token punctuation">{</span> <span class="token operator">-</span> <span class="token function">constructor</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">-</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> logger <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ConsoleLogger</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token operator">-</span> <span class="token punctuation">}</span> <span class="token operator">+</span> <span class="token function">constructor</span> <span class="token punctuation">(</span> logger <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">+</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> logger <span class="token operator">=</span> logger <span class="token punctuation">;</span> <span class="token operator">+</span> <span class="token punctuation">}</span> <span class="token function">add</span> <span class="token punctuation">(</span> a <span class="token punctuation">,</span> b <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> logger <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`Adding </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> a <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> to </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> b <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> a <span class="token operator">+</span> b <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Now dependency no longer depends on when object A creates object B:
1 2 3 4 | <span class="token keyword">const</span> logger <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ConsoleLogger</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> calculator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Calculator</span> <span class="token punctuation">(</span> logger <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> result <span class="token operator">=</span> calculator <span class="token punctuation">.</span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// console hiển thị "Adding 1 to 2"</span> |
And so developers can easily change the dependency later:
1 2 3 4 | <span class="token keyword">const</span> logger <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">NullLogger</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> calculator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Calculator</span> <span class="token punctuation">(</span> logger <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> result <span class="token operator">=</span> calculator <span class="token punctuation">.</span> <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// console shows nothing</span> |
Thanks to Dependency Injection, the code appears to be cleaner, more modularized. Angular has a buil-in Dependency Injection Container, so is Symfony and Spring . But it seems React.js doesn’t?
JSX supports Dependency Injection
React supports Dependency Injection without dependency injection containers (like Angular), thanks to JSX.
Take a look at component render product reviews in the table below:
Here is the code render table:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">const</span> <span class="token function-variable function">ReviewList</span> <span class="token operator">=</span> props <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> List</span> <span class="token attr-name">resource</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> reviews <span class="token punctuation">"</span></span> <span class="token attr-name">perPage</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> <span class="token number">50</span> <span class="token punctuation">}</span></span> <span class="token spread"><span class="token punctuation">{</span> <span class="token punctuation">...</span> <span class="token attr-value">props</span> <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Datagrid</span> <span class="token attr-name">rowClick</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> edit <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> DateField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> date <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> CustomerField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> customer_id <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> ProductField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> product_id <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> RatingField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> rating <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> TextField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> body <span class="token punctuation">"</span></span> <span class="token attr-name">label</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> Comment <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> StatusField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> status <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> Datagrid</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> List</span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
The <List> component retrieves data from the route /review/
in a REST API and passes a parameter as perPage
. But <List> does not implement institute render table reviews. Instead, it lets the child components render: <DataGrid>. That means that <List> depends on <DataGrid> for the render, a paren-child relationship has been created here, Dependency Injection.
And like all other types of Dependency Injection, we can change the “dependency” very easily. For example, in the above example, if we want to change the render component to a “simple list” instead of a “data grid”, we just need to replace the child of <List> with another component:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">import</span> <span class="token punctuation">{</span> List <span class="token punctuation">,</span> Datagrid <span class="token punctuation">,</span> TextField <span class="token punctuation">,</span> DateField <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react-admin'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token function-variable function">PostList</span> <span class="token operator">=</span> props <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> List</span> <span class="token attr-name">resource</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> posts <span class="token punctuation">"</span></span> <span class="token attr-name">perPage</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> <span class="token number">50</span> <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> SimpleList</span> <span class="token attr-name">primaryText</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> review <span class="token operator">=></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> ItemTitle</span> <span class="token attr-name">record</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> review <span class="token punctuation">}</span></span> <span class="token punctuation">/></span></span> <span class="token punctuation">}</span></span> <span class="token attr-name">secondaryText</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> review <span class="token operator">=></span> review <span class="token punctuation">.</span> body <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> List</span> <span class="token punctuation">></span></span> <span class="token plain-text"> ) </span> |
React even allows injecting more than one dependency in an element. First, because an element can have more than one child. In the previous example, <DataGrid> received a list of columns to be displayed:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">const</span> <span class="token function-variable function">ReviewList</span> <span class="token operator">=</span> props <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> List</span> <span class="token attr-name">resource</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> reviews <span class="token punctuation">"</span></span> <span class="token attr-name">perPage</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> <span class="token number">50</span> <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Datagrid</span> <span class="token attr-name">rowClick</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> edit <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> DateField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> date <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> CustomerField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> customer_id <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> ProductField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> product_id <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> RatingField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> rating <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> TextField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> body <span class="token punctuation">"</span></span> <span class="token attr-name">label</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> Comment <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> StatusField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> status <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> Datagrid</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> List</span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
In addition to injecting with child components, we can also inject through props, as below we can also inject into another DataGrid body:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">const</span> <span class="token function-variable function">ReviewList</span> <span class="token operator">=</span> props <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> List</span> <span class="token attr-name">resource</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> reviews <span class="token punctuation">"</span></span> <span class="token attr-name">perPage</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> <span class="token number">50</span> <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token plain-text"> - </span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Datagrid</span> <span class="token attr-name">rowClick</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> edit <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token plain-text"> + </span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Datagrid</span> <span class="token attr-name">rowClick</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> edit <span class="token punctuation">"</span></span> <span class="token attr-name">body</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> MyDatagridBody</span> <span class="token punctuation">/></span></span> <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> DateField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> date <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> CustomerField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> customer_id <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> ProductField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> product_id <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> RatingField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> rating <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> TextField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> body <span class="token punctuation">"</span></span> <span class="token attr-name">label</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> Comment <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> StatusField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> status <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> Datagrid</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> List</span> <span class="token punctuation">></span></span> <span class="token plain-text"> ) </span> |
And since each dependency is a component, we can also inject the dependency into the dependency, like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">const</span> <span class="token function-variable function">ReviewList</span> <span class="token operator">=</span> props <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> List</span> <span class="token attr-name">resource</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> reviews <span class="token punctuation">"</span></span> <span class="token attr-name">perPage</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> <span class="token number">50</span> <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token plain-text"> <Datagrid rowClick="edit" - body=</span> <span class="token punctuation">{</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> MyDatagridBody</span> <span class="token punctuation">/></span></span> <span class="token punctuation">}</span> <span class="token plain-text"> + body=</span> <span class="token punctuation">{</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> MyDatagridBody</span> <span class="token attr-name">withBulkActions</span> <span class="token punctuation">/></span></span> <span class="token punctuation">}</span> <span class="token plain-text"> > </span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> DateField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> date <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> CustomerField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> customer_id <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> ProductField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> product_id <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> RatingField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> rating <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> TextField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> body <span class="token punctuation">"</span></span> <span class="token attr-name">label</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> Comment <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> StatusField</span> <span class="token attr-name">source</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> status <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> Datagrid</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> List</span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> |
Thus, JSX has got the basic features of a Dependency Injection Container: allowing moving, dynamically replacing dependencies and configuring them.
React Context
Above we saw the use of JSX to implement Dependency Injection in the JSX Template, so what about the service functions? React also encourages the use of components for services. For example, we can pass a translation service using the component’s props:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">const</span> <span class="token function-variable function">englishTranslator</span> <span class="token operator">=</span> message <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> message <span class="token operator">==</span> <span class="token string">"hello.world"</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"Hello, World!"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token string">"Not yet translated"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token function-variable function">Greeting</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> translate <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token punctuation">></span></span> <span class="token punctuation">{</span> <span class="token function">translate</span> <span class="token punctuation">(</span> <span class="token string">"hello.world"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token plain-text">.</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token function-variable function">App</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Greeting</span> <span class="token attr-name">translate</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> englishTranslator <span class="token punctuation">}</span></span> <span class="token punctuation">/></span></span> <span class="token punctuation">;</span> |
However these posts can be cumbersome if the code is large and has nested classes. So React provides another component to declare Dependency Injection as context
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token keyword">import</span> React <span class="token punctuation">,</span> <span class="token punctuation">{</span> useContext <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react"</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token function-variable function">englishMessages</span> <span class="token operator">=</span> message <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> message <span class="token operator">==</span> <span class="token string">"hello.world"</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"Hello, World!"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token string">"Not yet translated"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> TranslationContext <span class="token operator">=</span> React <span class="token punctuation">.</span> <span class="token function">createContext</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token function-variable function">Greeting</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> translate <span class="token operator">=</span> <span class="token function">useContext</span> <span class="token punctuation">(</span> TranslationContext <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token punctuation">></span></span> <span class="token punctuation">{</span> <span class="token function">translate</span> <span class="token punctuation">(</span> <span class="token string">"hello.world"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token plain-text">.</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token function-variable function">App</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> TranslationContext.Provider</span> <span class="token attr-name">value</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> englishMessages <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Greeting</span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> TranslationContext.Provider</span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Conclusion
Why doesn’t React provide a Dependency Injection Container like Angular? Simply because it is not necessary, JSX and context are more than enough to make React apps more modular and testable.
This is one of React’s strong points: even with large and large-scale applications, React can do everything well without requiring large and bulky frameworks (like Angular). ):