Prologue
This article does not have a specific goal, it is not an A to Z guide for beginners
It is more like an article that lists documents related to Components, and hopefully somewhere in the article you will find a part you do not know.
If you have a part you don’t understand, don’t hesitate to leave a comment for me!
1. Components
1 Component will be written mainly in [src/features/] and [src/shared/]. Basically a Component will return a piece of html.
folder [src/features/] to save the Components of each feature, like Login, List, Detail… [src/shared/] saves the most used Components like Header, Footer, Input…
Component can be a function or a variable that stores a callBack funcion.
1 Component name MUST start with a capital letter
In Typescript I use code like this:
1 2 3 4 5 6 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">interface</span> <span class="token class-name">WelcomeProps</span> <span class="token punctuation">{</span> name <span class="token operator">:</span> string <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">const</span> Welcome <span class="token operator">:</span> React <span class="token punctuation">.</span> <span class="token constant">FC</span> <span class="token operator">=</span> <span class="token punctuation">(</span> props <span class="token operator">:</span> WelcomeProps <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> <span class="token punctuation">{</span> props <span class="token punctuation">.</span> name <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
or shortened callBack function:
1 2 3 | <span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token function-variable function">Welcome</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token parameter">props <span class="token operator">:</span> WelcomeProps</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> <span class="token punctuation">{</span> props <span class="token punctuation">.</span> name <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token function-variable function">Welcome</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token parameter">props <span class="token operator">:</span> WelcomeProps</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> <span class="token punctuation">{</span> props <span class="token punctuation">.</span> name <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">;</span> |
Component only allows to return 1 tag, if you want to return more than 1 tag, you need to wrap it with another tag, if it can’t be wrapped, you can use a pair of <></>
tags. This pair of tags will disappear when the html code is generated
2. TypeScript + React: Component patterns
This list is a collection of Component templates for React when working with TypeScript.
Basic function components
write Component like a normal function
1 2 3 4 | <span class="token keyword">function</span> <span class="token function">Title</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Welcome to <span class="token keyword">this</span> application <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Props
named after component + props-suffix. No need to use React.FC
1 2 3 4 5 | type GreetingProps <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token operator">:</span> string <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">Greeting</span> <span class="token punctuation">(</span> <span class="token parameter">props <span class="token operator">:</span> GreetingProps</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator"><</span> p <span class="token operator">></span> Hi <span class="token punctuation">{</span> props <span class="token punctuation">.</span> name <span class="token punctuation">}</span> 👋 <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token punctuation">}</span> |
Destructuring
same as above but easier to read
1 2 3 4 | <span class="token keyword">function</span> <span class="token function">Greeting</span> <span class="token punctuation">(</span> <span class="token parameter"><span class="token punctuation">{</span> name <span class="token punctuation">}</span> <span class="token operator">:</span> GreetingProps</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator"><</span> p <span class="token operator">></span> Hi <span class="token punctuation">{</span> name <span class="token punctuation">}</span> 👋 <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Default props
This method allows to set default value for the passed parameter if the Parent Component does not pass the parameter down to Children
1 2 3 4 5 | type LoginMsgProps <span class="token operator">=</span> <span class="token punctuation">{</span> ame <span class="token operator">?</span> <span class="token operator">:</span> string <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">LoginMsg</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> name <span class="token operator">=</span> <span class="token string">"Guest"</span> <span class="token punctuation">}</span> <span class="token operator">:</span> LoginMsgProps <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator"><</span> p <span class="token operator">></span> Logged <span class="token keyword">in</span> <span class="token keyword">as</span> <span class="token punctuation">{</span> name <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Children
instead of using FC or FunctionComponent, we will set [children] type React.ReactNode
since it accepts most (JSX elements, strings, etc.)
1 2 3 4 5 6 7 8 9 10 11 12 13 | type CardProps <span class="token operator">=</span> <span class="token punctuation">{</span> title <span class="token operator">:</span> string <span class="token punctuation">;</span> children <span class="token operator">:</span> React <span class="token punctuation">.</span> ReactNode <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">Card</span> <span class="token punctuation">(</span> <span class="token parameter"><span class="token punctuation">{</span> title <span class="token punctuation">,</span> children <span class="token punctuation">}</span> <span class="token operator">:</span> CardProps</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> section className <span class="token operator">=</span> <span class="token string">"cards"</span> <span class="token operator">></span> <span class="token operator"><</span> h2 <span class="token operator">></span> <span class="token punctuation">{</span> title <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> h2 <span class="token operator">></span> <span class="token punctuation">{</span> children <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> section <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
how to use Children in Parent Component:
1 2 3 4 | <span class="token operator"><</span> Card title <span class="token operator">=</span> <span class="token string">"Title"</span> <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> This is children <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> Card <span class="token operator">></span> |
Children are not allowed
instead of using FC or FunctionComponent, we will set [children] type React.ReactNode
since it accepts most (JSX elements, strings, etc.)
1 2 3 4 5 6 | <span class="token comment">// This throws errors when we pass children</span> type SaveButtonProps <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">//... whatever</span> children <span class="token operator">:</span> never <span class="token punctuation">}</span> |
WithChildren helper type
instead of using FC or FunctionComponent, we will set [children] type React.ReactNode
since it accepts most (JSX elements, strings, etc.)
1 2 3 | type WithChildren <span class="token operator"><</span> <span class="token constant">T</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator">=</span> <span class="token constant">T</span> <span class="token operator">&</span> <span class="token punctuation">{</span> children <span class="token operator">?</span> <span class="token operator">:</span> React <span class="token punctuation">.</span> ReactNode <span class="token punctuation">}</span> <span class="token punctuation">;</span> type CardProps <span class="token operator">=</span> WithChildren <span class="token operator"><</span> <span class="token punctuation">{</span> title <span class="token operator">:</span> string <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token punctuation">;</span> |
This is very similar to FC, but with the default generic parameter {} it can be much more flexible:
1 2 3 | <span class="token comment">// works as well</span> type CardProps <span class="token operator">=</span> <span class="token punctuation">{</span> title <span class="token operator">:</span> string <span class="token punctuation">}</span> <span class="token operator">&</span> WithChildren <span class="token punctuation">;</span> |
If you are using Preact, you can use h.JSX.Element or VNode as a type instead of React.ReactNode.
Personally, I think this part the author is drawing snakes with legs.
3. how a Component is displayed
By default the file is always displayed as index.html, any changes in this file will affect the whole Project. But this is not the place to edit global in React, ngta will try to keep this file from editing
1 2 3 4 5 | <span class="token operator"><</span> body <span class="token operator">></span> <span class="token operator"><</span> noscript <span class="token operator">></span> You need to enable JavaScript to run <span class="token keyword">this</span> app <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> noscript <span class="token operator">></span> <span class="token operator"><</span> div id <span class="token operator">=</span> <span class="token string">"root"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> body <span class="token operator">></span> |
Inside this file there will be 1 tag: <div id="root"></div>
. this is where React changes the displayed html content
index.tsx
file change this tag with Components via code
1 2 3 4 5 6 | <span class="token keyword">const</span> container <span class="token operator">=</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">'root'</span> <span class="token punctuation">)</span> <span class="token operator">!</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> root <span class="token operator">=</span> <span class="token function">createRoot</span> <span class="token punctuation">(</span> container <span class="token punctuation">)</span> <span class="token punctuation">;</span> root <span class="token punctuation">.</span> <span class="token function">render</span> <span class="token punctuation">(</span> <span class="token operator"><</span> App <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
in this file there is [import ‘./index.css’;], this is where some global css is applied
The basic App.tsx
file is used to categorize each page corresponding to the Url, through the Router
1 2 3 4 5 6 7 8 | <span class="token keyword">const</span> App <span class="token operator">:</span> React <span class="token punctuation">.</span> <span class="token function-variable function">FC</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> div className <span class="token operator">=</span> <span class="token string">"App"</span> <span class="token operator">></span> <span class="token operator"><</span> Router <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Router.tsx
file is usually applied with Extenstion react-router, or manual paging
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">const</span> Router <span class="token operator">:</span> React <span class="token punctuation">.</span> <span class="token function-variable function">FC</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> BrowserRouter <span class="token operator">></span> <span class="token operator"><</span> HeaderComponent <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Routes <span class="token operator">></span> <span class="token operator"><</span> Route path <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token constant">URL_PATH</span> <span class="token punctuation">.</span> <span class="token constant">LIST</span> <span class="token punctuation">}</span> element <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator"><</span> ListComponent <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Route path <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token constant">URL_PATH</span> <span class="token punctuation">.</span> <span class="token constant">DATA1</span> <span class="token punctuation">}</span> element <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator"><</span> Data1Component <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Route path <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token constant">URL_PATH</span> <span class="token punctuation">.</span> <span class="token constant">DATA2</span> <span class="token punctuation">}</span> element <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator"><</span> Data2Component <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Route path <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token constant">URL_PATH</span> <span class="token punctuation">.</span> <span class="token constant">CONFIRM</span> <span class="token punctuation">}</span> element <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator"><</span> ConfirmComponent <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Route path <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token constant">URL_PATH</span> <span class="token punctuation">.</span> <span class="token constant">DETAIL</span> <span class="token punctuation">}</span> element <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator"><</span> DetailComponent <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Route path <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token constant">URL_PATH</span> <span class="token punctuation">.</span> <span class="token constant">INDEX</span> <span class="token punctuation">}</span> element <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator"><</span> LoginComponent <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Route path <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token constant">URL_PATH</span> <span class="token punctuation">.</span> <span class="token constant">LOGIN</span> <span class="token punctuation">}</span> element <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator"><</span> LoginComponent <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Route path <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token constant">URL_PATH</span> <span class="token punctuation">.</span> <span class="token constant">NOT_FOUND</span> <span class="token punctuation">}</span> element <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator"><</span> InvalidComponent <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> Routes <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> BrowserRouter <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
However, each Component is not a Page, the Component can be as small as a Button, an Area or as large as the App.tsx file, which is also a Component.