Before the release of React Hook, users using functional components would feel pretty much restricted. Users will find it difficult to manipulate state, context API or lifecycle method.
However, starting from React 16.8, React hook was born and we have very flexible tools to reuse existing code.
In this article, I will introduce some useful React hooks that can solve daily problems.
useFiler Hook
I really like using the useFiler
it allows us to create a virtual file system (virtual file system) right on the web browser. Basically, it uses local storage to manage the files and their contents.
To use it, we need to install the crooks package in the application:
1 2 | npm install crooks --save |
Then import useFiler hook from crooks:
1 2 | <span class="token keyword">import</span> <span class="token punctuation">{</span> useFiler <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'crooks'</span> |
Now that we can easily create hooks and manage files, here’s an example:
1 2 3 4 5 6 7 | <span class="token keyword">const</span> <span class="token function-variable function">App</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token punctuation">[</span> files <span class="token punctuation">,</span> <span class="token punctuation">{</span> add <span class="token punctuation">,</span> remove <span class="token punctuation">,</span> update <span class="token punctuation">,</span> clear <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useFiler</span> <span class="token punctuation">(</span> <span class="token string">"localStorageItem"</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> div <span class="token operator">></span> My Project <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> |
As you can see in the above code, we can use the add()
, remove()
, update()
, clear()
. Let’s find out how to use them.
Add file
The add () function accepts 1 parameter, here we need to pass JSON-serializable:
1 2 | <span class="token function">add</span> <span class="token punctuation">(</span> <span class="token string">"Save this JSON-serializable data in the file."</span> <span class="token punctuation">)</span> |
Note: This function will automatically generate a new ID for the newly created file, but we can customize the ID by passing an integer or a string as the second argument.
Update file
The update () function requires two parameters, the first is the ID of the file, the second is the new data to pass:
1 2 | <span class="token function">update</span> <span class="token punctuation">(</span> <span class="token string">"abc1234"</span> <span class="token punctuation">,</span> <span class="token string">"New content of file."</span> <span class="token punctuation">)</span> |
Remove file
Pass the file ID in the remove () function to delete
1 2 | <span class="token function">remove</span> <span class="token punctuation">(</span> <span class="token string">"abc1234"</span> <span class="token punctuation">)</span> |
Clear all files
Call the clear () function to delete all files:
1 2 | <span class="token function">clear</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> |
useFetch Hook
UseFetch can be used to retrieve data from the API. After the request is made, it will return a response or errors (if any).
Import into the project:
1 2 | <span class="token keyword">import</span> useFetch <span class="token keyword">from</span> <span class="token string">"hooks/useFetch"</span> <span class="token punctuation">;</span> |
Create a test request:
1 2 | <span class="token keyword">const</span> <span class="token punctuation">{</span> response <span class="token punctuation">,</span> errors <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">useFetch</span> <span class="token punctuation">(</span> <span class="token string">"https://api.github.com/users/hct97/repos"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
useHover Hook
Basically, it monitors the mouse pointer on the screen to detect whether it is placed on a specific element or not. If so, it will trigger the hovered event,
Import into the project:
1 2 | <span class="token keyword">import</span> useHover <span class="token keyword">from</span> <span class="token string">"hooks/useHover"</span> <span class="token punctuation">;</span> |
Initialization:
1 2 | <span class="token keyword">const</span> <span class="token punctuation">[</span> hoverMe <span class="token punctuation">,</span> isHovered <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useHover</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Here, hoverMe points to the specific HTML element, while isHovered is a boolean value to check the condition.
1 2 | <span class="token operator"><</span> div ref <span class="token operator">=</span> <span class="token punctuation">{</span> hoverMe <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token punctuation">{</span> isHovered <span class="token operator">?</span> <span class="token string">"Hovered!"</span> <span class="token operator">:</span> <span class="token string">"Hover me!"</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
useSlug Hook
Slug is a very important component in every web project, it can increase your site’s SEO.
For example, it will convert é
or è
into e
As usual, we need to import:
1 2 | <span class="token keyword">import</span> useSlug <span class="token keyword">from</span> <span class="token string">"hooks/useSlug"</span> <span class="token punctuation">;</span> |
When initializing the hook, pass any string (possibly article name) into the first argument. The result will be a well-form slug.
1 2 3 | useSlug("React Hooks! résoudre les problèmes quotidiens"); // react-hooks-resoudre-les-problemes-quotidiens |
useDrag and useDrop Hooks
These 2 hooks are very useful when using the drag-and-drop functionality of HTML5
Setting:
1 2 | npm install ahooks --save |
import:
1 2 | <span class="token keyword">import</span> <span class="token punctuation">{</span> useDrag <span class="token punctuation">,</span> useDrop <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'ahooks'</span> <span class="token punctuation">;</span> |
Using
First we need to initialize useDrag
and useDrop
useDrag
will return the props passed to the DOM element. useDrop
returns the props passed to the drop area, it also informs us whether the drag element is at the top of the drop area by using the boolean property ( isHovering
).
Finally, useDrop has four callbacks that execute each type of drag-and-drop item: onText
, onFiles
, onUri
, onDom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">const</span> getDragProps <span class="token operator">=</span> <span class="token function">useDrag</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token punctuation">[</span> props <span class="token punctuation">,</span> <span class="token punctuation">{</span> isHovering <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useDrop</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token function-variable function">onText</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token parameter">text <span class="token punctuation">,</span> e</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">alert</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">'text: </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> text <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">' dropped</span> <span class="token template-punctuation string">`</span></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-variable function">onFiles</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token parameter">files <span class="token punctuation">,</span> e</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">alert</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> files <span class="token punctuation">.</span> length <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> file dropped</span> <span class="token template-punctuation string">`</span></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-variable function">onUri</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token parameter">uri <span class="token punctuation">,</span> e</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">alert</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">uri: </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> uri <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> dropped</span> <span class="token template-punctuation string">`</span></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-variable function">onDom</span> <span class="token operator">:</span> <span class="token punctuation">(</span> <span class="token parameter">content <span class="token operator">:</span> string <span class="token punctuation">,</span> e</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">alert</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">custom: </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> content <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> dropped</span> <span class="token template-punctuation string">`</span></span> <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 class="token punctuation">;</span> |
1 2 | <span class="token operator"><</span> div <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token function">getDragProps</span> <span class="token punctuation">(</span> id <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token operator">></span> Draggable Element <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
1 2 3 4 | <span class="token operator"><</span> div <span class="token punctuation">{</span> <span class="token operator">...</span> props <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token punctuation">{</span> isHovering <span class="token operator">?</span> <span class="token string">'Release Item Here'</span> <span class="token operator">:</span> <span class="token string">'Drop Anything Here'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
useDarkMode Hook
useDarkMode
hook handles the transition between light and dark modes of the website. After conversion, it will save the current value into a localStorage
. This means that the user’s choice will be applied as soon as the website is opened.
Library settings:
1 2 | npm install react-recipes --save |
Import:
1 2 | <span class="token keyword">import</span> <span class="token punctuation">{</span> useDarkMode <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-recipes"</span> <span class="token punctuation">;</span> |
Basically, useDarkMode()
returns 2 messages:
darkMode
: is a boolean value that returns true if darkmode is enabledsetDarkMode
: handles the selection between light and dark mode
1 2 3 4 5 6 7 8 9 | <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token punctuation">[</span> darkMode <span class="token punctuation">,</span> setDarkMode <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useDarkMode</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 punctuation">(</span> <span class="token operator"><</span> div className <span class="token operator">=</span> <span class="token string">"header"</span> <span class="token operator">></span> <span class="token operator"><</span> Toggle darkMode <span class="token operator">=</span> <span class="token punctuation">{</span> darkMode <span class="token punctuation">}</span> setDarkMode <span class="token operator">=</span> <span class="token punctuation">{</span> setDarkMode <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> div <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Conclude
Above we have a few examples of quite useful React hooks that can be applied to your project. In fact, the main benefit of using React Hook is that it allows us to reuse the code easily, so we can use the open-source Hooks as above.