React.js in patterns

Long time I was searching for a good front-end framework. Framework that will help me write scalable and easy to maintain UI. Even though React is just a library for rendering it comes with so many benefits that I can easily say “I found it”. And like every thing that I use a lot I started seeing some patterns. Techniques that are applied over and over again and I see in the code of other developers. It’s time that I start documenting, discussing and sharing these patterns.

All the techniques described here are available in github.com/krasimir/react-in-patterns repository. I’ll probably not update this blog post but will continue publishing stuff in GitHub. I’ll also encourage you to comment below, file an issue or directly make a pull request with patterns that you recognize.

Communication

Building with React for a couple of months and you’ll realize that every React component is like a small system that operates on its own. It has its own state, input and output.

Input

The input for a React component is its props. That’s how we pass data to it:

// Title.jsx
class Title extends React.Component {
  render() {
    return <h1>{ this.props.text }</h1>;
  }
};
Title.propTypes = {
  text: React.PropTypes.string
};
Title.defaultProps = {
  text: 'Hello world'
};

// App.jsx
class App extends React.Component {
  render() {
    return <Title text='Hello React' />;
  }
};

The Title component has only one input - text. The parent component (App) should provide it as an attribute while using the </code> tag. There are two additional settings that we see above:</p> <ul> <li><code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">propTypes</code> - defines the type of the props. This helps React telling us when a provided prop is not what we expect.</li> <li><code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">defaultProps</code> - defines the default values of the props. We may require the existence of certain props but for the rest is good practice to set a default value.</li> </ul> <p>There is also <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">props.children</code> property that gives us an access to the child components passed by the owner of the component. For example:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Title</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>text <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>children <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Title text<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token string" style="color:rgb(102,153,0)">'Hello React'</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>span<span class="token operator" style="color:rgb(166,127,89)">></span>community<span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>span<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>Title<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p><em>Notice that if we don’t return <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">{ this.props.children }</code> as part of the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Title</code>‘s render method the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)"><span></code> tag will not be rendered.</em></p> <p>An indirect input to a component may be also the so called <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">context</code>. The whole React tree may have a <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">context</code> object which is accessible by every component. More about that in the dependency injection section.</p> <h3 id="output" style="line-height:1.2em"><span class="headeranchor"></span>Output</h3> <p>The obvious output is the rendered HTML. Visually that’s what we get from a React component. Of course some of the components contain logic that probably sends out transformed data or triggers an action/event in our system. To achieve that we again use component’s props:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Title</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>a onClick<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>logoClicked <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>img src<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token string" style="color:rgb(102,153,0)">'path/to/logo.png'</span> <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>a<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Title logoClicked<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>logoClicked <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token function" style="color:rgb(221,74,104)">logoClicked<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> console<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">log<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token string" style="color:rgb(102,153,0)">'logo clicked'</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>We pass a callback which is invoked from within the component. The <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">logoClicked</code>function above may accept data which is how we transfer information back from the child to parent component.</p> <p>We should mention that there is no API that allow us accessing child’s state. Or in other words we can’t use <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">this.props.children[0].state</code> or something like that. The proper way of retrieving information from the children is by using props (passing callbacks). And that’s a good thing. This approach forces us defining clear APIs and encourage the one-way direction data flow.</p> <h2 id="composition" style="font-size:2em; line-height:1.2em"><span class="headeranchor"></span>Composition</h2> <blockquote style="font-size:0.9em; color:rgb(113,113,113); margin:1em 0px; padding:0px 0px 0px 1.2em; border-left:0.2em solid rgb(197,197,197)"> <p>Source code</p> </blockquote> <p>One of the biggest benefits of React is composability. I personally don’t know a framework that offers such an easy way to create and combine components. In this section we will explore few composition techniques which proved to work well.</p> <p>Let’s get a simple example. Let’s say that we have an application with a header and we want to place a navigation inside. We have three React components - <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">App</code>, <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code>and <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Navigation</code>. They have to be nested into each other so we end up with the following markup:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token operator" style="color:rgb(166,127,89)"><</span>App<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Navigation<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>Navigation<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>Header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>App<span class="token operator" style="color:rgb(166,127,89)">></span> </code></code></pre> <p>The trivial approach for combining these components is to reference them in the places where we need them.</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// app.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">import</span> Header from <span class="token string" style="color:rgb(102,153,0)">'./Header.jsx'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Header <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token comment" style="color:rgb(112,128,144)">// Header.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">import</span> Navigation from <span class="token string" style="color:rgb(102,153,0)">'./Navigation.jsx'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Header</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>header<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token operator" style="color:rgb(166,127,89)"><</span>Navigation <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span><span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>header<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token comment" style="color:rgb(112,128,144)">// Navigation.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Navigation</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span><span class="token operator" style="color:rgb(166,127,89)"><</span>nav<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>nav<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> </code></code></pre> <p>However, following this pattern we introduce several problems:</p> <ul> <li>We may consider the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">App</code> as a place where we wire stuff, as an entry point. So, it’s a good place for such composition. The <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> though may have other elements like a logo, search field or a slogan. It will be nice if they are passed somehow from the outside so we don’t create a hard-coded dependency. What if we need the same <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> component but without the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Navigation</code>. We can’t easily achieve that because we have the two bound tightly together.</li> <li>It’s difficult to test. We may have some business logic in the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> and in order to test it we have to create an instance of the component. However, because it imports other components we will probably create instances of those components too and it becomes heavy for testing. We may break our <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> test by doing something wrong in the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Navigation</code> component which is totally misleading. <em>(Note: while testing the shallow rendering solves this problem by rendering only the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> without its nested children.)</em></li> </ul> <h3 id="using-reacts-children-api" style="line-height:1.2em"><span class="headeranchor"></span>Using React’s children API</h3> <p>In React we have the handy <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">this.props.children</code>. That’s how the parent reads/accesses its children. This API will make our Header agnostic and dependency-free:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// App.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Navigation <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>Header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token comment" style="color:rgb(112,128,144)">// Header.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Header</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>header<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>children <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>header<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>It’s also easy to test because we may render the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> with an empty <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)"><div></code>. This will isolate the component and will let us focus on only one piece of our application.</p> <h3 id="passing-a-child-as-a-property" style="line-height:1.2em"><span class="headeranchor"></span>Passing a child as a property</h3> <p>Every React component receive props. It’s nice that these props may contain all kind of data. Even other components.</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// App.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">var</span> title <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span>Hello there<span class="token operator" style="color:rgb(166,127,89)">!</span><span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Header title<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> title <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Navigation <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>Header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token comment" style="color:rgb(112,128,144)">// Header.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Header</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>title <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>hr <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>children <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>This technique is helpful when we have a mix between components that exist inside the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> and components that have to be provided from the outside.</p> <h2 id="higher-order-components" style="font-size:2em; line-height:1.2em"><span class="headeranchor"></span>Higher-order components</h2> <blockquote style="font-size:0.9em; color:rgb(113,113,113); margin:1em 0px; padding:0px 0px 0px 1.2em; border-left:0.2em solid rgb(197,197,197)"> <p>Source code</p> </blockquote> <p>Higher-order components look really similar to the decorator design pattern. It is wrapping a component and attaching some new functionalities or props to it.</p> <p>Here is a function that returns a higher-order component:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">var</span> enhanceComponent <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span>Component<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Enhance</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Component <span class="token punctuation" style="color:rgb(153,153,153)">{</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state<span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> enhanceComponent<span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>Very often we expose a factory function that accepts our original component and when called returns the enhanced/wrapped version of it. For example:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">var</span> OriginalComponent <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>p<span class="token operator" style="color:rgb(166,127,89)">></span>Hello world<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>p<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">createElement<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token function" style="color:rgb(221,74,104)">enhanceComponent<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>OriginalComponent<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>The very first thing that the higher-order component does is to render the original component. It’s also a good practice to pass the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">state</code> and <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">props</code> to it. This is helpful when we want to proxy data and use the higher-order component as it is our original component.</p> <p>The higher-order component gives us control on the input. The data that we want to send as props. Let’s say that we have a configuration setting that <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">OriginalComponent</code>needs:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">var</span> config <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token function" style="color:rgb(221,74,104)">require<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token string" style="color:rgb(102,153,0)">'path/to/configuration'</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">var</span> enhanceComponent <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span>Component<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Enhance</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Component <span class="token punctuation" style="color:rgb(153,153,153)">{</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state<span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">}</span> title<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> config<span class="token punctuation" style="color:rgb(153,153,153)">.</span>appTitle <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>The knowledge for the configuration is hidden into the higher-order component. <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">OriginalComponent</code> knows only that it receives a <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">prop</code> called <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">title</code>. Where it comes from it is not important. That’s a huge advantage because it helps us testing the component in an isolation and provides nice mechanism for mocking. Here is how the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">title</code> may be used:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">var</span> OriginalComponent <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>p<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>title <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>p<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>Higher-order components are involved into another useful pattern - dependency injection.</p> <h2 id="dependency-injection" style="font-size:2em; line-height:1.2em"><span class="headeranchor"></span>Dependency injection</h2> <blockquote style="font-size:0.9em; color:rgb(113,113,113); margin:1em 0px; padding:0px 0px 0px 1.2em; border-left:0.2em solid rgb(197,197,197)"> <p>Source code</p> </blockquote> <p>Big part of the modules/components that we write have dependencies. A proper management of these dependencies is critical for the success of the project. There is a technique (some people consider it as a <em>pattern</em>) called <em>dependency injection</em> that helps solving the problem.</p> <p>In React the need of dependency injector is easily visible. Let’s consider the following application tree:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// Title.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span> <span class="token function" style="color:rgb(221,74,104)">Title<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>title <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token comment" style="color:rgb(112,128,144)">// Header.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">import</span> Title from <span class="token string" style="color:rgb(102,153,0)">'./Title.jsx'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span> <span class="token function" style="color:rgb(221,74,104)">Header<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Title <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token comment" style="color:rgb(112,128,144)">// App.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">import</span> Header from <span class="token string" style="color:rgb(102,153,0)">'./Header.jsx'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">constructor<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">super</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> title<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token string" style="color:rgb(102,153,0)">'React in patterns'</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Header <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>The string “React in patterns” should somehow reach the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Title</code> component. The direct way of doing this is to pass it from <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">App</code> to <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> and then <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Header</code> to pass it to <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Title</code>. However, this may work for these three components but what happens if there are multiple properties and deeper nesting. Lots of components will have to mention properties that they are not interested in.</p> <p>We already saw how the higher-order component may be used to inject data. Let’s use the same technique to inject the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">title</code> variable:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// enhance.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">var</span> title <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token string" style="color:rgb(102,153,0)">'React in patterns'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">var</span> enhanceComponent <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span>Component<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Enhance</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Component <span class="token punctuation" style="color:rgb(153,153,153)">{</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state<span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">}</span> title<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> title <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token comment" style="color:rgb(112,128,144)">// Header.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">import</span> enhance from <span class="token string" style="color:rgb(102,153,0)">'./enhance.jsx'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">import</span> Title from <span class="token string" style="color:rgb(102,153,0)">'./Title.jsx'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">var</span> EnhancedTitle <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token function" style="color:rgb(221,74,104)">enhance<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>Title<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span> <span class="token function" style="color:rgb(221,74,104)">Header<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>EnhancedTitle <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>header<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> </code></code></pre> <p>The <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">title</code> is hidden in a middle layer (higher-order component) where we pass it as a prop to the original <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Title</code> component. That’s all nice but it solves only half of the problem. Now we don’t have to pass the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">title</code> down the tree but how this data will reach the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">enhance.jsx</code> helper.</p> <p>React has the concept of <em>context</em>. The <em>context</em> is something that every component may have access to. It’s something like an event bus but for data. A single model which we can access from everywhere.</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// a place where we'll define the context </span><span class="token keyword" style="color:rgb(0,119,170)">var</span> context <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> title<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token string" style="color:rgb(102,153,0)">'React in patterns'</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">getChildContext<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> context<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> App<span class="token punctuation" style="color:rgb(153,153,153)">.</span>childContextTypes <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> title<span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>string <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token comment" style="color:rgb(112,128,144)">// a place where we need data </span><span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Inject</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">var</span> title <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>context<span class="token punctuation" style="color:rgb(153,153,153)">.</span>title<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> Inject<span class="token punctuation" style="color:rgb(153,153,153)">.</span>contextTypes <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> title<span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>string <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>Notice that we have to specify the exact signature of the context object. With <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">childContextTypes</code> and <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">contextTypes</code>. If those are not specified then the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">context</code> object will be empty. That may be a little bit frustrating because we may have lots of stuff to put there. That’s why it is a good practice that our <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">context</code> is not just a plain object but it has an interface that allows us to store and retrieve data. For example:</p> <p></p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// dependencies.js </span><span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> data<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span><span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>key<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>data<span class="token punctuation" style="color:rgb(153,153,153)">[</span>key<span class="token punctuation" style="color:rgb(153,153,153)">]</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token function" style="color:rgb(221,74,104)">register<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>key<span class="token punctuation" style="color:rgb(153,153,153)">,</span> value<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>data<span class="token punctuation" style="color:rgb(153,153,153)">[</span>key<span class="token punctuation" style="color:rgb(153,153,153)">]</span> <span class="token operator" style="color:rgb(166,127,89)">=</span> value<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> </code></code></pre> Then, if we go back to our example, the very top  <code>App</code> component may look like that: <p></p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">import</span> dependencies from <span class="token string" style="color:rgb(102,153,0)">'./dependencies'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> dependencies<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">register<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token string" style="color:rgb(102,153,0)">'title'</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token string" style="color:rgb(102,153,0)">'React in patterns'</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">getChildContext<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> dependencies<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Header <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> App<span class="token punctuation" style="color:rgb(153,153,153)">.</span>childContextTypes <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> data<span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>object<span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>func<span class="token punctuation" style="color:rgb(153,153,153)">,</span> register<span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>func <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>And our <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Title</code> component gets it’s data through the context:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// Title.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Title</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>context<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span><span class="token string" style="color:rgb(102,153,0)">'title'</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> Title<span class="token punctuation" style="color:rgb(153,153,153)">.</span>contextTypes <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> data<span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>object<span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>func<span class="token punctuation" style="color:rgb(153,153,153)">,</span> register<span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>func <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>Ideally we don’t want to specify the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">contextTypes</code> every time when we need an access to the context. This detail may be wrapped in a higher-order component. And even more, we may write an utility function that is more descriptive and helps us declare the exact wiring. I.e instead of accessing the context directly with <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">this.context.get('title')</code>we ask the higher-order component to get what we need and to pass it as a prop to our component. For example:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// Title.jsx </span><span class="token keyword" style="color:rgb(0,119,170)">import</span> wire from <span class="token string" style="color:rgb(102,153,0)">'./wire'</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span> <span class="token function" style="color:rgb(221,74,104)">Title<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>title <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>h1<span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token function" style="color:rgb(221,74,104)">wire<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>Title<span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token punctuation" style="color:rgb(153,153,153)">[</span><span class="token string" style="color:rgb(102,153,0)">'title'</span><span class="token punctuation" style="color:rgb(153,153,153)">]</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span> <span class="token function" style="color:rgb(221,74,104)">resolve<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>title<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> title <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>The <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">wire</code> function accepts first a React component, then an array with all the needed dependencies (which are <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">register</code>ed already) and then a function which I like to call <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">mapper</code>. It receives what’s stored in the context as a raw data and returns an object which is the actual React props for our component (<code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Title</code>). In this example we just pass what we get - a <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">title</code> string variable. However, in a real app this could be a collection of data stores, configuration or something else. So, it’s nice that we pass exactly what we need and don’t pollute the components with data that they don’t need.</p> <p>Here is how the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">wire</code> function looks like:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">export</span> <span class="token keyword" style="color:rgb(0,119,170)">default</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span> <span class="token function" style="color:rgb(221,74,104)">wire<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>Component<span class="token punctuation" style="color:rgb(153,153,153)">,</span> dependencies<span class="token punctuation" style="color:rgb(153,153,153)">,</span> mapper<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Inject</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">var</span> resolved <span class="token operator" style="color:rgb(166,127,89)">=</span> dependencies<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">map<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>context<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">bind<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>context<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">var</span> props <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token function" style="color:rgb(221,74,104)">mapper<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>resolved<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">createElement<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>Component<span class="token punctuation" style="color:rgb(153,153,153)">,</span> props<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> Inject<span class="token punctuation" style="color:rgb(153,153,153)">.</span>contextTypes <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> data<span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>object<span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>func<span class="token punctuation" style="color:rgb(153,153,153)">,</span> register<span class="token punctuation" style="color:rgb(153,153,153)">:</span> React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>PropTypes<span class="token punctuation" style="color:rgb(153,153,153)">.</span>func <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> Inject<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p><code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Inject</code> is a higher-order component that gets access to the context and retrieves all the items listed under <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">dependencies</code> array. The <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">mapper</code> is a function receiving the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">context</code> data and transforms it to props for our component.</p> <h3 id="final-thoughts-about-dependency-injection" style="line-height:1.2em"><span class="headeranchor"></span>Final thoughts about dependency injection</h3> <p>Most of the solutions for dependency injection in React components are based on context. I think that it’s good to know what happens under the hood. As the time of this writing one of the most popular ways for building React apps involves Redux. The<em>famous</em> <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">connect</code> function and the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Provider</code> there use the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">context</code>.</p> <p>I personally found this technique really useful. It successfully fullfills my dependencies needs and makes my components pure and highly testable.</p> <h2 id="one-way-direction-data-flow" style="font-size:2em; line-height:1.2em"><span class="headeranchor"></span>One-way direction data flow</h2> <blockquote style="font-size:0.9em; color:rgb(113,113,113); margin:1em 0px; padding:0px 0px 0px 1.2em; border-left:0.2em solid rgb(197,197,197)"> <p>Source code</p> </blockquote> <p>One-way direction data flow is a pattern that works nicely with React. It is around the idea that the components do not modify the data that they receive. They only listen for changes in this data and maybe provide the new value but they do not update the actual data store. This update happens following another mechanism in another place and the component just gets rendered with the new value.</p> <p>Let’s for example get a simple <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Switcher</code> component that contains a button. We click it to enable a flag in the system.</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Switcher</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">constructor<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">super</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> flag<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">false</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_onButtonClick <span class="token operator" style="color:rgb(166,127,89)">=</span> e <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">setState<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> flag<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token operator" style="color:rgb(166,127,89)">!</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state<span class="token punctuation" style="color:rgb(153,153,153)">.</span>flag <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>button onClick<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_onButtonClick <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state<span class="token punctuation" style="color:rgb(153,153,153)">.</span>flag <span class="token operator" style="color:rgb(166,127,89)">?</span> <span class="token string" style="color:rgb(102,153,0)">'lights on'</span> <span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token string" style="color:rgb(102,153,0)">'lights off'</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>button<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token comment" style="color:rgb(112,128,144)">// ... and we render it </span><span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Switcher <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>At this moment we have the data inside our component. Or in other words, <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Switcher</code> is the only one place that knows about our <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">flag</code>. Let’s send it out to some kind of a store:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">var</span> Store <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> _flag<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">false</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">set</span><span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>value<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_flag <span class="token operator" style="color:rgb(166,127,89)">=</span> value<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_flag<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Switcher</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">constructor<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">super</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> flag<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">false</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_onButtonClick <span class="token operator" style="color:rgb(166,127,89)">=</span> e <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">setState<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> flag<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token operator" style="color:rgb(166,127,89)">!</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state<span class="token punctuation" style="color:rgb(153,153,153)">.</span>flag <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">onChange<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state<span class="token punctuation" style="color:rgb(153,153,153)">.</span>flag<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>button onClick<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_onButtonClick <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state<span class="token punctuation" style="color:rgb(153,153,153)">.</span>flag <span class="token operator" style="color:rgb(166,127,89)">?</span> <span class="token string" style="color:rgb(102,153,0)">'lights on'</span> <span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token string" style="color:rgb(102,153,0)">'lights off'</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>button<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Switcher onChange<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> Store<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">set</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">bind<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>Store<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>Our <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Store</code> object is a simple singleton where we have helpers for setting and getting the value of the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">_flag</code> property. By passing the getter to the component we are able to update the data externally. More or less our application workflow looks like that:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em">User's input <span class="token operator" style="color:rgb(166,127,89)">|</span> Switcher <span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">-</span><span class="token operator" style="color:rgb(166,127,89)">></span> Store </code></code></pre> <p>Let’s assume that we are saving the flag value to a backend service via the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Store</code>. When the user comes back we have to set a proper initial state. If the user left the flag truthy we have to show <em>“lights on”</em> and not the default <em>“lights off”</em>. Now it gets tricky because we have the data knowledge in two places. The UI and the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Store</code> have their own states. We have to communicate in both directions <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Store ---> Switcher</code> and <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Switcher ---> Store</code>.</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token comment" style="color:rgb(112,128,144)">// ... in App component </span><span class="token operator" style="color:rgb(166,127,89)"><</span>Switcher value<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> Store<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> onChange<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> Store<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">set</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">bind<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>Store<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token comment" style="color:rgb(112,128,144)">// ... in Switcher component </span><span class="token function" style="color:rgb(221,74,104)">constructor<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">super</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>state <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> flag<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>value <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span> </code></code></pre> <p>Our schema changes to the following:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em">User's input <span class="token operator" style="color:rgb(166,127,89)">|</span> Switcher <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">-</span><span class="token operator" style="color:rgb(166,127,89)">></span> Store <span class="token operator" style="color:rgb(166,127,89)">^</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> v Service communicating <span class="token keyword" style="color:rgb(0,119,170)">with</span> our backend </code></code></pre> <p>All this leads to managing two states instead of one. What if the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Store</code> changes its value based on other actions in the system. We have to propagate that change to the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Switcher</code> and we increase the complexity of our app.</p> <p>One-way direction data flow solves this problem. It eliminates the multiple states and deals with only one which is usually inside the store. To achieve that we have to tweak our <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Store</code> object a little bit. We need logic that allows us to subscribe for changes:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">var</span> Store <span class="token operator" style="color:rgb(166,127,89)">=</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> _handlers<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token punctuation" style="color:rgb(153,153,153)">[</span><span class="token punctuation" style="color:rgb(153,153,153)">]</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> _flag<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token string" style="color:rgb(102,153,0)">''</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> onChange<span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>handler<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_handlers<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">push<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>handler<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">set</span><span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>value<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_flag <span class="token operator" style="color:rgb(166,127,89)">=</span> value<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_handlers<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">forEach<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>handler <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token function" style="color:rgb(221,74,104)">handler<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">,</span> <span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token keyword" style="color:rgb(0,119,170)">function</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_flag<span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>Then we will hook our main <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">App</code> component and we’ll re-render it every time when the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Store</code> changes its value:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">App</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">constructor<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">super</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> Store<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">onChange<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>forceUpdate<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">bind<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>div<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span>Switcher value<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> Store<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">get</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> onChange<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> Store<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token keyword" style="color:rgb(0,119,170)">set</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">bind<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>Store<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)">/</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>div<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p><em>(Notice that we are using <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">forceUpdate</code> which is not really recommended. Normally ahigh-order component is used to enable the re-rendering. We used <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">forceUpdate</code> just to keep the example simple.)</em></p> <p>Because of this change the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Switcher</code> becomes really simple. We don’t need the internal state:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em"><span class="token keyword" style="color:rgb(0,119,170)">class</span> <span class="token class-name">Switcher</span> <span class="token keyword" style="color:rgb(0,119,170)">extends</span> <span class="token class-name">React<span class="token punctuation" style="color:rgb(153,153,153)">.</span>Component</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token function" style="color:rgb(221,74,104)">constructor<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">super</span><span class="token punctuation" style="color:rgb(153,153,153)">(</span>props<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_onButtonClick <span class="token operator" style="color:rgb(166,127,89)">=</span> e <span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span><span class="token function" style="color:rgb(221,74,104)">onChange<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token operator" style="color:rgb(166,127,89)">!</span><span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>value<span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token function" style="color:rgb(221,74,104)">render<span class="token punctuation" style="color:rgb(153,153,153)">(</span></span><span class="token punctuation" style="color:rgb(153,153,153)">)</span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">return</span> <span class="token punctuation" style="color:rgb(153,153,153)">(</span> <span class="token operator" style="color:rgb(166,127,89)"><</span>button onClick<span class="token operator" style="color:rgb(166,127,89)">=</span><span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>_onButtonClick <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">{</span> <span class="token keyword" style="color:rgb(0,119,170)">this</span><span class="token punctuation" style="color:rgb(153,153,153)">.</span>props<span class="token punctuation" style="color:rgb(153,153,153)">.</span>value <span class="token operator" style="color:rgb(166,127,89)">?</span> <span class="token string" style="color:rgb(102,153,0)">'lights on'</span> <span class="token punctuation" style="color:rgb(153,153,153)">:</span> <span class="token string" style="color:rgb(102,153,0)">'lights off'</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">/</span>button<span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token punctuation" style="color:rgb(153,153,153)">)</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span> <span class="token punctuation" style="color:rgb(153,153,153)">}</span><span class="token punctuation" style="color:rgb(153,153,153)">;</span> </code></code></pre> <p>The benefit that comes with this pattern is that our components become dummy representation of the <code style="font-family:inherit; display:inline-block; font-size:0.8em; padding:0px 0.4em; background:rgb(241,241,241)">Store</code>‘s data. It’s really easy to think about the React components as views (renderers). We write our application in a declarative way and deal with the complexity in only one place.</p> <p>The diagram of the application changes to:</p> <pre><code class="language-javascript"><code class=" language-javascript" style="font-family:Consolas,Monaco,"Andale Mono",monospace; direction:ltr; word-spacing:normal; word-break:normal; font-size:0.9em; line-height:1.1em">Service communicating <span class="token keyword" style="color:rgb(0,119,170)">with</span> our backend <span class="token operator" style="color:rgb(166,127,89)">^</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> v Store <span class="token operator" style="color:rgb(166,127,89)"><</span><span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">-</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> v <span class="token operator" style="color:rgb(166,127,89)">|</span> Switcher <span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">--</span><span class="token operator" style="color:rgb(166,127,89)">></span> <span class="token operator" style="color:rgb(166,127,89)">^</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> <span class="token operator" style="color:rgb(166,127,89)">|</span> User input </code></code></pre> <p>As we can see the data flows in only one direction and there is no need to sync two (or more) parts of our system. One-way direction data flow is not only about React based apps. Proved many times that makes the applications easy to reason about. It may need a little bit more wiring but it definitely worth it.</p> <h2 id="summary" style="font-size:2em; line-height:1.2em"><span class="headeranchor"></span>Summary</h2> <p>For sure, these are not the all design patterns/techniques that we can see in React. There are probably dozens more. Check out github.com/krasimir/react-in-patternsregularly for updates. I’ll try posting my new findings there.</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1275786957762347008"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(React)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1901062780350427136.htm" title="Web三要素:CSS之Flex/Grid布局(4)" target="_blank">Web三要素:CSS之Flex/Grid布局(4)</a> <span class="text-muted">双囍菜菜</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9A%8F%E8%AE%B0/1.htm">前端随记</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>CSS布局革命:Flex与Grid的双子星战法文章目录CSS布局革命:Flex与Grid的双子星战法一、布局进化史:从洪荒时代到现代文明二、Flex布局:一维空间的舞蹈家2.1核心概念深度解析容器属性详解:2.2典型应用场景实战导航栏布局(React示例)垂直居中(Vue示例)三、Grid布局:二维空间的指挥官3.1网格系统深度解析核心概念图解:3.2高级布局技巧实战响应式网格(React示例)复</div> </li> <li><a href="/article/1900858782066470912.htm" title="从底层到实践:深度解析 Vue Composition API 与 React Hooks 的异同" target="_blank">从底层到实践:深度解析 Vue Composition API 与 React Hooks 的异同</a> <span class="text-muted"></span> <div>一、设计哲学与底层原理差异1.1响应式系统的基因差异Vue3的CompositionAPI建立在Proxy-based响应式系统之上,通过劫持对象的getter/setter实现依赖收集。当访问响应式对象时,Vue会自动建立组件与数据的依赖关系。//Vue响应式原理简版实现functionreactive(obj){returnnewProxy(obj,{get(target,key){track</div> </li> <li><a href="/article/1900826257579372544.htm" title="六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析" target="_blank">六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析</a> <span class="text-muted">编程星辰海</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>=====欢迎来到编程星辰海的博客讲解======看完可以给一个免费的三连吗,谢谢大佬!目录一、知识讲解1.Hooks是什么?2.useState的作用3.基本语法解析4.工作原理5.参数详解a)初始值设置方式b)更新函数特性6.注意事项7.类组件对比8.常见问题解答二、核心代码示例三、实现效果四、学习要点总结五、扩展阅读推荐官方文档优质文章推荐学习路径进阶资源六、实践步骤一、表单输入控制二、动态</div> </li> <li><a href="/article/1900825752740360192.htm" title="深入解析React 18核心特性:构建未来级Web应用的全面指南" target="_blank">深入解析React 18核心特性:构建未来级Web应用的全面指南</a> <span class="text-muted">斯~内克</span> <a class="tag" taget="_blank" href="/search/react%E7%9F%A5%E8%AF%86%E7%82%B9/1.htm">react知识点</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>一、React18的里程碑意义React18作为近年来最具革命性的版本更新,标志着前端开发正式进入并发渲染时代。这个版本不仅带来了底层架构的革新,更重新定义了现代Web应用的性能标准与开发范式。根据npm官方统计,React18发布首周下载量突破1800万次,GitHub星标数新增3.4万,充分展现了开发者社区对其技术价值的认可。二、架构革命:并发模式深度解析2.1并发渲染原理//传统同步渲染模式</div> </li> <li><a href="/article/1900823984212078592.htm" title="打造高性能的react" target="_blank">打造高性能的react</a> <span class="text-muted">大鸡腿最好吃</span> <a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>根本目的就是减少重复渲染使用使用shouldComponentUpdate规避冗余的更新逻辑shouldComponentUpdate触发的条件是只要父组件更新了,就会被触发,在里面判断传入的pros是否改变,不变则返回falsePureComponent+Immutable.jsPureComponent其实就是内置了对shouldComponentUpdate的实现,不过其对props的比对是</div> </li> <li><a href="/article/1900821841476382720.htm" title="深入解析 React Diff 算法:原理、优化与实践" target="_blank">深入解析 React Diff 算法:原理、优化与实践</a> <span class="text-muted">赵大仁</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF/1.htm">技术</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>深入解析ReactDiff算法:原理、优化与实践1.引言React作为前端领域的标杆框架,采用虚拟DOM(VirtualDOM)来提升UI更新性能。React的Diff算法(Reconciliation)是虚拟DOM运行机制的核心,它决定了如何高效地对比新旧DOM并执行最少的操作来更新UI。本篇文章将深入探讨ReactDiff算法的原理、优化策略,并通过生动的示例解析其工作方式,让你能够更直观地理</div> </li> <li><a href="/article/1900816035892752384.htm" title="深入解析 React 最新特性:革新、应用与最佳实践" target="_blank">深入解析 React 最新特性:革新、应用与最佳实践</a> <span class="text-muted">赵大仁</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ReactNative/1.htm">ReactNative</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>深入解析React最新特性:革新、应用与最佳实践1.引言React作为前端开发的核心技术之一,近年来不断推出新的API和优化机制,从ConcurrentRendering(并发模式)到ServerComponents(服务器组件),都在不断提升开发体验和应用性能。本文将深入解析React最新特性,包括React18并发模式、useTransition、useDeferredValue、ReactS</div> </li> <li><a href="/article/1900772397628321792.htm" title="【pptx-preview】react+pptx预览" target="_blank">【pptx-preview】react+pptx预览</a> <span class="text-muted">起来改bug</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/pptx/1.htm">pptx</a> <div>pptx前端预览插件pptx-preview-npm1.插件使用letpptxPreviewer:any=null;constdom:any=document.getElementById(`pptx-wrapper`);if(!dom)return;pptxPreviewer=init(dom,{width:800});fetch(url).then((response:any)=>respon</div> </li> <li><a href="/article/1900752343826231296.htm" title="人工智能_大模型091_大模型工作流001_使用工作流的原因_处理复杂问题_多轮自我反思优化ReAct_COT思维链---人工智能工作笔记0236" target="_blank">人工智能_大模型091_大模型工作流001_使用工作流的原因_处理复杂问题_多轮自我反思优化ReAct_COT思维链---人工智能工作笔记0236</a> <span class="text-muted">添柴程序猿</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BC%80%E5%8F%91%26amp%3B%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/1.htm">大模型开发&神经网络</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%B7%A5%E4%BD%9C%E6%B5%81/1.htm">大模型工作流</a><a class="tag" taget="_blank" href="/search/COT%E6%80%9D%E7%BB%B4%E9%93%BE/1.htm">COT思维链</a><a class="tag" taget="_blank" href="/search/ReAct%E8%87%AA%E6%88%91%E5%8F%8D%E6%80%9D%E4%BC%98%E5%8C%96/1.htm">ReAct自我反思优化</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%B7%A5%E4%BD%9C%E6%B5%81%E5%BC%80%E5%8F%91/1.htm">大模型工作流开发</a> <div>#清理环境信息,与上课内容无关importosos.environ["LANGCHAIN_PROJECT"]=""os.environ["LANGCHAIN_API_KEY"]=""os.environ["LANGCHAIN_ENDPOINT"]=""os.environ["LANGCHAIN_TRACING_V2"]=""#安装所需要使用的包!pipinstallopenailanggraphA</div> </li> <li><a href="/article/1900646246197030912.htm" title="前端流式输出实现详解:从原理到实践" target="_blank">前端流式输出实现详解:从原理到实践</a> <span class="text-muted">代码剑客588</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>前端流式输出实现详解:从原理到实践前言一、流式输出核心原理1.1什么是流式输出?1.2技术优势对比1.3关键技术支撑二、原生JavaScript实现方案2.1使用FetchAPI流式处理关键点解析:2.2处理SSE(Server-SentEvents)三、主流框架实现示例3.1React实现方案3.2Vue实现方案四、高级优化策略4.1性能优化4.2用户体验增强4.3安全注意事项五、实际应用案例5</div> </li> <li><a href="/article/1900586092499890176.htm" title="React 和 Vue _使用区别" target="_blank">React 和 Vue _使用区别</a> <span class="text-muted">开心小老虎</span> <a class="tag" taget="_blank" href="/search/react%E7%9F%A5%E8%AF%86%E7%82%B9%2B%E7%BB%84%E4%BB%B6/1.htm">react知识点+组件</a><a class="tag" taget="_blank" href="/search/vue3%E7%9F%A5%E8%AF%86%E7%82%B9%2B%E7%BB%84%E4%BB%B6/1.htm">vue3知识点+组件</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E7%9F%A5%E8%AF%86%E7%82%B9/1.htm">前端知识点</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>目录一、框架介绍1.Vue2.React二、框架结构1.创建应用2.框架结构三、使用区别1.单页面组成2.样式3.显示响应式数据4.响应式html标签属性5.控制元素显隐6.条件渲染7.渲染列表react和vue是目前前端比较流行的两大框架,前端程序员应该将两种框架都掌握,本文总结一些基本知识点的使用区别。一、框架介绍1.VueVue是一个框架,也是一个生态。其功能覆盖了大部分前端开发常见的需求。</div> </li> <li><a href="/article/1900577268640575488.htm" title="react和vue 基础使用对比" target="_blank">react和vue 基础使用对比</a> <span class="text-muted">圣京都</span> <a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>1.实现功能(ts)0.基础属性使用1.组件直接的通信2.useState动态修改值3.循环遍历功能4.实现类型vue的watch,filter,computed属性功能5.实现类似vue2的生命周期5.类型vuev-if功能的实现2.文件结构图3.具体代码interface.tsimport"./index.less";import{message}from"antd";import{useSt</div> </li> <li><a href="/article/1900557580397244416.htm" title="echarts实现3d饼图" target="_blank">echarts实现3d饼图</a> <span class="text-muted">qq_45600165</span> <a class="tag" taget="_blank" href="/search/echarts/1.htm">echarts</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>import*asechartsfrom'echarts'import'echarts-gl'//import{ref}from'vue';import{onMounted,onUnmounted,toRefs,ref,reactive,watch}from'vue'exportdefault{props:{//定义prop的名称和类型data:Object},setup(props){letst</div> </li> <li><a href="/article/1900508759512379392.htm" title="Web 开发的“三件套”" target="_blank">Web 开发的“三件套”</a> <span class="text-muted">zhangpeng455547940</span> <a class="tag" taget="_blank" href="/search/Web%E5%BC%80%E5%8F%91/1.htm">Web开发</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>HTML:定义内容结构。CSS:控制样式布局。JavaScript:实现动态行为和复杂逻辑。JavaScript应用场景前端开发:操作DOM、处理用户事件、实现动画等。后端开发:通过Node.js构建服务器端应用。跨平台开发:Electron(桌面应用)、ReactNative(移动端)等。</div> </li> <li><a href="/article/1900485806754164736.htm" title="前端面试:React hooks 调用是可以写在 if 语句里面吗?" target="_blank">前端面试:React hooks 调用是可以写在 if 语句里面吗?</a> <span class="text-muted">returnShitBoy</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>在React中,Hooks是一种新的特性,允许你在函数组件中使用状态(state)和其他React特性。非常重要的一点是,ReactHooks必须遵循特定的规则,以确保组件的行为一致。ReactHooks使用规则只能在函数组件中调用Hook:你只能在React的函数组件或自定义Hooks中调用Hook,而不能在普通JavaScript函数中调用它们。不能在条件语句中调用Hook:Hooks不能放在</div> </li> <li><a href="/article/1900483025242746880.htm" title="React篇之three渲染" target="_blank">React篇之three渲染</a> <span class="text-muted">这个一个非常哈</span> <a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>需求:拖拽右侧面板,里面的three模型能够自适应import{useEffect,useState,useRef}from'react'import'./App.css'import*asTHREEfrom'three';import{GLTFLoader}from'three/addons/loaders/GLTFLoader.js';import{debounce}from'lodash';</div> </li> <li><a href="/article/1900482898557988864.htm" title="《react》前端面试题" target="_blank">《react》前端面试题</a> <span class="text-muted">微 光</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">面试题</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>说说你对reacthook的理解ReactHooks是React16.8版本引入的一种新的特性,它允许在不编写class的情况下使用state和其他React特性。我的理解主要集中在以下几个方面:函数组件的状态管理:Hooks提供了useState这样的钩子函数,使得我们可以在函数组件中使用状态(state),而不需要将组件转换为class组件。这简化了代码,并使组件的逻辑更易于理解和维护。副作用</div> </li> <li><a href="/article/1900482898063060992.htm" title="对vue VS react的理解" target="_blank">对vue VS react的理解</a> <span class="text-muted">向贤</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">前端开发</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>对vueVSreact的理解Vue与React的核心区别在于设计哲学:Vue追求渐进式开发和开箱即用,通过模板语法、响应式系统和官方生态提供低门槛的集成方案。React强调函数式编程和纯JavaScript驱动,以JSX、单向数据流和灵活的生态构建高自由度的视图层。核心差异可总结为:响应式机制、模板vsJSX、API设计、生态策略、性能优化模式。分点论述:1.响应式机制Vue:基于数据劫持(Vue</div> </li> <li><a href="/article/1900463229780422656.htm" title="《TypeScript 高级类型实战指南:解决真实项目的 7 大痛点》" target="_blank">《TypeScript 高级类型实战指南:解决真实项目的 7 大痛点》</a> <span class="text-muted">前端极客探险家</span> <a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>目录标题本文解决的问题:一、表单系统:深度类型约束(可直接用于AntDesign表单)痛点:表单校验逻辑与TS类型脱节二、API响应:自动解包层叠类型(Axios拦截器整合)痛点:后端返回结构嵌套导致类型冗余三、ReduxToolkit:Action类型自动工厂痛点:手写ActionType容易出错四、组件Prop:动态约束联合类型(Vue/React通用)痛点:多形态组件的Prop类型难以维护五</div> </li> <li><a href="/article/1900435105462153216.htm" title="React Native Navigation" target="_blank">React Native Navigation</a> <span class="text-muted">清晨稻香</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a> <div>ReactNativeNavigation官方文档路由跳转到app第一个页面方法navigation.popToTop()navigation.navigate(‘routeName’)不能用navigation.push(‘Home’),这个会入栈一个新路由页,而不是回到首页页面栈&跳转和浏览器环境类似,Native也是用栈来保存页面访问历史,但是不同与浏览器只有入栈一个页面,出栈一个页面两种操</div> </li> <li><a href="/article/1900427167712473088.htm" title="React Native 性能调试指南" target="_blank">React Native 性能调试指南</a> <span class="text-muted">一个前端人</span> <a class="tag" taget="_blank" href="/search/react-native/1.htm">react-native</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>写在前面在开发ReactNative应用时,性能优化是一个至关重要的环节。良好的性能不仅可以提升用户体验,还能减少应用的资源消耗,提高应用的稳定性。本文将详细介绍如何对ReactNative应用进行性能调试和优化,包括性能综述、编译速度优化、列表配置优化、JavaScript加载优化以及Profiling。一、性能综述在开始性能调试之前,了解一些基本概念和工具是非常重要的。以下是一些关键点:FPS</div> </li> <li><a href="/article/1900401695653949440.htm" title="响应式设计已死?流体布局才是未来!" target="_blank">响应式设计已死?流体布局才是未来!</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AFjavascript/1.htm">前端javascript</a> <div>ReactHook深入浅出CSS技巧与案例详解vue2与vue3技巧合集VueUse源码解读在当今的Web设计领域,挑战从未如此巨大。各种屏幕尺寸和分辨率的智能设备层出不穷,要让网站在所有设备上保持一致的用户体验,难度可想而知。但别担心,流体布局(FluidLayout)正是为了解决这一问题而生。它不仅适用于超大屏幕,同样也能完美适配小型移动设备,真正做到自适应!接下来,我们深入了解流体布局的原理</div> </li> <li><a href="/article/1900370042160214016.htm" title="不要再让 import“占领满屏“啦?" target="_blank">不要再让 import“占领满屏“啦?</a> <span class="text-muted">常威和来福回忆</span> <a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>javascript代码解读复制代码//不使用重导importModalfrom'@arco-design/web-react/es/Modal'importCheckboxfrom'@arco-design/web-react/es/Checkbox'importMessagefrom'@arco-design/web-react/es/Message'...//使用模块重导import{Mod</div> </li> <li><a href="/article/1900366254342991872.htm" title="React+FluentUI实现导航栏和页面跳转" target="_blank">React+FluentUI实现导航栏和页面跳转</a> <span class="text-muted">醉酒的李白、</span> <a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/Route/1.htm">Route</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a> <div>React+FluentUI实现导航栏和页面跳转大多数企业级应用后台都有个菜单栏,如图:路由和跳转页面搭建好以后整个框架雏形就出来了,接下来我们介绍一下路由页面跳转的设计思路;需求:此案例分为一级菜单和二级菜单,一级菜单分可展开多项子菜单和不可展开的一级跳转菜单;学生页和老师页两个一级菜单可以展开和闭合,并记录状态,点击学生1,学生2,老师1,老师2子页面,页面跳转,闭合状态不重置,页面不整体刷新</div> </li> <li><a href="/article/1900328441593524224.htm" title="react组件设计原则_前端组件设计原则" target="_blank">react组件设计原则_前端组件设计原则</a> <span class="text-muted">weixin_39825259</span> <a class="tag" taget="_blank" href="/search/react%E7%BB%84%E4%BB%B6%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99/1.htm">react组件设计原则</a> <div>原标题:前端组件设计原则译者:@没有好名字了译文:https://github.com/lightningminers/article/issues/36,https://juejin.im/post/5c49cff56fb9a049bd42a90f作者:@AndrewDinihan原文:https://engineering.carsguide.com.au/front-end-componen</div> </li> <li><a href="/article/1900327811848138752.htm" title="vue3学习教程第二十六节(Hooks 封装注意事项)" target="_blank">vue3学习教程第二十六节(Hooks 封装注意事项)</a> <span class="text-muted">刺客-Andy</span> <a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>1、什么是HooksHooks最先提出的是React,在React16之后提出了所有以use开头定义的函数,用于复杂功能编写、函数组件中状态管理共用、副作用处理而抽离的共用的单一功能可复用的函数;2、Hooks与mixinsClass在应用中的差异在vue2中的mixinsClass主要有以下缺点:a、数据来源不清晰:在一个单文件组件中引入多个mixins或者class时候,想要追踪一个方法或者属</div> </li> <li><a href="/article/1900326674118012928.htm" title="React 使用高阶组件封装Context的两种方式" target="_blank">React 使用高阶组件封装Context的两种方式</a> <span class="text-muted">Kevin·Tseng</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>Reac中使用Context共享数据时,可以使用高阶组件做一个封装,方便页面使用方式一:使用高阶组件1.在App.js中添加状态共享ProviderimportHomefrom'./page/Home'import{Provider,Context}from'./AppContext'conststore={user:{isLogin:true,userName:"Kevin"}}function</div> </li> <li><a href="/article/1900315581903597568.htm" title="React+Vite从零搭建项目及配置详解" target="_blank">React+Vite从零搭建项目及配置详解</a> <span class="text-muted">一朵好运莲</span> <a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>相信很多React初学者第一次搭建自己的项目,搭建时会无从下手,本篇适合快速实现功能,熟悉React项目搭建流程。目录一、创建项目react-item二、调整项目目录结构三、使用scss预处理器四、组件库AntDesign五、配置基础路由六、配置别名路径一、创建项目react-itemnpmcreatevitereact-item二、调整项目目录结构-src-apis项目接口函数-assets项目</div> </li> <li><a href="/article/1900313818324594688.htm" title="在react-native中使用echart绘制图表" target="_blank">在react-native中使用echart绘制图表</a> <span class="text-muted">milk po</span> <div>引用自:https://www.jianshu.com/p/6eae23b3ece9.有前辈做好了echart的封装native-echarts.cd到你项目目录,然后通过npminstallnative-echarts--save去安装在需要调用的界面importEchartsfrom'native-echarts’可以调用代码与效果图如下:/***SampleReactNativeApp*ht</div> </li> <li><a href="/article/1900309276140826624.htm" title="Stack Navigator中使用自定义的Render Callback" target="_blank">Stack Navigator中使用自定义的Render Callback</a> <span class="text-muted">AI画手小王</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a> <div>前言关于Vite和Vue3的讨论越来越多,看了官网的特性后,真是按捺不住想尝试一下。开发环境秒开?CompositionAPI?SFCStyleCSSVariableInjection?看起来哪个都比webpack+Vue2香呀。(尤大都向React推荐Vite了,难道你还不试一下Vite么?)其实在去年,我们在LOFTER的哈利波特街区活动中就尝试使用了Vite2+Vue3搭建活动主街区页面,当</div> </li> <li><a href="/article/57.htm" title="多线程编程之join()方法" target="_blank">多线程编程之join()方法</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/JOIN/1.htm">JOIN</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B/1.htm">线程</a> <div>现实生活中,有些工作是需要团队中成员依次完成的,这就涉及到了一个顺序问题。现在有T1、T2、T3三个工人,如何保证T2在T1执行完后执行,T3在T2执行完后执行?问题分析:首先问题中有三个实体,T1、T2、T3, 因为是多线程编程,所以都要设计成线程类。关键是怎么保证线程能依次执行完呢?   Java实现过程如下: public class T1 implements Runnabl</div> </li> <li><a href="/article/184.htm" title="java中switch的使用" target="_blank">java中switch的使用</a> <span class="text-muted">bingyingao</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/break/1.htm">break</a><a class="tag" taget="_blank" href="/search/continue/1.htm">continue</a> <div>java中的switch仅支持case条件仅支持int、enum两种类型。 用enum的时候,不能直接写下列形式。 switch (timeType) { case ProdtransTimeTypeEnum.DAILY: break; default: br</div> </li> <li><a href="/article/311.htm" title="hive having count 不能去重" target="_blank">hive having count 不能去重</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/%E5%8E%BB%E9%87%8D/1.htm">去重</a><a class="tag" taget="_blank" href="/search/having+count/1.htm">having count</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E6%95%B0/1.htm">计数</a> <div>hive在使用having count()是,不支持去重计数   hive (default)> select imei from t_test_phonenum where ds=20150701 group by imei having count(distinct phone_num)>1 limit 10;  FAILED: SemanticExcep</div> </li> <li><a href="/article/438.htm" title="WebSphere对JSP的缓存" target="_blank">WebSphere对JSP的缓存</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/WAS+JSP+%E7%BC%93%E5%AD%98/1.htm">WAS JSP 缓存</a> <div>      对于线网上的工程,更新JSP到WebSphere后,有时会出现修改的jsp没有起作用,特别是改变了某jsp的样式后,在页面中没看到效果,这主要就是由于websphere中缓存的缘故,这就要清除WebSphere中jsp缓存。要清除WebSphere中JSP的缓存,就要找到WAS安装后的根目录。        现服务</div> </li> <li><a href="/article/565.htm" title="设计模式总结" target="_blank">设计模式总结</a> <span class="text-muted">朱辉辉33</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>1.工厂模式   1.1 工厂方法模式 (由一个工厂类管理构造方法)      1.1.1普通工厂模式(一个工厂类中只有一个方法)      1.1.2多工厂模式(一个工厂类中有多个方法)      1.1.3静态工厂模式(将工厂类中的方法变成静态方法) &n</div> </li> <li><a href="/article/692.htm" title="实例:供应商管理报表需求调研报告" target="_blank">实例:供应商管理报表需求调研报告</a> <span class="text-muted">老A不折腾</span> <a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a><a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E7%B3%BB%E7%BB%9F/1.htm">报表系统</a><a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E8%BD%AF%E4%BB%B6/1.htm">报表软件</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8C%96%E9%80%89%E5%9E%8B/1.htm">信息化选型</a> <div>引言 随着企业集团的生产规模扩张,为支撑全球供应链管理,对于供应商的管理和采购过程的监控已经不局限于简单的交付以及价格的管理,目前采购及供应商管理各个环节的操作分别在不同的系统下进行,而各个数据源都独立存在,无法提供统一的数据支持;因此,为了实现对于数据分析以提供采购决策,建立报表体系成为必须。 业务目标 1、通过报表为采购决策提供数据分析与支撑 2、对供应商进行综合评估以及管理,合理管理和</div> </li> <li><a href="/article/819.htm" title="mysql" target="_blank">mysql</a> <span class="text-muted">林鹤霄</span> <div>转载源:http://blog.sina.com.cn/s/blog_4f925fc30100rx5l.html mysql -uroot -p ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)   [root@centos var]# service mysql</div> </li> <li><a href="/article/946.htm" title="Linux下多线程堆栈查看工具(pstree、ps、pstack)" target="_blank">Linux下多线程堆栈查看工具(pstree、ps、pstack)</a> <span class="text-muted">aigo</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>原文:http://blog.csdn.net/yfkiss/article/details/6729364   1. pstree pstree以树结构显示进程$ pstree -p work | grep adsshd(22669)---bash(22670)---ad_preprocess(4551)-+-{ad_preprocess}(4552)  &n</div> </li> <li><a href="/article/1073.htm" title="html input与textarea 值改变事件" target="_blank">html input与textarea 值改变事件</a> <span class="text-muted">alxw4616</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>// 文本输入框(input) 文本域(textarea)值改变事件 // onpropertychange(IE) oninput(w3c) $('input,textarea').on('propertychange input', function(event) {      console.log($(this).val()) });   </div> </li> <li><a href="/article/1200.htm" title="String类的基本用法" target="_blank">String类的基本用法</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/String/1.htm">String</a> <div>  字符串的用法;     // 根据字节数组创建字符串 byte[] by = { 'a', 'b', 'c', 'd' }; String newByteString = new String(by);         1,length()  获取字符串的长度     &nbs</div> </li> <li><a href="/article/1327.htm" title="JDK1.5 Semaphore实例" target="_blank">JDK1.5 Semaphore实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a><a class="tag" taget="_blank" href="/search/Semaphore/1.htm">Semaphore</a> <div>Semaphore类        一个计数信号量。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。 S</div> </li> <li><a href="/article/1454.htm" title="使用GZip来压缩传输量" target="_blank">使用GZip来压缩传输量</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/GZip/1.htm">GZip</a> <div>        启动GZip压缩要用到一个开源的Filter:PJL Compressing Filter。这个Filter自1.5.0开始该工程开始构建于JDK5.0,因此在JDK1.4环境下只能使用1.4.6。         PJL Compressi</div> </li> <li><a href="/article/1581.htm" title="【Java范型三】Java范型详解之范型类型通配符" target="_blank">【Java范型三】Java范型详解之范型类型通配符</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>    定义如下一个简单的范型类,   package com.tom.lang.generics; public class Generics<T> { private T value; public Generics(T value) { this.value = value; } } </div> </li> <li><a href="/article/1708.htm" title="【Hadoop十二】HDFS常用命令" target="_blank">【Hadoop十二】HDFS常用命令</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>1. 修改日志文件查看器   hdfs oev -i edits_0000000000000000081-0000000000000000089 -o edits.xml cat edits.xml   修改日志文件转储为xml格式的edits.xml文件,其中每条RECORD就是一个操作事务日志   2. fsimage查看HDFS中的块信息等 &nb</div> </li> <li><a href="/article/1835.htm" title="怎样区别nginx中rewrite时break和last" target="_blank">怎样区别nginx中rewrite时break和last</a> <span class="text-muted">ronin47</span> <div>在使用nginx配置rewrite中经常会遇到有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是这样的。 location /    {         proxy_pass http://test; </div> </li> <li><a href="/article/1962.htm" title="java-21.中兴面试题 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 , 使其和等于 m" target="_blank">java-21.中兴面试题 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 , 使其和等于 m</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> import java.util.ArrayList; import java.util.List; import java.util.Stack; public class CombinationToSum { /* 第21 题 2010 年中兴面试题 编程求解: 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 , 使其和等</div> </li> <li><a href="/article/2089.htm" title="eclipse svn 帐号密码修改问题" target="_blank">eclipse svn 帐号密码修改问题</a> <span class="text-muted">开窍的石头</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a><a class="tag" taget="_blank" href="/search/svn%E5%B8%90%E5%8F%B7%E5%AF%86%E7%A0%81%E4%BF%AE%E6%94%B9/1.htm">svn帐号密码修改</a> <div>问题描述:      Eclipse的SVN插件Subclipse做得很好,在svn操作方面提供了很强大丰富的功能。但到目前为止,该插件对svn用户的概念极为淡薄,不但不能方便地切换用户,而且一旦用户的帐号、密码保存之后,就无法再变更了。 解决思路:      删除subclipse记录的帐号、密码信息,重新输入</div> </li> <li><a href="/article/2216.htm" title="[电子商务]传统商务活动与互联网的结合" target="_blank">[电子商务]传统商务活动与互联网的结合</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1/1.htm">电子商务</a> <div>       某一个传统名牌产品,过去销售的地点就在某些特定的地区和阶层,现在进入互联网之后,用户的数量群突然扩大了无数倍,但是,这种产品潜在的劣势也被放大了无数倍,这种销售利润与经营风险同步放大的效应,在最近几年将会频繁出现。。。。        如何避免销售量和利润率增加的</div> </li> <li><a href="/article/2343.htm" title="java 解析 properties-使用 Properties-可以指定配置文件路径" target="_blank">java 解析 properties-使用 Properties-可以指定配置文件路径</a> <span class="text-muted">cuityang</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/properties/1.htm">properties</a> <div>#mq xdr.mq.url=tcp://192.168.100.15:61618; import java.io.IOException; import java.util.Properties; public class Test { String conf = "log4j.properties"; private static final</div> </li> <li><a href="/article/2470.htm" title="Java核心问题集锦" target="_blank">Java核心问题集锦</a> <span class="text-muted">darrenzhu</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80/1.htm">基础</a><a class="tag" taget="_blank" href="/search/%E6%A0%B8%E5%BF%83/1.htm">核心</a><a class="tag" taget="_blank" href="/search/%E9%9A%BE%E7%82%B9/1.htm">难点</a> <div>注意,这里的参考文章基本来自Effective Java和jdk源码 1)ConcurrentModificationException 当你用for each遍历一个list时,如果你在循环主体代码中修改list中的元素,将会得到这个Exception,解决的办法是: 1)用listIterator, 它支持在遍历的过程中修改元素, 2)不用listIterator, new一个</div> </li> <li><a href="/article/2724.htm" title="1分钟学会Markdown语法" target="_blank">1分钟学会Markdown语法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/markdown/1.htm">markdown</a> <div>markdown 简明语法 基本符号 *,-,+ 3个符号效果都一样,这3个符号被称为 Markdown符号 空白行表示另起一个段落 `是表示inline代码,tab是用来标记 代码段,分别对应html的code,pre标签 换行 单一段落( <p>) 用一个空白行 连续两个空格 会变成一个 <br> 连续3个符号,然后是空行</div> </li> <li><a href="/article/2851.htm" title="Gson使用二(GsonBuilder)" target="_blank">Gson使用二(GsonBuilder)</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/gson/1.htm">gson</a><a class="tag" taget="_blank" href="/search/GsonBuilder/1.htm">GsonBuilder</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2175473 一.概述     GsonBuilder用来定制java跟json之间的转换格式   二.基本使用 实体测试类: 温馨提示:默认情况下@Expose注解是不起作用的,除非你用GsonBuilder创建Gson的时候调用了GsonBuilder.excludeField</div> </li> <li><a href="/article/2978.htm" title="报ClassNotFoundException: Didn't find class "...Activity" on path: DexPathList" target="_blank">报ClassNotFoundException: Didn't find class "...Activity" on path: DexPathList</a> <span class="text-muted">gundumw100</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>有一个工程,本来运行是正常的,我想把它移植到另一台PC上,结果报: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mobovip.bgr/com.mobovip.bgr.MainActivity}: java.lang.ClassNotFoundException: Didn't f</div> </li> <li><a href="/article/3105.htm" title="JavaWeb之JSP指令" target="_blank">JavaWeb之JSP指令</a> <span class="text-muted">ihuning</span> <a class="tag" taget="_blank" href="/search/javaweb/1.htm">javaweb</a> <div>  要点   JSP指令简介  page指令  include指令    JSP指令简介    JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。 JSP指令的基本语法格式: <%@ 指令 属性名="</div> </li> <li><a href="/article/3232.htm" title="mac上编译FFmpeg跑ios" target="_blank">mac上编译FFmpeg跑ios</a> <span class="text-muted">啸笑天</span> <a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a> <div>1、下载文件:https://github.com/libav/gas-preprocessor, 复制gas-preprocessor.pl到/usr/local/bin/下, 修改文件权限:chmod 777 /usr/local/bin/gas-preprocessor.pl 2、安装yasm-1.2.0 curl http://www.tortall.net/projects/yasm</div> </li> <li><a href="/article/3359.htm" title="sql mysql oracle中字符串连接" target="_blank">sql mysql oracle中字符串连接</a> <span class="text-muted">macroli</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a> <div>有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种资料库都有提供方法来达到这个目的: MySQL: CONCAT() Oracle: CONCAT(), || SQL Server: + CONCAT() 的语法如下: Mysql 中 CONCAT(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3,等字串连在一起。 请注意,Oracle的CON</div> </li> <li><a href="/article/3486.htm" title="Git fatal: unab SSL certificate problem: unable to get local issuer ce rtificate" target="_blank">Git fatal: unab SSL certificate problem: unable to get local issuer ce rtificate</a> <span class="text-muted">qiaolevip</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E7%BA%B5%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">纵观千象</a> <div>// 报错如下: $ git pull origin master fatal: unable to access 'https://git.xxx.com/': SSL certificate problem: unable to get local issuer ce rtificate   // 原因: 由于git最新版默认使用ssl安全验证,但是我们是使用的git未设</div> </li> <li><a href="/article/3613.htm" title="windows命令行设置wifi" target="_blank">windows命令行设置wifi</a> <span class="text-muted">surfingll</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/wifi/1.htm">wifi</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0%E6%9C%ACwifi/1.htm">笔记本wifi</a> <div>还没有讨厌无线wifi的无尽广告么,还在耐心等待它慢慢启动么 教你命令行设置 笔记本电脑wifi: 1、开启wifi命令 netsh wlan set hostednetwork mode=allow ssid=surf8 key=bb123456 netsh wlan start hostednetwork pause 其中pause是等待输入,可以去掉 2、</div> </li> <li><a href="/article/3740.htm" title="Linux(Ubuntu)下安装sysv-rc-conf" target="_blank">Linux(Ubuntu)下安装sysv-rc-conf</a> <span class="text-muted">wmlJava</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/sysv-rc-conf/1.htm">sysv-rc-conf</a> <div>安装:sudo apt-get install sysv-rc-conf 使用:sudo sysv-rc-conf 操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择,用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。     背景知识 sysv-rc-conf是一个强大的服务管理程序,群众的意见是sysv-rc-conf比chkconf</div> </li> <li><a href="/article/3867.htm" title="svn切换环境,重发布应用多了javaee标签前缀" target="_blank">svn切换环境,重发布应用多了javaee标签前缀</a> <span class="text-muted">zengshaotao</span> <a class="tag" taget="_blank" href="/search/javaee/1.htm">javaee</a> <div>更换了开发环境,从杭州,改变到了上海。svn的地址肯定要切换的,切换之前需要将原svn自带的.svn文件信息删除,可手动删除,也可通过废弃原来的svn位置提示删除.svn时删除。   然后就是按照最新的svn地址和规范建立相关的目录信息,再将原来的纯代码信息上传到新的环境。然后再重新检出,这样每次修改后就可以看到哪些文件被修改过,这对于增量发布的规范特别有用。   检出</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>