/
index.html
285 lines (273 loc) · 19.9 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>React Component</title>
<link rel="stylesheet" type="text/css" href="https://unpkg.com/prismjs@1.6.0/themes/prism-tomorrow.css"/>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
background: linear-gradient(to bottom, hsl(0, 0%, 100%) 400px, hsl(0, 0%, 95%) 500px);
margin: 20px;
}
body > *:not(.nav) {
max-width: 800px;
margin-left: auto;
margin-right: auto;
box-sizing: border-box;
}
pre {
color: hsl(0, 0%, 90%);
background: hsl(0, 0%, 10%);
padding: 10px;
border-radius: 6px;
margin-bottom: 0;
}
pre.render-js-code {
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
}
.render-js {
background: white;
border: 1px solid hsl(0, 0%, 10%);
padding: 10px;
border-bottom-right-radius: 6px;
border-bottom-left-radius: 6px;
}
.render-js:after {
clear: both;
}
h1 { text-transform: uppercase;}
h1, h1 + p {
text-align: center
}
h1 + p > img {
box-shadow: 0px 2px 20px hsla(0, 0%, 0%, 0.25);
border-radius: 50%;
}
code {
font-family: "SF Mono", "Monaco", "Inconsolata", "Fira Mono", "Droid Sans Mono", "Source Code Pro", monospace;
}
.nav {
display: flex;
justify-content: space-between;
font-size: 80%;
background: hsl(0, 0%, 10%);
color: white;
margin: -20px -20px 0px -20px;
padding: 10px;
text-transform: uppercase;
}
.nav a {
text-decoration: none;
color: inherit;
transition: color 200ms ease;
display: inline-block;
}
.nav a:hover {
color: hsl(0, 0%, 80%);
}
.external-links a:not(:last-child) {
padding: 0 5px;
}
h2 {
text-transform: uppercase;
border-bottom: solid 1px #ccc;
padding-bottom: 5px;
margin-top: 50px;
}
h2, h3, h4 {
position: relative;
}
h3 {
margin-top: 2em;
font-size: 125%;
}
.header-anchor {
position: absolute;
left: -1em;
color: #ccc;
text-decoration: none;
font-weight: normal;
font-size: 80%;
}
</style>
</head>
<body>
<nav class="nav">
<div>
<a href="https://github.com/ryanflorence">ryan florence</a> / <a href="https://github.com/ryanflorence/react-component-component">React Component Component</a>
</div>
<div class="external-links">
<a href="https://workshop.me">Workshops</a>
<a href="https://totalreact.com">Online Courses</a>
<a href="https://twitter.com/ryanflorence">Twitter</a>
<a href="https://github.com/ryanflorence/react-component-component">Github</a>
</div>
</nav> <h1 id="react-component-component"><a class="header-anchor" href="#react-component-component" aria-hidden="true">#</a> React Component ... Component</h1>
<h2 id="what"><a class="header-anchor" href="#what" aria-hidden="true">#</a> What?</h2>
<p>Declarative version of React.Component.</p>
<h2 id="why"><a class="header-anchor" href="#why" aria-hidden="true">#</a> Why?</h2>
<p>Because sometimes you want a lifecycle or some state but don't want to create a new component. Also, this stuff is composable as heck.</p>
<h2 id="installation"><a class="header-anchor" href="#installation" aria-hidden="true">#</a> Installation</h2>
<pre><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> react-component-component
<span class="token comment" spellcheck="true"># or</span>
yarn add react-component-component
</code></pre>
<p>And then import it:</p>
<pre><code class="language-js"><span class="token comment" spellcheck="true">// using es modules</span>
<span class="token keyword">import</span> Component <span class="token keyword">from</span> <span class="token string">"react-component-component"</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">// common.js</span>
<span class="token keyword">const</span> Component <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"react-component-component"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">// AMD</span>
<span class="token comment" spellcheck="true">// I've forgotten but it should work.</span>
</code></pre>
<p>Or use script tags and globals.</p>
<pre><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://unpkg.com/react-component-component<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span>
</code></pre>
<p>And then grab it off the global like so:</p>
<pre><code class="language-js"><span class="token keyword">const</span> Component <span class="token operator">=</span> ReactComponentComponent<span class="token punctuation">;</span>
</code></pre>
<h2 id="how"><a class="header-anchor" href="#how" aria-hidden="true">#</a> How?</h2>
<p>Let's say you want some async data but don't want to make a whole new component just for the lifecycles to get it:</p>
<pre class="render-js-code"><code class="jsx"><span class="token comment" spellcheck="true">// import Component from 'react-component-component'</span>
<span class="token keyword">const</span> Component <span class="token operator">=</span> ReactComponentComponent<span class="token punctuation">;</span>
ReactDOM<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h2</span><span class="token punctuation">></span></span>Let's <span class="token keyword">get</span> some gists<span class="token operator">!</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h2</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Component</span>
<span class="token attr-name">initialState</span><span class="token script language-javascript"><span class="token punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">{</span> gists<span class="token punctuation">:</span> <span class="token keyword">null</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></span>
<span class="token attr-name">didMount</span><span class="token script language-javascript"><span class="token punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">{</span> setState <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
<span class="token function">fetch</span><span class="token punctuation">(</span><span class="token string">"https://api.github.com/gists"</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>res <span class="token operator">=</span><span class="token operator">></span> res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>gists <span class="token operator">=</span><span class="token operator">></span> <span class="token function">setState</span><span class="token punctuation">(</span><span class="token punctuation">{</span> gists <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></span><span class="token attr-name">}</span>
<span class="token punctuation">></span></span>
<span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">{</span> state <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span>
state<span class="token punctuation">.</span>gists <span class="token operator">?</span> <span class="token punctuation">(</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span>
<span class="token punctuation">{</span>state<span class="token punctuation">.</span>gists<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span>gist <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span> <span class="token attr-name">key</span><span class="token script language-javascript"><span class="token punctuation">=</span><span class="token punctuation">{</span>gist<span class="token punctuation">.</span>id<span class="token punctuation">}</span></span><span class="token punctuation">></span></span><span class="token punctuation">{</span>gist<span class="token punctuation">.</span>description<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span>
<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span>
<span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token punctuation">(</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Loading<span class="token operator">...</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span>
<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Component</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><span class="token punctuation">,</span>
DOM_NODE
<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<div id="render-2h2q3cgjmvo" class="render-js"></div>
<script type="text/babel">
(function() { var DOM_NODE = document.getElementById("render-2h2q3cgjmvo");
// import Component from 'react-component-component'
const Component = ReactComponentComponent;
ReactDOM.render(
<div>
<h2>Let's get some gists!</h2>
<Component
initialState={{ gists: null }}
didMount={({ setState }) => {
fetch("https://api.github.com/gists")
.then(res => res.json())
.then(gists => setState({ gists }));
}}
>
{({ state }) =>
state.gists ? (
<ul>
{state.gists.map(gist => (
<li key={gist.id}>{gist.description}</li>
))}
</ul>
) : (
<div>Loading...</div>
)
}
</Component>
</div>,
DOM_NODE
);
})()</script>
<p>Or maybe you need a little bit of state but an entire component
seems a bit heavy:</p>
<pre class="render-js-code"><code class="jsx"><span class="token comment" spellcheck="true">// import Component from 'react-component-component'</span>
<span class="token keyword">const</span> Component <span class="token operator">=</span> ReactComponentComponent<span class="token punctuation">;</span>
ReactDOM<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Component</span> <span class="token attr-name">initialState</span><span class="token script language-javascript"><span class="token punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">{</span> count<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></span><span class="token punctuation">></span></span>
<span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">{</span> setState<span class="token punctuation">,</span> state <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h2</span><span class="token punctuation">></span></span>Every app needs a counter<span class="token operator">!</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h2</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span>
<span class="token attr-name">onClick</span><span class="token script language-javascript"><span class="token punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span>
<span class="token function">setState</span><span class="token punctuation">(</span>state <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token punctuation">{</span> count<span class="token punctuation">:</span> state<span class="token punctuation">.</span>count <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span></span>
<span class="token punctuation">></span></span>
<span class="token operator">-</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span><span class="token punctuation">></span></span> <span class="token punctuation">{</span>state<span class="token punctuation">.</span>count<span class="token punctuation">}</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span>
<span class="token attr-name">onClick</span><span class="token script language-javascript"><span class="token punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span>
<span class="token function">setState</span><span class="token punctuation">(</span>state <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token punctuation">{</span> count<span class="token punctuation">:</span> state<span class="token punctuation">.</span>count <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span></span>
<span class="token punctuation">></span></span>
<span class="token operator">+</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span>
<span class="token punctuation">)</span><span class="token punctuation">}</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Component</span><span class="token punctuation">></span></span><span class="token punctuation">,</span>
DOM_NODE
<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<div id="render-edlakmlmnmg" class="render-js"></div>
<script type="text/babel">
(function() { var DOM_NODE = document.getElementById("render-edlakmlmnmg");
// import Component from 'react-component-component'
const Component = ReactComponentComponent;
ReactDOM.render(
<Component initialState={{ count: 0 }}>
{({ setState, state }) => (
<div>
<h2>Every app needs a counter!</h2>
<button
onClick={() =>
setState(state => ({ count: state.count - 1 }))
}
>
-
</button>
<span> {state.count} </span>
<button
onClick={() =>
setState(state => ({ count: state.count + 1 }))
}
>
+
</button>
</div>
)}
</Component>,
DOM_NODE
);
})()</script>
<h2 id="props"><a class="header-anchor" href="#props" aria-hidden="true">#</a> Props</h2>
<p>You know all of these already:</p>
<ul>
<li><code>didMount({ state, setState, props, forceUpdate })</code></li>
<li><code>shouldUpdate({ state, props, nextProps, nextState })</code></li>
<li><code>didUpdate({ state, setState, props, forceUpdate, prevProps, prevState })</code></li>
<li><code>willUnmount({ state, props })</code></li>
<li><code>children({ state, setState, props, forceUpdate })</code></li>
<li><code>render({ state, setState, props, forceUpdate })</code></li>
</ul>
<h2 id="legal"><a class="header-anchor" href="#legal" aria-hidden="true">#</a> Legal</h2>
<p>Released under MIT license.</p>
<p>Copyright © 2017-present Ryan Florence</p> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src="https://unpkg.com/react@15.6.1/dist/react.js"></script>
<script src="https://unpkg.com/react-dom@15.6.1/dist/react-dom.js"></script>
<script src="umd/react-component-component.min.js"></script>
</body>
</html>