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/1892404728181092352.htm" title="React 渲染 Flash 接口数据" target="_blank">React 渲染 Flash 接口数据</a> <span class="text-muted">ox0080</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E5%8C%97%E6%BC%82%2B%E6%BB%B4%E6%BB%B4%E5%87%BA%E8%A1%8C/1.htm">北漂+滴滴出行</a><a class="tag" taget="_blank" href="/search/VIP/1.htm">VIP</a><a class="tag" taget="_blank" href="/search/%E6%BF%80%E5%8A%B1/1.htm">激励</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</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>1.后端Python代码使用Flask创建多个接口,每个接口返回不同的数据,并使用自定义装饰器来绑定路由。代码:#app.pyfromflaskimportFlask,jsonifyapp=Flask(__name__)defapi_route(route,methods=['GET']):"""自定义装饰器,用于将函数与HTTP路由绑定"""defdecorator(func):app.rout</div> </li> <li><a href="/article/1892398803407925248.htm" title="部署前端项目2" target="_blank">部署前端项目2</a> <span class="text-muted">augenstern416</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>前端项目的部署是将开发完成的前端代码发布到服务器或云平台,使其能够通过互联网访问。以下是前端项目部署的常见步骤和工具:1.准备工作在部署之前,确保项目已经完成以下步骤:代码优化:压缩JavaScript、CSS和图片文件,减少文件体积。环境配置:区分开发环境和生产环境(如API地址、环境变量等)。测试:确保项目在本地测试通过,没有明显Bug。2.部署流程1.构建项目大多数前端项目(如React、V</div> </li> <li><a href="/article/1892306631119663104.htm" title="vue中nextTick函数和react类似实现" target="_blank">vue中nextTick函数和react类似实现</a> <span class="text-muted">向画</span> <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>Vue3基本用法:import{nextTick}from'vue';//全局调用nextTick(()=>{//在下一个DOM更新循环后执行的代码});//在组件内部调用setup(){asyncfunctionhandleUpdate(){//修改数据...awaitnextTick();//在数据引发的DOM更新完成后执行的代码}}nextTick函数现在作为vue包的一个导出成员,需要显式</div> </li> <li><a href="/article/1892267275638075392.htm" title="electron学习笔记" target="_blank">electron学习笔记</a> <span class="text-muted">weixin_46452138</span> <a class="tag" taget="_blank" href="/search/electron/1.htm">electron</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>electron个人学习笔记一、electron简单了解Electron是一个跨平台的、基于Web前端技术的桌面GUI应用程序开发框架。可以使用HTML、CSS来绘制界面和控制布局,使用JavaScript来控制用户行为和业务逻辑,使用Node.js来通信、处理音频视频等,几乎所有的Web前端技术和框架(jQuery、Vue、React、Angular等)都可以应用到桌面GUI开发中。二、开发前基</div> </li> <li><a href="/article/1892256807733227520.htm" title="React——setState 是同步还是异步问题" target="_blank">React——setState 是同步还是异步问题</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/ecmascript/1.htm">ecmascript</a> <div>这篇是为了了解清楚setState的更新机制,有人理解setState方法是异步的,但这个是错误的!!setState方法是异步的嘛?//从这里我们可以看到,打印出来是1,会以为setState是异步的this.state={count:1}this.setState({count:this.state.count+1})console.log(this.state.count)//1我们试下看,</div> </li> <li><a href="/article/1892243459931172864.htm" title="本地运行 DeepSeek-R1 的成本究竟多高?" target="_blank">本地运行 DeepSeek-R1 的成本究竟多高?</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源码解读本地运行DeepSeek-R1的成本究竟多高?DeepSeek让人们对大规模生成式模型的追求更进一步,甚至有人想在本地跑下规模高达671B参数的版本。但要在家里开这种“巨无霸”,可不是闹着玩的:光是推理就对硬件提出了非常高的要求。这篇文章将大致拆解一下,如果真想在个人电脑上运行DeepSeek-R1,可能需</div> </li> <li><a href="/article/1892243458681270272.htm" title="构建 Next.js 应用时的安全保障与风险防范措施" target="_blank">构建 Next.js 应用时的安全保障与风险防范措施</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应用开发过程中,确保应用的安全性至关重要,这不仅能保护用户数据,还能防止应用本身遭受各种安全攻击。Next.js作为一款备受欢迎的React框架,内置了许多安全功能和推荐做法,但开发者仍需清楚地了解潜在的安全隐患,并采取合适的防范策略。一、Next.js安全问题概述尽管Next.js为构建安全应用提</div> </li> <li><a href="/article/1892183773232033792.htm" title="redux、react-redux、redux-thunk、redux-saga对比" target="_blank">redux、react-redux、redux-thunk、redux-saga对比</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/redux/1.htm">redux</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/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>reduxredux工作流程示意图actions函数形式,返回action对象,通常具有type属性。负责指令的生成,页面通过store.dispatch(action)向store发送数据修改的请求。reducers一个纯函数,接收两个参数(previousState,action)第一个表示修改之前的state的值,action是上一步页面通过store.dispatch(action)向st</div> </li> <li><a href="/article/1892181126793981952.htm" title="React学习笔记04" target="_blank">React学习笔记04</a> <span class="text-muted">充气大锤</span> <a class="tag" taget="_blank" href="/search/React%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/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/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>一、理解组件通信组件通信就是组件间的数据传递,根据组件嵌套关系的不同,有不同的通信方法。在Vue中组件通信是我们组件间传递数据的一种最常用的方法,我们在Vue中使用props来实现父传子,用$emit实现子传父,在React中如何实现呢?1.1、父传子:1、父组件传递数据:在子组件标签身上绑定属性2、子组件接收数据:props的参数functionSon(props){return{props.n</div> </li> <li><a href="/article/1892121230220259328.htm" title="观望=没有!" target="_blank">观望=没有!</a> <span class="text-muted">郭顺发_</span> <a class="tag" taget="_blank" href="/search/%E5%8D%9A%E5%AE%A2/1.htm">博客</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>“兄弟,Java现在学还有前途吗?”“前端是不是饱和了?”——每天打开私信,这类问题能占大半。我的回复永远只有一句:“如果你非要等我说‘行’才敢行动,那答案已经不重要了。”#技术人总在纠结“能不能”一直在等权威认证有人私信问“学Java还能找到工作吗”,自己却从来没打开过招聘网站——实际上,2024年Java岗位仍占后端需求的百分之四五十。考虑技术风向新手在Vue/React/Svelte之间反复</div> </li> <li><a href="/article/1892077700139511808.htm" title="RxJava 和Kotlin协程(Coroutines)" target="_blank">RxJava 和Kotlin协程(Coroutines)</a> <span class="text-muted">Marblog</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/rxjava/1.htm">rxjava</a><a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>RxJava和协程(Coroutines)都是处理异步编程和并发任务的强大工具,但它们的设计理念、使用方式和应用场景有所不同。以下是它们之间的主要区别:1.设计理念与核心概念RxJava:基于响应式流:RxJava是基于反应式编程(ReactiveProgramming)理念的库,它主要用于处理异步数据流和事件流。RxJava提供了丰富的操作符来对数据流进行组合、变换、过滤、错误处理等操作。数据流</div> </li> <li><a href="/article/1892019823433543680.htm" title="2025年前端工程师职业发展的系统性应聘规划" target="_blank">2025年前端工程师职业发展的系统性应聘规划</a> <span class="text-muted">IT木昜</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>2025年前端工程师职业发展的系统性应聘规划,结合技术趋势、企业需求和竞争力提升策略,分为技术栈学习、项目实战、求职策略三部分:一、2025年前端技术趋势与核心技能1.必学技术栈(基础+进阶)层级技术方向具体技能基础核心语言-HTML6新特性(预测)、CSS容器查询、TypeScript5.0+主流框架React22+(ServerComponents)、Vue4.0(VaporMode)、Sve</div> </li> <li><a href="/article/1891985034747899904.htm" title="自定义Agent组件" target="_blank">自定义Agent组件</a> <span class="text-muted">三月七꧁ ꧂</span> <a class="tag" taget="_blank" href="/search/langchain%2Bllm/1.htm">langchain+llm</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/microsoft/1.htm">microsoft</a><a class="tag" taget="_blank" href="/search/gpt/1.htm">gpt</a><a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</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>文章目录ReActAgent的实践工具组件和工具包组件工具组件的类型    一个Agent组件由两部分组成:tools(代理可以使用的工具)和AgentExecutor(决定采取哪种行动)。下面逐一介绍如何创建自定义Agent组件。Tool、AgentExecutor和BaseSingleActionAgent是从LangChain.agents模块中导人的类,用于创建自定义Agent组件和too</div> </li> <li><a href="/article/1891935719862104064.htm" title="处理react中使用TS或者eslint页面报错问题" target="_blank">处理react中使用TS或者eslint页面报错问题</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/vue.js/1.htm">vue.js</a> <div>在报错代码的上一行加入对应如下代码//@ts-ignore//@ts-nocheck//eslint-disable-next-line</div> </li> <li><a href="/article/1891896345174798336.htm" title="Spring Cloud Gateway可以做什么?" target="_blank">Spring Cloud Gateway可以做什么?</a> <span class="text-muted">zzyh123456</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>SpringCloudGateway是一个基于SpringFramework5、SpringBoot2和ProjectReactor等技术构建的API网关服务器,它在微服务架构中扮演着至关重要的角色。以下是SpringCloudGateway可以做的几个主要方面:1.路由转发基于多种条件的路由:SpringCloudGateway可以根据请求的路径、Host、Header、请求参数等多种条件将请求</div> </li> <li><a href="/article/1891890033607110656.htm" title="DeepSeek 实用集成,接入各类软件" target="_blank">DeepSeek 实用集成,接入各类软件</a> <span class="text-muted">安替-AnTi</span> <a class="tag" taget="_blank" href="/search/deepseek/1.htm">deepseek</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E6%88%90/1.htm">集成</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6/1.htm">软件</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E7%94%A8/1.htm">实用</a> <div>将DeepSeek大模型能力轻松接入各类软件。访问DeepSeek开放平台来获取您的APIkey。详细内容参考:点我应用程序QuantalogicQuantaLogic是一个ReAct(推理和行动)框架,用于构建高级AI代理</div> </li> <li><a href="/article/1891833866944049152.htm" title="antd+React.js实现登陆页面,登陆注册页面" target="_blank">antd+React.js实现登陆页面,登陆注册页面</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>今天制作登陆界面,本来想找开原的代码复制粘贴,但奈何网友们是在太过吝啬。找了半天,不如我来做这个开源。代码如下(登陆界面层级都比较分明,故不再做过多解释)importstylesfrom'./login.module.scss';import{Button,Checkbox,Form,Input,Tabs}from'antd';import{UserOutlined,MedicineBoxOutl</div> </li> <li><a href="/article/1891833236670181376.htm" title="【react8】如何在网页中直接引入react进行demo开发" target="_blank">【react8】如何在网页中直接引入react进行demo开发</a> <span class="text-muted">风清云淡_A</span> <a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>babel在线cdn链接地址https://unpkg.com/browse/@babel/standalone@7.26.9/unpkg在线cdn链接地址https://unpkg.com/项目工程代码实现DocumentfunctionMyButton(){return{console.log("click")}}>Clickme}constroot=ReactDOM.createRoot(d</div> </li> <li><a href="/article/1891781201463668736.htm" title="React 自定义 hooks实现自动上报 页面浏览量|点击事件" target="_blank">React 自定义 hooks实现自动上报 页面浏览量|点击事件</a> <span class="text-muted">一个00后前端开发</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>通过自定义hooks,来控制监听DOM元素,分清楚依赖关系exportconstLogContext=createContext({});exportconstuseLog=()=>{/*定义一些公共参数*/constmessage=useContext(LogContext);constlistenDOM=useRef(null);/*分清依赖关系*/constreportMessage=use</div> </li> <li><a href="/article/1891770609898156032.htm" title="Vue 3 Composition API进阶指南" target="_blank">Vue 3 Composition API进阶指南</a> <span class="text-muted">前端学步</span> <a class="tag" taget="_blank" href="/search/Vue3%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB%E4%B8%93%E6%A0%8F/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>在上一篇文章中,我们介绍了Vue3的CompositionAPI基础,包括如何使用setup函数、ref和reactive来创建响应式数据,以及使用watchEffect来监控数据变化。本文将继续深入探讨CompositionAPI的高级用法,帮助你更好地理解和利用Vue3的新特性。组合多个Hooks在实际开发中,我们经常需要组合使用多个自定义的Hooks来实现复杂的功能。Vue3的Composi</div> </li> <li><a href="/article/1891770105973501952.htm" title="nextjs中集成富文本编辑器wangEditor" target="_blank">nextjs中集成富文本编辑器wangEditor</a> <span class="text-muted">不cong明的亚子</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a><a class="tag" taget="_blank" href="/search/react/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/next.js/1.htm">next.js</a><a class="tag" taget="_blank" href="/search/%E5%AF%8C%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8/1.htm">富文本编辑器</a> <div>背景实现一个博客主站的文章生成系统,使用ssr去生成自己的文章,达到seo的效果。技术栈nextjs@14.2.x.[app-router]postgres@latest(本章不涉及)@wangeditor/editor@5.x@wangeditor/editor-for-react@1.x使用引入富文本编辑器npmi-S@wangeditor/editor@wangeditor/editor-f</div> </li> <li><a href="/article/1891768459734347776.htm" title="菜鸟的成长之路" target="_blank">菜鸟的成长之路</a> <span class="text-muted">东风吹破了青花瓷</span> <a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1.htm">数据结构与算法</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80%E7%AF%87/1.htm">基础篇</a><a class="tag" taget="_blank" href="/search/%E5%85%A5%E9%97%A8/1.htm">入门</a> <div>菜鸟的成长之路基础能力数据结构与算法数据结构链表数组栈队列字典bitset树堆完全二叉树平衡二叉树二叉查找树B树红黑树lsm树图通用算法排序十种排序算法查找二分查找深度广度优先搜索分治贪心回朔动态规划网络协议OSITCP/IP状态转移拥塞控制可靠工作原理socket编程HTTP/HTTPSIO模型同步IOreactor阻塞IO非阻塞IOIO多路复用信号驱动异步IOC10K问题长链接短链接编译原理l</div> </li> <li><a href="/article/1891681896534962176.htm" title="useMemo 和 memo 的理解和区别" target="_blank">useMemo 和 memo 的理解和区别</a> <span class="text-muted">程序员小续</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/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>在React中,useMemo和memo都用于优化性能,减少不必要的渲染,但它们的使用场景不同。1.useMemo(记忆化计算)作用缓存计算结果,避免每次渲染都重新计算只有当依赖项发生变化时,才会重新计算✅适用场景计算量较大的值(避免重复计算)避免子组件不必要的渲染(与useCallback结合使用)代码示例importReact,{useState,useMemo}from"react";con</div> </li> <li><a href="/article/1891681893225656320.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><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><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>配置React源码本地调试环境本次环境构建采用了node版本为16、react-scripts版本号为3.4.4,源码下载地址react源码调试:react源码调试环境使用create-react-app脚手架创建项目npxcreate-react-appreact-test进入刚刚下载的目录,弹射create-react-app脚手架内部配置//在npmruneject之前,手动将项目packa</div> </li> <li><a href="/article/1891680629674799104.htm" title="低代码平台调研结果" target="_blank">低代码平台调研结果</a> <span class="text-muted">大唐荣华</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%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/%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/%E4%BD%8E%E4%BB%A3%E7%A0%81/1.htm">低代码</a><a class="tag" taget="_blank" href="/search/lowcode/1.htm">lowcode</a> <div>调研要求:项目活跃度技术栈:react低代码功能点和业务切合度低代码平台调研项目一、百度aims百度aims体验地址:https://aisuda.github.io/amis-editor-demo/#/edit/0优点:2019年开源最早,关注量最多的国内低代码开源,最近更新一周之内;使用时间较长,在百度内部经过实践考验;内置组件丰富;项目活跃度较高,github10.9kstar,gitee</div> </li> <li><a href="/article/1891679368745381888.htm" title="一些流行的拖拽化和低代码平台(汇总)" target="_blank">一些流行的拖拽化和低代码平台(汇总)</a> <span class="text-muted">视频砖家</span> <a class="tag" taget="_blank" href="/search/%E6%96%87%E7%AB%A0%E5%AD%98%E6%A1%A3/1.htm">文章存档</a><a class="tag" taget="_blank" href="/search/%E4%BD%8E%E4%BB%A3%E7%A0%81/1.htm">低代码</a><a class="tag" taget="_blank" href="/search/%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0/1.htm">低代码平台</a> <div>一些流行的拖拽化和低代码平台,这些工具可以帮助用户快速构建应用程序,无需深入的编程知识:1.开源拖拽库dragula:一款强大且兼容性极好的拖拽排序库,支持多种框架,如vanillaJavaScript、Angular、React等。Interact.js:提供拖拽、调整尺寸和多点触摸手势功能,适用于现代浏览器。react-dnd:React组件库,用于实现拖拽功能。Sortable:适用于多种框</div> </li> <li><a href="/article/1891651364589727744.htm" title="【Linux】【网络】Reactor模式" target="_blank">【Linux】【网络】Reactor模式</a> <span class="text-muted">钟离墨笺</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>【Linux】【网络】Reactor模式1.Reactor模式:Reactor模式是一种事件驱动的设计模式,同步I/O通常用于设置Reactor模式主线程(I/0处理单元,下同)只负责监听文件描述上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元,下同)。除此之外,主线程不做任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。使用同步I/O模型(以epoll</div> </li> <li><a href="/article/1891590274988175360.htm" title="详解 React 18 更新后的特性,一文即懂" target="_blank">详解 React 18 更新后的特性,一文即懂</a> <span class="text-muted">FinBird</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E9%A3%9E%E8%B5%B7%E6%9D%A5/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><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>React18通过其改进的渲染系统带来了并发能力,并在此基础上构建了转换或自动批处理等性能增强特性。下面就看看到底有哪些值得关注的新特性。迭代更新内容总的来说,由于新的并发特性是渐进适配并按需启用的,React18中的重大更改仅限于几个简单的API更改,以及对React中多个行为的稳定性和一致性的一些改进,比较重要的一点是,不再支持IE浏览器。1、客户端渲染API带有createRoot()的ro</div> </li> <li><a href="/article/1891550286867132416.htm" title="react技术全家桶(26)高阶函数 函数柯里化" target="_blank">react技术全家桶(26)高阶函数 函数柯里化</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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>saveUserName=(event)=>{console.log(event.target.value)this.setState({userName:event.target.value})}savePassword=(event)=>{console.log(event.target.value)this.setState({password:event.target.value})}有没</div> </li> <li><a href="/article/1891549781415751680.htm" title="React之高阶函数_函数柯里化" target="_blank">React之高阶函数_函数柯里化</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/%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0%EF%BC%9B%E5%87%BD%E6%95%B0%E6%9F%AF%E9%87%8C%E5%8C%96/1.htm">高阶函数;函数柯里化</a> <div>高阶函数_函数柯里化/*高阶函数:满足一个就是1.一函数接收参数是函数就是的2.一函数接收返回值是函数就是的(下面的event就是函数)函数柯里化:函数调用继续返回函数,多次处理参数最后统一处理(最后面例子returna+b+c)*///1.创建组件classLoginextendsReact.Component{//初始化状态state={username:'',//用户名password:''</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>