Hello friends. Lately, my family’s home has been flocking to React. I’m also curious why react is so hot, so I started testing and started testing it. Learn for a while, the GL brothers organized training and made a project to demo. There is nothing worth saying if I do not encounter some banana bugs. The error was messy again so I don’t know where that time @@ There were bugs I found out nearly in the morning. This is annoying, just because the props are in the wrong type At that time, thanks to my brother sitting right behind to ask for guidance, I knew the react had a package of prop-types to validate the pile of props and slapped my face with an error to correct the props. That said, I really like this package, so I don’t have to eat onions because of the silly bugs due to the wrong props. If you switch from C #, C or Java to Js, it is really annoying with variable declaration without data type. Because of that, when I used that variable elsewhere, I no longer realized what type it was. In React, it is even more forgotten when passed through props of dozens of components. Let’s find out together.
How to add typechecking to components
It’s really easy, guys, assuming you have data like this (picture below)
Statistics, now there are 2 files like this ListPets.js and Pet.js
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 | <span class="token keyword">import</span> React <span class="token punctuation">,</span> <span class="token punctuation">{</span> Component <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> Pet <span class="token keyword">from</span> <span class="token string">'./Pet'</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">MyPets</span> <span class="token keyword">extends</span> <span class="token class-name">Component</span> <span class="token punctuation">{</span> state <span class="token operator">=</span> <span class="token punctuation">{</span> pets <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'fluffy'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'white'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">6</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'dog'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">2</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'molly'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'brown'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">9</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'cat'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">3</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'buster'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'black'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">3</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'dog'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'grant'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'black'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">6</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'cat'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">5</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'pepsi'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'grey'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'dog'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">6</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'winston'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'brown'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">8</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'dog'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">7</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'sprite'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'white'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'cat'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">8</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'oscar'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'grey'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">2</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'dog'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">9</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'bumper'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'black'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">12</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'dog'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'happy'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'white'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">11</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'dog'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">11</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'speedy'</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'black'</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">9</span> <span class="token punctuation">,</span> type <span class="token punctuation">:</span> <span class="token string">'cat'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> title <span class="token punctuation">:</span> <span class="token string">'my pets'</span> <span class="token punctuation">}</span> <span class="token function">render</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 <span class="token operator">></span> <span class="token operator"><</span> h2 <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> state <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 operator"><</span> ul <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> state <span class="token punctuation">.</span> pets <span class="token punctuation">.</span> <span class="token function">map</span> <span class="token punctuation">(</span> pet <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token operator"><</span> Pet key <span class="token operator">=</span> <span class="token punctuation">{</span> pet <span class="token punctuation">.</span> id <span class="token punctuation">}</span> pet <span class="token operator">=</span> <span class="token punctuation">{</span> pet <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></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> ul <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> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">default</span> MyPets |
1 2 3 4 5 6 7 8 9 10 11 | <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 comment">//functional stateless component</span> <span class="token keyword">const</span> <span class="token function-variable function">Pet</span> <span class="token operator">=</span> <span class="token punctuation">(</span> props <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> li <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token template-string"><span class="token string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> props <span class="token punctuation">.</span> pet <span class="token punctuation">.</span> name <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> is </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> props <span class="token punctuation">.</span> pet <span class="token punctuation">.</span> color <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> and is </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> props <span class="token punctuation">.</span> pet <span class="token punctuation">.</span> age <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> years old.`</span></span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <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">default</span> Pet |
The simple scenario is that ListPet will pass props through the Pet to display the corresponding data.
Now if I edit line 29 of the ListPets file to
1 2 | <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> state <span class="token punctuation">.</span> pets <span class="token punctuation">.</span> <span class="token function">map</span> <span class="token punctuation">(</span> pet <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token operator"><</span> Pet key <span class="token operator">=</span> <span class="token punctuation">{</span> pet <span class="token punctuation">.</span> id <span class="token punctuation">}</span> pet <span class="token operator">=</span> <span class="token punctuation">{</span> pet <span class="token punctuation">.</span> name <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
In Europe, we will encounter one of these bugs:
ListPets: I have passed all the props, show it Pet: I need an object, but what is it I don’t understand
Then always. When I see this error I will think: oh I am right. Yes the right beep. Underfind a mountain: v But it’s worth mentioning that turning on the console made a mistake, huhu now. Only when I report an error, can I correct it? Now we need 1 error message is everything immediately. If the flu has a tiffy, the validate props have prop-types
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <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">import</span> PropTypes <span class="token keyword">from</span> <span class="token string">'prop-types'</span> <span class="token punctuation">;</span> <span class="token comment">//functional stateless component</span> <span class="token keyword">const</span> <span class="token function-variable function">Pet</span> <span class="token operator">=</span> <span class="token punctuation">(</span> props <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> li <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token template-string"><span class="token string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> props <span class="token punctuation">.</span> pet <span class="token punctuation">.</span> name <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> is </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> props <span class="token punctuation">.</span> pet <span class="token punctuation">.</span> color <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> and is </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> props <span class="token punctuation">.</span> pet <span class="token punctuation">.</span> age <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> years old.`</span></span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// setup typechecking </span> Pet <span class="token punctuation">.</span> propTypes <span class="token operator">=</span> <span class="token punctuation">{</span> pet <span class="token punctuation">:</span> PropTypes <span class="token punctuation">.</span> object <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> Pet |
With the above setup, when calling the Pet component, it will immediately give us an error message when passing the wrong props as follows:
Okay, and so we can realize the carelessness of passing the wrong props. Now that we correct the props that the Pet component wants, we will have our beloved Pets list appear
summary
- Javascript is a language that doesn’t provide data type
- Prop-types are a simple way to minimize data transmission errors.
- With Prop-types, we will know immediately which subcomponents need the data type to display properly.
- Do not forget to import the library before using: v
You can read more at the docs https://reactjs.org/docs/typechecking-with-proptypes.html
# Reference https://medium.com/dailyjs/how-to-add-typechecking-to-your-react-components-223c5560ba58