<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: José Lázaro</title>
    <description>The latest articles on Forem by José Lázaro (@lazarocontato).</description>
    <link>https://forem.com/lazarocontato</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F650802%2F37951bed-2d56-4f9f-b280-7e715277ef55.png</url>
      <title>Forem: José Lázaro</title>
      <link>https://forem.com/lazarocontato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lazarocontato"/>
    <language>en</language>
    <item>
      <title>What the heck is a Closure?(SIMPLE JS DEFINITION)</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Thu, 09 Jan 2025 15:13:57 +0000</pubDate>
      <link>https://forem.com/lazarocontato/what-the-heck-is-a-closuresimple-js-definition-eg6</link>
      <guid>https://forem.com/lazarocontato/what-the-heck-is-a-closuresimple-js-definition-eg6</guid>
      <description>&lt;p&gt;I remember my first job interview when the interviewer asked me to define Closure. It was a nightmare because I didn’t know the technical term. But deep inside, I had a feeling that I understood what it meant, even if I couldn’t explain it.&lt;/p&gt;

&lt;p&gt;After the interview ended (spoiler: I wasn’t selected), I rushed to Google to read about closures. The first term I encountered was Lexical Scoping = _What?&lt;/p&gt;

&lt;p&gt;Don't worry, Lexical Scoping is just a fancy term for something simple!&lt;/p&gt;

&lt;p&gt;So let’s dive in and understand it step by step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lexical Scoping explained
&lt;/h3&gt;

&lt;p&gt;Think of your house. Imagine you’re in your bedroom and want to turn on the bedroom lamp. You can only turn on the lamp that’s in the room you’re currently in. This is Lexical Scoping: you can only access and modify things (like the lamp) that are within your current context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bedroom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;bedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;turnOnBedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;turnOffBedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The functions &lt;code&gt;turnOnBedroomLamp&lt;/code&gt; and &lt;code&gt;turnOffBedroomLamp&lt;/code&gt; exist inside the bedroom context, so they can access and modify the bedroomLamp variable.&lt;/p&gt;

&lt;p&gt;Now, imagine you’re in the kitchen and try to turn off the bedroom lamp. This won’t work because you’re in a different context, and the kitchen doesn’t have access to the bedroomLamp variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;kitchen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;turnOnBedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// You can't do this!!&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very simple, right?&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s the Relation Between Lexical Scoping and Closure?
&lt;/h3&gt;

&lt;p&gt;Now let’s take it further. Imagine your house has a remote control that lets you turn on the bedroom lamp, no matter which room you’re in. This remote control "remembers" the bedroom lamp it controls, even if you're in the kitchen.&lt;/p&gt;

&lt;p&gt;This "memory" is what a Closure is!&lt;/p&gt;

&lt;p&gt;Here’s an example in code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bedroom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;bedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;turnOnBedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bedroomLamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;turnOnBedroomLamp&lt;/span&gt; &lt;span class="c1"&gt;// Returning the function&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;remoteControl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bedroom&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Creating the closure&lt;/span&gt;
&lt;span class="nf"&gt;remoteControl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Using the closure to turn on the bedroom lamp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example:&lt;/p&gt;

&lt;p&gt;The bedroom function creates a local variable bedroomLamp and a function turnOnBedroomLamp.&lt;/p&gt;

&lt;p&gt;turnOnBedroomLamp remembers the context in which it was created (the bedroom function).&lt;/p&gt;

&lt;p&gt;When we call remoteControl (the returned function), it still has access to the bedroomLamp variable, even though we’re now outside the bedroom function.&lt;/p&gt;

&lt;p&gt;See? It is a very simple idea, is just Javascript remembering things so you can use in different places in different ways.&lt;/p&gt;

&lt;p&gt;Now thinking in a real context of code, let's see how we can use closure in our days. The code below creates a function to add discounts in a product value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createDiscount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tenPercentOff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 10% off&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;twentyPercentOff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 20% off&lt;/span&gt;

&lt;span class="c1"&gt;// Using discount functions&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;tenPercentOff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// returns 90&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;twentyPercentOff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// returns 160&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you're aware about closure and prepared when some interview ask you the definition. For more content, check references section.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures" rel="noopener noreferrer"&gt;Closure - MDN Web Docks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.geeksforgeeks.org/closure-in-javascript/" rel="noopener noreferrer"&gt;Closure in JavaScript - GeeksForGeeks&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Understand React and Virtual DOM (easy explanation)</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Mon, 06 Jan 2025 22:42:59 +0000</pubDate>
      <link>https://forem.com/lazarocontato/understand-react-and-virtual-dom-easy-explanation-3glf</link>
      <guid>https://forem.com/lazarocontato/understand-react-and-virtual-dom-easy-explanation-3glf</guid>
      <description>&lt;p&gt;Every time we talk about React and its main benefits, we encounter the term Virtual DOM, a very cool feature that makes React an awesome option for building applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  What DOM is?
&lt;/h3&gt;

&lt;p&gt;Before understanding what the Virtual DOM is, let's first take a look at the REAL DOM.&lt;/p&gt;

&lt;p&gt;DOM stands for Document Object Model. It is essentially a structure that represents all the elements in the HTML of a page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxda8zbnj6jykki4qyl18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxda8zbnj6jykki4qyl18.png" alt="Image description" width="368" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each element in this tree structure is a node. Nodes can have children, meaning each element can have its own subtree as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div&amp;gt;
  &amp;lt;p&amp;gt;Some Text&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example above shows a div node that has a p node as its child. The simplest way to explain what the DOM is: A tree structure representing the relationships between HTML elements.&lt;/p&gt;

&lt;p&gt;In a traditional web application (think of older web pages you might have used), updating an element on the screen often meant reloading the entire page. This default approach could become cumbersome, especially in large applications with frequent updates.&lt;/p&gt;

&lt;p&gt;The Virtual DOM provides a more efficient way to manage state and data in an application without needing to reload the entire page to apply changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;React creates an in-memory representation of the real DOM called the Virtual DOM. This representation is constantly observed by React 👀. &lt;/p&gt;

&lt;p&gt;Whenever the user interacts with the application, React compares the updated Virtual DOM with the previous version of the real DOM using a process called "Diffing."&lt;/p&gt;

&lt;p&gt;If React detects a change, it identifies the exact node where the change occurred and updates only that part of the DOM. This avoids refreshing the entire page and results in a much smoother user experience. So smart!!!1&lt;/p&gt;

&lt;h3&gt;
  
  
  Some potential challengers
&lt;/h3&gt;

&lt;p&gt;For highly dynamic applications, such as those with real-time updates (e.g., graphs or games), the Diffing process might become slow because React needs to evaluate every change. This can impact performance.&lt;/p&gt;

&lt;p&gt;Furthermore, managing large lists can be a very big challenge if not handled properly. For example, when the state of a large list changes, React might need to reconcile many DOM updates, leading to laggy performance.&lt;/p&gt;

&lt;p&gt;To mitigate this, React uses key properties in lists. These keys help React uniquely identify each item in the list and efficiently determine which items were added, removed, or updated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fivpz2jsfpxfv3v77c8uj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fivpz2jsfpxfv3v77c8uj.png" alt="Image description" width="396" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thats the basic you need to know about Virtual DOM. You can check more details in reference section or googling a little bit more. Feel free leave any questions in the comments. See you soon.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.w3.org/TR/REC-DOM-Level-1/introduction.html" rel="noopener noreferrer"&gt;W3 explanation about DOM&lt;/a&gt; &lt;br&gt;
&lt;a href="https://legacy.reactjs.org/docs/faq-internals.html" rel="noopener noreferrer"&gt;React documentation about Virtual DOM&lt;/a&gt; &lt;br&gt;
&lt;a href="https://www.freecodecamp.org/news/what-is-the-virtual-dom-in-react/" rel="noopener noreferrer"&gt;Free Code Camp Virtual DOM article&lt;/a&gt; &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>react</category>
      <category>beginners</category>
    </item>
    <item>
      <title>When to use rem, em, or pixels</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Mon, 16 Sep 2024 21:42:29 +0000</pubDate>
      <link>https://forem.com/lazarocontato/when-to-use-rem-em-or-pixels-566h</link>
      <guid>https://forem.com/lazarocontato/when-to-use-rem-em-or-pixels-566h</guid>
      <description>&lt;p&gt;When we start studying web development, particularly the concepts of CSS and the use of measurement units, it’s normal to have some doubts about the three main units presented to us: px, rem, and em.&lt;/p&gt;

&lt;p&gt;My doubts began when I started studying and creating components in ReactJS. It’s not always clear when to prefer one unit over another, so here is a brief explanation of each unit’s concept and the best time to use each.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is the Px Dimension?
&lt;/h1&gt;

&lt;p&gt;It’s important to clarify initially that the pixel we use in CSS is not exactly the same as the physical pixel. CSS defines what we can call a reference pixel, which measures the size of a pixel on a 96dpi screen. When we specify the pixel unit in a project, the agent using the value assigned will rescale it to its unit that corresponds to the reference pixel.&lt;/p&gt;

&lt;p&gt;Moreover, the pixel is an absolute and non-scalable unit. Changing its value does not affect other absolute unit values; that is, the pixel value remains unchanged even after user settings.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is rem?
&lt;/h1&gt;

&lt;p&gt;Unlike pixels, rem is a scalable and relative unit. It varies according to the root dimension of your browser (by default, this unit is 16px), so 1rem = 16px most of the time. It can vary if the root font size is changed.&lt;/p&gt;

&lt;p&gt;Below, you can see that the root font size in Chrome is set to 16px.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsnetetgeq6yyphgydgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsnetetgeq6yyphgydgu.png" alt="Image description" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To convert pixels to rem, you can manually calculate it with a basic division:&lt;/p&gt;

&lt;p&gt;To create an element with a size of 32px, divide 32px by 16px = 2rem. Alternatively, you can use ready-made applications for this conversion:&lt;/p&gt;

&lt;p&gt;Here is a simple application I developed for converting px to rem or vice versa - &lt;a href="https://pixeltorem.netlify.app/" rel="noopener noreferrer"&gt;Access here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The big question is, if rem is essentially a model that converts pixels to another scale, what’s the difference in the code? If the user doesn’t change their root font size, there is no difference since pixels and rem will have the same value. However, for those who change the root size for better accessibility, all elements sized in rem would change proportionally.&lt;/p&gt;

&lt;p&gt;It’s important to remember that when zoom is used in a browser, pixels scale correctly, but user default settings’ unpredictability forces us to use methodologies that cover all configuration variations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small Tip on Using rem
&lt;/h2&gt;

&lt;p&gt;We can use a small trick to simplify the use of rem and its conversion. It involves changing the font-size value of html to 62.5%, which equals 10px, and setting the body value back to 16px:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;html {
  font-size: 62.5%; //10px
}

body {
  font-size: 1.6rem; //16px
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, 1rem = 10px, making the conversion much simpler since you only need to divide the pixel value by 10 to get the rem value.&lt;/p&gt;

&lt;p&gt;Read more &lt;a href="https://www.aleksandrhovhannisyan.com/blog/62-5-percent-font-size-trick/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is em?
&lt;/h1&gt;

&lt;p&gt;The em is also a dynamic unit, but its reference is not the browser’s root value. According to w3Schools, em equals the calculated value of the font-size property of the element it is used in, often the element’s parent. A brief example: an element with a font-size of 2rem (32px if we consider the root value) has a child with a font-size of 1em, so the child’s value will be 32px, as the reference value in this case is the parent.&lt;/p&gt;

&lt;h1&gt;
  
  
  When to Use Each One?
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Pixel (px)
&lt;/h3&gt;

&lt;p&gt;Primarily for fine adjustments or small margins. You can use pixels to define border thickness, for example, or for precise positioning of an element with absolute positioning. This will not break your layout when changing the root of a browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  rem
&lt;/h3&gt;

&lt;p&gt;You can use rem throughout your project; it’s great for keeping things accessible and adaptable. Use tools that help with formatting. In VSCode, for example, there’s px to rem that can make conversion much easier. Also, always comment next to a rem dimension with its pixel equivalent for future code changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
  font-size: 1rem; //16px
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  em
&lt;/h3&gt;

&lt;p&gt;It’s a great alternative for padding, line heights, and margins. A practical example is a section with text elements. Using em to size line heights will make the display of elements more dynamic if the layout view changes.&lt;/p&gt;

&lt;p&gt;Start practicing the use of these three units in your projects whenever possible and see how they behave with changes in root size. Your code will be much more elegant and your project much more beautiful.&lt;/p&gt;

&lt;h1&gt;
  
  
  References:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://chiamakaikeanyi.dev/sizing-in-css-px-vs-em-vs-rem/" rel="noopener noreferrer"&gt;Sizing in CSS: px vs em vs rem&lt;/a&gt;&lt;br&gt;
&lt;a href="https://uxdesign.cc/why-designers-should-move-from-px-to-rem-and-how-to-do-that-in-figma-c0ea23e07a15" rel="noopener noreferrer"&gt;Why Designers Should Move from px to rem and How to Do That in Figma&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.w3.org/TR/css3-values/#font-relative-lengths" rel="noopener noreferrer"&gt;CSS3 Values and Units&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/11799236/should-i-use-px-or-rem-value-units-in-my-css" rel="noopener noreferrer"&gt;Should I Use px or rem Value Units in My CSS?&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Criando custom Hook para capturar o width da tela em ReactJs</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Tue, 13 Dec 2022 14:32:12 +0000</pubDate>
      <link>https://forem.com/lazarocontato/criando-custom-hook-para-capturar-o-width-da-tela-em-reactjs-36m7</link>
      <guid>https://forem.com/lazarocontato/criando-custom-hook-para-capturar-o-width-da-tela-em-reactjs-36m7</guid>
      <description>&lt;p&gt;Uma forma prática de utilizar o valor da largura de uma tela (screenWidth) em ReactJs usando Javascript, é utilizando uma metodologia disponibilizada pelo próprio React para gerenciarmos nossas aplicações, os Custom Hooks.&lt;/p&gt;

&lt;p&gt;Com esse método de captura do screenWidth conseguimos utilizar o valor atual da largura de tela para criarmos diversos tipos de lógica em nossa aplicação, como uma renderização condicional de um header por exemplo. &lt;/p&gt;

&lt;h3&gt;
  
  
  Conceito de Custom Hook
&lt;/h3&gt;

&lt;p&gt;Custom Hooks foram implementados na versão 16.8 do React, e ele dá a possibilidade de utilizar recursos do React como gerenciamento de estado sem precisarmos necessariamente de uma classe para isso.&lt;/p&gt;

&lt;p&gt;Você pode ler um pouco sobre Custom Hooks na própria documentação do React bem &lt;a href="'https://reactjs.org/docs/hooks-custom.html'"&gt;aqui.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criar hooks para diferentes funcionalidades é bem útil quando precisamos de o valor de forma recorrente no nosso código. Não existe nenhuma regra geral para se criar hooks ou funções, mas eu, particularmente, crio novos hooks sempre que preciso lidar com valores que dependem de um estado. &lt;/p&gt;

&lt;p&gt;Vamos então para a parte prática da criação do hook.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const useScreenWidth = () =&amp;gt; {
  const [screenWidth, setScreenWidth] = useState&amp;lt;number&amp;gt;(window.innerWidth)

  const handleWindowSizeChange = () =&amp;gt; {
    setScreenWidth(window.innerWidth)
  }

  useEffect(() =&amp;gt; {
    window.addEventListener('resize', handleWindowSizeChange)
    return () =&amp;gt; {
      window.removeEventListener('resize', handleWindowSizeChange)
    }
  }, [])

  return screenWidth
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O nome de um hook por padrão é sempre iniciado com a palavra "use" seguido do objetivo daquele hook. Utilizaremos isso como regra para criar nossos futuros hooks.&lt;/p&gt;

&lt;p&gt;1 - Inicialmente criamos um hook chamado useScreenWidth. É muito importante que utilizamos sempre a regra de criação de nomes de hooks, essa nomeclatura é obrigatória para que o react entenda que o que estamos criando é um customHook.&lt;/p&gt;

&lt;p&gt;2 - Criamos um estado chamado screenWidth, será esse o valor que utilizaremos na nossa aplicação.&lt;/p&gt;

&lt;p&gt;3 - Em seguida criamos uma nova função chamada &lt;code&gt;handleWindowSizeChange&lt;/code&gt; que capturará o valor da largura da tela através da propriedade &lt;code&gt;window.innerWidth&lt;/code&gt; e armazenará dentro do nosso estado &lt;code&gt;screenWidth&lt;/code&gt; a largura da tela através da função &lt;code&gt;setScreenWidth()&lt;/code&gt;. A propriedade &lt;code&gt;window.innerWidth&lt;/code&gt; é nativa do Javascript e retorna a largura interior de uma janela em pixels. Você pode ler mais sobre &lt;a href="'https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth'"&gt;aqui.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4 - Precisamos observar os valores da tela para que possamos retornar para nossa aplicação, desse modo, utilizaremos um useEffect, hook nativo do React que tem como objetivo causar um efeito colaterais na nossa aplicação. Dentro desse efeito utilizaremos o método &lt;code&gt;window.addEventListener&lt;/code&gt; que basicamente especifica uma função que será executada sempre que o evento especificado acontecer. No nosso caso, o evento esperado é o resize da tela. Desse modo, sempre que a tela sofrer alterações em suas dimensões executaremos a função &lt;code&gt;handleWindowSizeChange&lt;/code&gt; especificada no item 3.&lt;/p&gt;

&lt;p&gt;5 - O React executa a limpeza sempre que o componente desmonta. Entretanto, efeitos rodam em todas as renderizações de um componente, e não apenas uma vez. Sendo assim, o React deve limpar os efeitos da renderização anterior antes de rodar os efeitos da próxima vez. Desse modo, é suma importância que evitemos o memory leak, ou vazamento de memória especificando quando o nosso hook deve remover o listener para que possamos evitar esse vazamento. Logo, retornamos a remoção do listener através do método &lt;code&gt;window.removeEventListener&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;7 - É importante lembrar que nosso efeito não contém dependências pois ele não depende de nenhuma variável externa para ser executada.&lt;/p&gt;

&lt;p&gt;6 - Por ultimo retornamos o nosso estado para que possa ser utilizado pela nossa aplicação.&lt;/p&gt;

&lt;p&gt;Após a criação do nosso hook podemos chama-lo em qualquer componente de nossa aplicação apenas com o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const screenWidth = useScreenWidth()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desse modo, a constante screenWidth estará disponível para ser utilizada sempre que quisermos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;p&gt;Como sugestão de leitura deixo aqui a documentação do próprio React para quem quiser se aprofundar mais na utilização de hooks.&lt;/p&gt;

&lt;p&gt;&lt;a href="'https://reactjs.org/docs/hooks-intro.html'"&gt;React Hooks&lt;/a&gt;&lt;/p&gt;

</description>
      <category>performance</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Quais são os tipos primitivos em Javascript</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Thu, 24 Nov 2022 23:23:03 +0000</pubDate>
      <link>https://forem.com/lazarocontato/quais-sao-os-tipos-primitivos-em-javascript-347a</link>
      <guid>https://forem.com/lazarocontato/quais-sao-os-tipos-primitivos-em-javascript-347a</guid>
      <description>&lt;p&gt;Antes de começar a aprender qualquer conteúdo novo é muito importante que conceitos básicos estejam fixados em nossa mente, desse modo, a solução de eventuais problemas serão muito mais simples de se resolver.&lt;/p&gt;

&lt;p&gt;Assim como em qualquer linguagem de programação, estamos totalmente e inevitavelmente dispostos a manipular e ler dados, sendo assim, nada mais justo que começar aprendendo quais tipos de dados teremos de manipular e ler eventualmente.&lt;/p&gt;

&lt;p&gt;Primeiramente é importante saber que todo dado em Javascript ou é um objeto ou é um tipo primitivo, uma descrição sobre objeto pode ficar para outro momento, hoje iremos lidar apenas com o entendimento dos &lt;strong&gt;tipos primitivos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Em Javascript temos 6 tipos primitivos &lt;code&gt;undefined&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt; e &lt;code&gt;symbol&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nós podemos verificar o tipo de um variável utilizando a função &lt;code&gt;typeof&lt;/code&gt; no javascript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(typeof 'Hello') //String
console.log(typeof 12) //Numer
console.log(typeof true) //Boolean
console.log(typeof false) //Boolean
console.log(typeof NaN) //Number
console.log(typeof 0.1) //Number
console.log(typeof '1') //String
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos dar uma olhada em cada tipo primitivo e exemplificar cada caso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Undefined
&lt;/h2&gt;

&lt;p&gt;Quando uma variável é declarada mas não é inicializada ela recebe o valor undefined por padrão.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const element
console.log(typeof element) //undefined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O valor undefined também é atribuido a variáveis que nem mesmo foram declaradas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(typeof value) //undefined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;uma função também retornará undefined caso ela não retorne nenhum valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const metodo = () =&amp;gt; {
return
}

metodo() //undefined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Null
&lt;/h2&gt;

&lt;p&gt;O Null é um tipo primitivo que pode ser utilizado para representar o nada, ele contém apenas um valor, o próprio null. O JavaScript define que null é um objeto vazio. Sendo assim, podemos atribuir null a um objeto vazio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const a = null
console.log(typeof a) //object
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Number
&lt;/h2&gt;

&lt;p&gt;O tipo number é um dos tipos que o Javascript usa para se referir a números, sejam eles inteiros ou decimais. Diferente de outras linguagens fortemente tipadas como Java, o número 1.5 e o número 10 são do tipo number, sem a divisão de tipos entre números decimais ou inteiros.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const age = 14
const value = 14.23
console.log(typeof age) //number
console.log(typeof value) //number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além destes, javascript contém seu próprio método para tratar números infinitos, sendo +Infinity para números infinitos positivos e -Infinity para números infinitos negativos.&lt;/p&gt;

&lt;p&gt;Além desses, javascript contém um valor que se refere a um número inválido, o NaN (Not a Number). Como por exemplo a divisão 0/0&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const a = 0
const b = 0
console.log(a/b) //NaN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  String
&lt;/h2&gt;

&lt;p&gt;Strings são caracteres entre aspas. Qualquer valor entre aspas nao convertido é uma string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const name = 'José'
const age = '15'
const value = 'false'

console.log(typeof name) //string
console.log(typeof age) //string
console.log(typeof value) //string
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;é importante lembrar que pode-se utilizar aspas simples '' ou duplas "" para criar strings, então deve-se ter muito cuidado com strings que contém aspas dentro dela, ela pode ser fechada antes do desejado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const english = 'What's your name' //string incorreta
const english = "What's your name" //string correta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As strings são valores imutáveis, sendo assim, não conseguimos alterar uma string após criarmos.&lt;/p&gt;

&lt;p&gt;É possível concatenarmos strings utilizando o sinal de +. Neste caso o Javascript une duas strings e cria uma nova.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const firstName = 'José'
const lastName = 'Lázaro'
const fullName = firstName + " " + lastName
console.log(fullName) //José Lázaro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Boolean
&lt;/h2&gt;

&lt;p&gt;O boolean é um tipo primitivo que contém apenas dois valores possíveis, &lt;strong&gt;true&lt;/strong&gt; ou &lt;strong&gt;false&lt;/strong&gt;, ou seja, o boolean armazena a informação se algo é verdadeiro ou falso. Basicamente o boolean nos permitirá trabalhar com condições dentro do nosso código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const condicao = true
console.log(condicao) //boolean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A seguir podemos ver como o javascript lida com o tipo dos valores quando os convertemos para outros tipos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9v6yd0y4rh59qli2bgt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9v6yd0y4rh59qli2bgt.png" alt="Image description" width="613" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Symbol
&lt;/h2&gt;

&lt;p&gt;O tipo primitivo Symbol foi adicionado na versão do ECMAScript 6. Os valores de tipo Symbol podem ser usados para fazer propriedades de objetos anônimos. &lt;/p&gt;

&lt;p&gt;para declarar um symbol usamos a seguinte lógica&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const mySymbol = Symbol();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nota acerca de criação de valores primitivos
&lt;/h3&gt;

&lt;p&gt;Os tipos primitivos &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt; podem ser encapsulados por suas contrapartes de objeto gerando assim objetos de retorno, entretanto seus valores reais são os tipos primitivos. Mas o que isso quer dizer? &lt;/p&gt;

&lt;p&gt;Basicamente, especificamente esses tipos podem ser gerados a partir de funções e os valores dessas funções retornam tipos primitivos. Você pode ver os exemplos a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typeof false; //boolean
typeof Boolean(false); //boolean
typeof new Boolean(false); //object
typeof (new Boolean(false)).valueOf(); //boolean

typeof "a"; //string
typeof String("a"); //string
typeof new String("a"); //object
typeof (new String("a")).valueOf(); //string

typeof 1; //number
typeof Number(1); //number
typeof new Number(1); //object
typeof (new Number(113)).valueOf(); //number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://medium.com/@alves.guilherme1357/tipos-de-dados-primitivos-em-javascript-d7380564933c" rel="noopener noreferrer"&gt;Tipos de dados primitivos em Javascript - Guilherme Alves - Medium&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ricardo-reis.medium.com/tipos-de-dados-javascript-a1f6f498a7d4" rel="noopener noreferrer"&gt;Tipos de dados Javascript - Ricardo Reis&lt;/a&gt;&lt;br&gt;
&lt;a href="https://tc39.es/ecma262/#sec-null-value" rel="noopener noreferrer"&gt;ECMAScript® 2023 Language Specification&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Symbol" rel="noopener noreferrer"&gt;Symbol() Developer Mozilla&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Entendendo a diferença entre null e undefined em Javascript</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Sat, 21 May 2022 17:02:03 +0000</pubDate>
      <link>https://forem.com/lazarocontato/entendendo-a-diferenca-entre-null-e-undefined-em-javascript-58h9</link>
      <guid>https://forem.com/lazarocontato/entendendo-a-diferenca-entre-null-e-undefined-em-javascript-58h9</guid>
      <description>&lt;p&gt;Em Javascript, além dos tipos que normalmente nos deparamos (string, number, boolean, etc) possuimos o null e undefined. Suas definições podem ser um pouco confusas, principalmente porque entre linguagens podem possuir certas diferenças. &lt;/p&gt;

&lt;p&gt;Vamos entender inicialmente como se caracteriza cada um dos tipos:&lt;/p&gt;

&lt;h2&gt;
  
  
  Undefined
&lt;/h2&gt;

&lt;p&gt;Em resumo, undefined é um variável que foi declarado mas não recebeu nenhum valor ainda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var someVar;

console.log(someVar) //undefined

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão, quando uma variável é criada ele recebe o valor undefined, no caso acima, a variável &lt;code&gt;someVar&lt;/code&gt; foi declarada mas não recebeu nenhum valor, logo, passou a ser undefined, pois seu valor não foi definido.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Semânticamente undefined indica a ausência de um valor&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podemos utilizar o &lt;code&gt;typeof&lt;/code&gt; em uma variável para descobrirmos o seu tipo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var x;

console.log(typeof x === "undefined"); // true
console.log(typeof x == "undefined"); //true
console.log(typeof x === "object"); //false 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro de um objeto, uma propriedade não definida também recebe o valor de undefined:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var test = {};
console.log(test.nome); // undefined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É importante lembrar que quando transformamos um objeto em JSON. os valores undefined não são reconhecidos, isso porque o JSON não reconhece o valor undefined como válido.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var q = {name: undefined, number: 1};
JSON.stringify(q); // {"number": 1} 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Null
&lt;/h2&gt;

&lt;p&gt;Diferente do undefined, o null é um valor vazio ou inexistente. Nulo é atribuído e explicitamente não significa nada. Quando definimos um valor de uma variável como null, dizemos que a variável está vazia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var a = null;
console.log(a); // null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, null é também um objeto. Leia mais sobre null &lt;a href="https://dmitripavlutin.com/javascript-null/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(typeof null) //object
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos comparar também null com undefined como fazemos a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; null == undefined// true
 null === undefined // false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;isso significa que null é undefined mas não é idêntico pelos motivos supracitados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferenças entre null e undefined
&lt;/h2&gt;

&lt;p&gt;Para frisarmos melhor a diferença entre ambos, vamos revisar os conceitos:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Undefined é uma variável declarada que não recebeu nenhum valor ainda, ou seja, ausência de valor em uma variável existente. Seu tipo é undefined.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var a;

console.log(a) // undefined;
console.log(typeof a) // undefined;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma variável com valor undefined nunca foi definida ou ela foi atribuída a undefined para ser "limpa".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Null é um valor inexistente ou vazio, null é um valor atribuído. Seu tipo é object.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var b = null;

console.log(a) // null;
console.log(typeof a) // object;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Null é um valor nulo atribuído a um objeto. Em resumo é um objeto que não foi inicializado ainda ou não foi criado. É usado para passar valores padrão de objetos não inicializados. &lt;/p&gt;

&lt;p&gt;Os comparadores são ótimas maneiras de verificarmos os tipos de determinados elementos dentro de uma linguagem.&lt;/p&gt;

&lt;p&gt;comparações de tipos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(false == undefined); //false
console.log(false == null); //false
console.log(null == undefined); //true
console.log(null === null); //true
console.log(undefined === undefined); //true
console.log(undefined === null); //false
console.log(undefined == null); //true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É importante o conhecimento acerca dos tipos especiais, principalmente quando estamos lidando com tipagem em Javascript. Esteja sempre atento aos elementos passados no seu código para evitar qualquer bug. Abaixo você encontra algumas referências acerca do tema discutido neste artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pt.stackoverflow.com/questions/2407/qual-a-diferen%C3%A7a-entre-null-e-undefined#:%7E:text=Semanticamente%2C%20undefined%20significa%20%22sem%20refer%C3%AAncia,null%20significa%20%22sem%20valor%22" rel="noopener noreferrer"&gt;https://pt.stackoverflow.com/questions/2407/qual-a-diferen%C3%A7a-entre-null-e-undefined#:~:text=Semanticamente%2C%20undefined%20significa%20%22sem%20refer%C3%AAncia,null%20significa%20%22sem%20valor%22&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://flexiple.com/undefined-vs-null-javascript/" rel="noopener noreferrer"&gt;https://flexiple.com/undefined-vs-null-javascript/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codeburst.io/javascript-whats-the-difference-between-null-undefined-37793b5bfce6" rel="noopener noreferrer"&gt;https://codeburst.io/javascript-whats-the-difference-between-null-undefined-37793b5bfce6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/5076944/what-is-the-difference-between-null-and-undefined-in-javascript" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/5076944/what-is-the-difference-between-null-and-undefined-in-javascript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.geeksforgeeks.org/undefined-vs-null-in-javascript/" rel="noopener noreferrer"&gt;https://www.geeksforgeeks.org/undefined-vs-null-in-javascript/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Quando utilizar rem, em ou pixel</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Fri, 20 May 2022 00:12:05 +0000</pubDate>
      <link>https://forem.com/lazarocontato/quando-utilizar-rem-em-ou-pixel-cf0</link>
      <guid>https://forem.com/lazarocontato/quando-utilizar-rem-em-ou-pixel-cf0</guid>
      <description>&lt;p&gt;Quando começamos a estudar desenvolvimento web, principalmente a os conceitos de CSS e utilização de unidades de medidas é normal que surjam algumas dúvidas quanto a utilização das 3 principais que nos são apresentadas: px, rem e em. &lt;/p&gt;

&lt;p&gt;Minhas dúvidas começaram a surgir quando comecei a estudar e criar componentes no ReactJS. Nem sempre é tão claro quando devemos preferir uma unidade a outra, então aqui vou deixar uma breve explicação acerca do conceito de cada unidade e o melhor momento para utilizar cada uma.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é a dimensão Px
&lt;/h2&gt;

&lt;p&gt;É importante deixar claro inicialmente que o pixel que utilizamos em CSS não é exatamente igual ao pixel físico. O CSS define o que podemos chamar de pixel referência, que mede o tamanho de um pixel em uma tela de 96dpi. Quando especificamos a unidade pixel em um projeto, o agente que irá usar o valor atribuído fará o reescalonamento para sua unidade que corresponda ao pixel de referência.&lt;/p&gt;

&lt;p&gt;Além disso, o pixel é uma unidade absoluta e não escalável. A mudança do seu valor não afeta outros valores de unidade absolutas, ou seja, o valor do pixel continua imutável mesmo após configurações  do usuário. &lt;/p&gt;

&lt;h2&gt;
  
  
  O que é rem
&lt;/h2&gt;

&lt;p&gt;Diferente do pixel, o rem é uma unidade escalável e relativa, ele varia de acordo com a dimensão root do seu navegador (por padrão essa unidade é 16px), na maior parte das vezes 1rem = 16px. Podendo variar se o tamanho da fonte raiz for alterado.&lt;/p&gt;

&lt;p&gt;Abaixo você consegue ver que o tamanho da fonte raiz do chrome está configurada para 16px.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ey42w9fkrel3dy5rs0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ey42w9fkrel3dy5rs0y.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para fazer conversões de pixel para rem, você pode calcular manualmente fazendo uma divisão básica:&lt;/p&gt;

&lt;p&gt;Para criar um elemento com tamanho 32px dividimos 32px/16px = 2rem. Ou você pode utilizar aplicações prontas que realizem essa conversão:&lt;/p&gt;

&lt;p&gt;Aqui uma aplicação simples desenvolvida por mim para conversão de px para rem ou vice-versa - &lt;a href="https://pixeltorem.netlify.app/" rel="noopener noreferrer"&gt;https://pixeltorem.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A grande pergunta é, se o rem é basicamente um modelo que converte pixel para outra escala, qual a diferença no código que ele tem? Se o usuário não muda seu tamanho de fonte raiz, não existe diferença pois o pixel e o rem terão valor idêntico. Mas para aqueles que alteram o tamanho da raiz para melhor acessibilidade todos os elementos dimensionados em rem iriam mudar proporcionalmente.&lt;/p&gt;

&lt;p&gt;É importante lembrar que quando o zoom é utilizado em um navegador, o pixel é dimensionado corretamente, mas a imprevisibilidade das predefinições do usuário nos obriga a utilizar metodologias que abranjam todas as variações de configuração.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pequena dica sobre uso de rem
&lt;/h4&gt;

&lt;p&gt;Podemos utilizar um pequeno macete para facilitar o uso do rem e sua conversão. Consiste em mudar o valor do font-size do html para 62,5%, que seria = 10px e alterando o valor do body para 16px novamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;html {
  font-size: 62.5%; //10px
}

body {
  font-size: 1.6rem; //16px
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dessa forma 1rem = 10px, fazer a conversão torna-se bem mais simples já que basta dividir o valor em pixel por 10 e se obterá o valor em rem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.aleksandrhovhannisyan.com/blog/62-5-percent-font-size-trick/" rel="noopener noreferrer"&gt;leia mais aqui&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é em
&lt;/h2&gt;

&lt;p&gt;O em também é uma unidade dinâmica, porém sua referência não é o valor raiz do navegador, de acordo com o w3Schools o em é igual ao valor calculado da propriedade font-size do elemento no qual ela é usada, na maior parte das vezes pode ser o próprio pai do elemento. Um breve exemplo: um elemento com font-size 2rem (32px se considerarmos o valor padrão do root) possui um filho com font-size de 1em, então o valor do filho será igual a 32px, já que o valor referência neste caso é o pai.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar cada uma?
&lt;/h2&gt;

&lt;p&gt;pixel - Principalmente em ajustes finos, ou pequenas margens. Voce pode usar pixel para definir a espessura de uma borda por exemplo, um ajuste fino na hora de posicionar um elemento com posicionamento absoluto. Nada que quando alterado o root de um navegador quebre seu layout.&lt;/p&gt;

&lt;p&gt;rem - Você pode usar rem em todo o seu projeto, ele é ótimo para manter acessível e adaptável, utilize ferramentas que te auxiliem na formatação. No VSCode por exemplo voce possui o &lt;a href="https://marketplace.visualstudio.com/items?itemName=sainoba.px-to-rem" rel="noopener noreferrer"&gt;px to rem&lt;/a&gt; que pode facilitar muito a vida de conversão. Uma dica também é sempre que colocar uma dimensão em rem, comente na frente a quantos pixels aquele valor equivale para futuras alterações do código&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
font-size: 1rem; //16px
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;em - É uma ótima alternativa de se utilizar em preenchimentos, alturas de linhas e margens. Um exemplo prático é uma section com elementos de texto, utilizar o em para dimensionar as alturas das linhas tornará a exibição do elementos mais dinâmica frente a uma possível mudança de exibição do layout. &lt;/p&gt;

&lt;p&gt;Comece a praticar o uso das 3 unidades em seus projetos sempre que puder, e verifique como ele se comporta com a mudança do root size. Seu código fica muito mais elegante e seu projeto muito mais bonito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://chiamakaikeanyi.dev/sizing-in-css-px-vs-em-vs-rem/" rel="noopener noreferrer"&gt;https://chiamakaikeanyi.dev/sizing-in-css-px-vs-em-vs-rem/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uxdesign.cc/why-designers-should-move-from-px-to-rem-and-how-to-do-that-in-figma-c0ea23e07a15" rel="noopener noreferrer"&gt;https://uxdesign.cc/why-designers-should-move-from-px-to-rem-and-how-to-do-that-in-figma-c0ea23e07a15&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3.org/TR/css3-values/#font-relative-lengths" rel="noopener noreferrer"&gt;https://www.w3.org/TR/css3-values/#font-relative-lengths&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/11799236/should-i-use-px-or-rem-value-units-in-my-css" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/11799236/should-i-use-px-or-rem-value-units-in-my-css&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Gerenciamento de estado com useContext()</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Sat, 06 Nov 2021 03:24:05 +0000</pubDate>
      <link>https://forem.com/lazarocontato/gerenciamento-de-estado-com-usecontext-11dn</link>
      <guid>https://forem.com/lazarocontato/gerenciamento-de-estado-com-usecontext-11dn</guid>
      <description>&lt;p&gt;Lidar com estados no React é uma tarefa complicada quando começamos a utilizar estados de componentes que são consumidos globalmente. Criar estados em um componente e passar seu valor de estado para filhos e netos pode tornar o gerenciamento um tanto quanto complexo até mesmo para aplicações menores. Aqui começamos a falar de conceitos mais específicos do React com o intuito de facilitar nosso processo de produção de aplicações. Dessa vez, falaremos do useContext(), ferramenta e conceito imprescindível para produção de aplicações escaláveis e de manutenção eficiente. Vamos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Início de projeto
&lt;/h2&gt;

&lt;p&gt;Iremos criar um simples ToDo que receberá atividades a serem executadas. Definiremos um contexto global e utilizaremos este conceito para que a aplicação funcione corretamente.&lt;/p&gt;

&lt;p&gt;Abaixo você verá os meus diretórios da aplicação e o conteúdo de cada um. Neste artigo me limitarei a falar apenas acerca do conceito do estado, o conhecimento básico acerca da criação dos componentes subtende-se que o leitor já deva possuir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favp2vbdegr5vet23f8qu.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favp2vbdegr5vet23f8qu.PNG" alt="Image description" width="273" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os componentes estão todos em diretórios individuais dentro do diretório components. Desse modo organizamos o nosso código de uma maneira mais eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lidando com contexto
&lt;/h2&gt;

&lt;p&gt;Para que possamos entender o context precisamos inicialmente conhecer o conceito do state.&lt;/p&gt;

&lt;p&gt;Quando estamos produzindo uma aplicação, é inevitável que em algum momento comecemos a reutilizar constantes e estados, isso se dá pelo dinamismo de informações que estão dispostas no processo produtivo do desenvolvimento. Geralmente, lidar com uso de dados de forma global, principalmente no React, costuma ser confuso, já que quando lidamos com a utilização de vários elementos, o dado pode ficar confuso em meio a tantos parents da cadeia de componentes. Imagine só, definir um state em um elemento pai e sair distribuindo este valor para filhos e mais filhos na aplicação. Em algum momento a confusão deve tomar de conta de tudo. Para isso, criamos contextos, que são estados(states) definidos globalmente que podem ser utilizados em qualquer parte da nossa aplicação. Isso é bem mais prático do ponto de vista produtivo, já que só precisaremos lidar com o estado definido num arquivo separado. Sabendo disso, vamos começar a aplicar o useContext, ferramenta fundamental para entendermos o gerenciamento de estado em nossas aplicações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando um contexto
&lt;/h2&gt;

&lt;p&gt;Inicialmente iremos criar o contexto onde nossas constantes globais serão armazenadas. É daqui que iremos exportar o estado para utilizarmos em qualquer lugar que quisermos da nossa aplicação.&lt;/p&gt;

&lt;p&gt;Para isso, criaremos um novo diretório chamado de &lt;code&gt;context&lt;/code&gt;. Dentro dele, armazenaremos um novo arquivo com o formato &lt;code&gt;.jsx&lt;/code&gt; de nome ContextTodo. Esse aquivo armazenará os estados que precisamos. Ficamos então com esta estrutura.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenkvqga36yp4a7lc7290.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenkvqga36yp4a7lc7290.PNG" alt="Image description" width="275" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após o arquivo ter sido criado, devemos começar executando alguns passos para a criação do nosso contexto. Confira abaixo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gt0cfgccyorl2c1cgkr.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gt0cfgccyorl2c1cgkr.PNG" alt="Image description" width="780" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como de praxe, começamos importando o react. E como nova ferramenta, utilizaremos o hook &lt;code&gt;useContext&lt;/code&gt; que importaremos também do react. Além de claro, nosso bom e velho &lt;code&gt;useState&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Após importados, definiremos uma constante chamada de &lt;code&gt;ContextTodo&lt;/code&gt; (elemento que armazena o nosso estado global) e criaremos um contexto na mesma através do hook react &lt;code&gt;createContext()&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Para gerenciarmos e definirmos o que acontece dentro deste contexto criado utilizaremos o Provider. O provider neste caso será uma constante que armazena uma arrow function, esta constante(TodoProvider) fará uso do nosso contexto. Sendo assim, a aplicação ficará toda contida dentro do nosso provider.&lt;/p&gt;

&lt;p&gt;A utilização do &lt;code&gt;{children}&lt;/code&gt; sendo utilizado como uma prop tem como intuito desconstruir os elementos que serão definidos ao longo da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo o provider
&lt;/h2&gt;

&lt;p&gt;Após criada nossa constante TodoProvider, devemos começar a criar alguns métodos de gerenciamento de estado. Abaixo você pode ver a estrutura criada e a explicação de cada elemento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhirsmht6jgx52ppuhbq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhirsmht6jgx52ppuhbq.PNG" alt="Image description" width="800" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;iniciamos uma constante &lt;code&gt;todos&lt;/code&gt; que armazenará um estado. Este estado é um array de objetos que armazenará simples tarefas de uma lista de afazeres. Cada elemento do array guarda um id, um title e um status de conclusão. sendo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [todos, setTodos] = useState([
        {id: 1, title: 'Ir ao supermercado', done: false},
        {id: 2, title: 'Ir para academia', done: false},
        {id: 3, title: 'Passear com o cachorro', done: false},
    ]);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após definido o estado principal do ToDo, criaremos uma nova constante &lt;code&gt;saveTodo&lt;/code&gt; que salvará uma nova tarefa através de sua função. Esta função recebe o &lt;code&gt;todo&lt;/code&gt; como parâmetro e cria uma nova constante &lt;code&gt;newTodo&lt;/code&gt; que armazena desta vez uma nova tarefa dentro de um objeto, que posteriormente será armazenado dentro do nosso array de objetos definidos.&lt;/p&gt;

&lt;p&gt;Além disso, a função &lt;code&gt;saveTodo&lt;/code&gt; armazenará dentro do nosso estado &lt;code&gt;todos&lt;/code&gt; o novo valor obtido através do &lt;code&gt;newTodo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sendo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const saveTodo = todo =&amp;gt; {
        const newTodo = {
            id: todos.length + 1,
            title: todo.title,
            done: false,
        };
        setTodos([...todos, newTodo]);
    };

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, nosso TodoProvider retorna um novo elemento, o &lt;code&gt;&amp;lt;ContextTodo.Provider&amp;gt;&amp;lt;/ContextTodo.Provider&amp;gt;&lt;/code&gt; A utilização do elemento &lt;code&gt;.Provider&lt;/code&gt; não é um equívoco, trata-se de um componente que está contido no objeto Context. Ele permite que componentes consumidores a assinarem mudanças no contexto, ou seja, gerenciar o contexto definido. &lt;/p&gt;

&lt;p&gt;Segundo a própria documentção do React: O &lt;code&gt;.Provider&lt;/code&gt; contém uma prop &lt;code&gt;value&lt;/code&gt;, ela pode ser passada para ser consumida por componentes que são descendentes deste Provider. Um Provider pode ser conectado a vários consumidores. Providers podem ser aninhados para substituir valores mais ao fundo da árvore. Todos consumidores que são descendentes de um Provider serão renderizados novamente sempre que a prop &lt;code&gt;value&lt;/code&gt; do Provider for alterada.&lt;/p&gt;

&lt;p&gt;Desse modo, passamos dentro do nosso provider dois valores: O primeiro trata-se da lista de tarefas definida na constante &lt;code&gt;todos&lt;/code&gt;, e o segundo é a nossa nova tarefa &lt;code&gt;savetodo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sendo assim, temos a seguinte estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return(
        &amp;lt;ContextTodo.Provider value={{todos, saveTodo}}&amp;gt;
            {children}
        &amp;lt;/ContextTodo.Provider&amp;gt;
    );

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como os filhos do nosso provider conseguem utilizar os valores que o provider armazena, iremos definir o children como sendo o nosso app. Sendo assim, utilizamos as chaves passando o children dentro do nosso &lt;code&gt;&amp;lt;ContextTodo.Provider&amp;gt;&amp;lt;/ContextTodo.Provider&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilizando nosso estado global no App
&lt;/h2&gt;

&lt;p&gt;Depois de definido o Provider, precisamos executar este elemento dentro do nosso app, sendo assim, ele será o pai de toda a nossa aplicação neste caso em específico. A estrutura do nosso &lt;code&gt;App.jsx&lt;/code&gt; fica da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frwlde3iypf2hn8rzm1ng.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frwlde3iypf2hn8rzm1ng.PNG" alt="Image description" width="759" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos observar, o nosso &lt;code&gt;TodoProvider&lt;/code&gt; é o elemento principal e dentro dele contém nossos componentes criados posteriormente &lt;code&gt;ToDoList&lt;/code&gt; e &lt;code&gt;AddTodo&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Entendendo os componentes criados
&lt;/h4&gt;

&lt;h5&gt;
  
  
  ToDoListItem
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakv9miv1e0jofljo7v51.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakv9miv1e0jofljo7v51.PNG" alt="Image description" width="781" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O componente contém uma prop chamada &lt;code&gt;todo&lt;/code&gt;, ele retorna uma div que contém o id, o título e o status da tarefa de cada um das tarefas passadas.&lt;/p&gt;

&lt;h5&gt;
  
  
  ToDoList
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54cj74w8f6jg49l9xykc.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54cj74w8f6jg49l9xykc.PNG" alt="Image description" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Analisando agora o componente &lt;code&gt;ToDoList&lt;/code&gt; podemos ver a utilização do componente &lt;code&gt;ToDoListItem&lt;/code&gt; descrito posteriormente.&lt;/p&gt;

&lt;p&gt;Para que possamos utilizar o contexto global definido na constante ContextTodo, devemos criar uma nova e defini-la como sendo o elemento que irá receber o uso de um contexto. Neste caso, utilizamos a constante &lt;code&gt;context&lt;/code&gt; para usar o contexto da &lt;code&gt;ContextTodo&lt;/code&gt;. Conforme abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const context = useContext(ContextTodo);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após definido, utilizaremos a constante &lt;code&gt;data&lt;/code&gt; para receber e renderizar posteriormente cada um dos elementos do todo. Sendo assim, criamos um novo método &lt;code&gt;.map&lt;/code&gt; para criar cada um dos elementos da lista de tarefas através do componente descrito anteriormente &lt;code&gt;ToDoListItem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;.map&lt;/code&gt; neste caso executa a seguinte lógica:&lt;/p&gt;

&lt;p&gt;1 - Chama o componente &lt;code&gt;&amp;lt;ToDoListItem&amp;gt;&lt;/code&gt;;&lt;br&gt;
2 - Define uma key como sendo o id de cada uma das tarefas;&lt;br&gt;
3 - cria um novo parâmetro chamado &lt;code&gt;todo&lt;/code&gt; que recebe o objeto ativo no &lt;code&gt;.map&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; const data = context.todos.map(todo=&amp;gt;(
        &amp;lt;ToDoListItem key={todo.id} todo={todo}&amp;gt;&amp;lt;/ToDoListItem&amp;gt;
    ));

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ToDolist retorna após isso o elemento data que agora guarda um array de tarefas.&lt;/p&gt;

&lt;p&gt;Após isso, podemos ver nossas tarefas sendo renderizadas na tela conforme mostra a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8k0h4nyoevm4iw5i6jk.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8k0h4nyoevm4iw5i6jk.PNG" alt="Image description" width="762" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adicionando novas tarefas
&lt;/h2&gt;

&lt;p&gt;A aplicação está quase pronta, para finalizarmos precisamos apenas definir o local onde iremos submeter novos dados para a nossa lista de tarefas. E como submetemos coisas? Através de formulários! Sendo assim, editaremos o nosso componente &lt;code&gt;AddTodo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Abaixo você pode visualizar a estrutura do componente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkh6o11hz4fnr7uaqqp1w.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkh6o11hz4fnr7uaqqp1w.PNG" alt="Image description" width="800" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No nosso componente &lt;code&gt;AddTodo&lt;/code&gt; começamos declarando a constante &lt;code&gt;saveTodo&lt;/code&gt; que receberá o valor da constante &lt;code&gt;saveTodo&lt;/code&gt; que está em nosso contexto global.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const {saveTodo} = useContext(ContextTodo);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logo após podemos declarar constantes com estados locais.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [todo, setTodo] = useState();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Definimos agora a nova função dentro de uma constante chamada &lt;code&gt;handleFormSubmit&lt;/code&gt;. Essa função será responsável por adicionar o valor digitado num input na nossa lista de tarefas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const handleFormSubmit = e =&amp;gt; {
        e.preventDefault();
        saveTodo(todo);
    };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o comando &lt;code&gt;saveTodo(todo)&lt;/code&gt; executa a função presente em nosso contexto tendo como parâmetro nossa constante &lt;code&gt;todo&lt;/code&gt; já declarada.&lt;/p&gt;

&lt;p&gt;Logo após definimos uma função que armazenará o valor digitado no input dentro da nossa cadeia de elementos &lt;code&gt;todo&lt;/code&gt; através da desestruturação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const handleInputChange = e =&amp;gt; {
        setTodo({
            ...todo,
            title: e.target.value,
        });
    };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e para finalizar, retornamos o nosso formulário com o input e o botão para que as funções definidas sejam executadas quando as mudanças previstas acontecerem. No caso do input o &lt;code&gt;onChange&lt;/code&gt; chama a função &lt;code&gt;handleInputChange&lt;/code&gt; e o submit do formulário executa a função &lt;code&gt;handleFormSubmit&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return(
        &amp;lt;form onSubmit={handleFormSubmit}&amp;gt;
            &amp;lt;input type="text" name="title" id="title" placeholder="Nova Tarefa..." onChange={handleInputChange}/&amp;gt;
            &amp;lt;button&amp;gt;ADICIONAR&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
    );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podemos perceber, a utilização do useContext é muito importante para gerenciamento de dados dentro de aplicações react, pois facilita a cadeia organizacional dos elementos e distribui os dados de forma mais consistente. Existem outras alternativas para gerenciamento de estado, como utilizar a lib redux por exemplo, mas utilizar ferramentas da própria tecnologia é muito importante para entendermos os conceitos iniciais de funcionamento.&lt;/p&gt;

&lt;p&gt;Quaisquer dúvidas sobre a temática sugiro consultar a própria documentação do React acerca desta temática.&lt;/p&gt;

&lt;p&gt;A produção deste artigo tem primordialmente caráter didático, tendo sido totalmente inspirado no seguinte &lt;a href="https://www.youtube.com/watch?v=D_yxtCD_Vi0&amp;amp;ab_channel=balta.io" rel="noopener noreferrer"&gt;vídeo&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Criando projetos em React</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Tue, 12 Oct 2021 17:32:02 +0000</pubDate>
      <link>https://forem.com/lazarocontato/criando-projetos-em-react-31pk</link>
      <guid>https://forem.com/lazarocontato/criando-projetos-em-react-31pk</guid>
      <description>&lt;p&gt;Estou há um tempo sumido por aqui mas por bons motivos, estive estudando mais um pouco programação e avancei alguns passos no entendimento de conceitos básicos. Desta vez, estarei apenas iniciando um projeto em React. O intuito é fixar o processo de criação e armazenar dados para consultas posteriormente. Então vamos lá.&lt;/p&gt;

&lt;p&gt;Antes de tudo vamos criar nosso diretório onde nosso projeto será inicializado. Nele executaremos através do terminal o comando&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-react-app projetobase&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Assim, estamos informando que queremos iniciar um projeto React chamado "projetobase". Após executar, ele processa alguns 35089 arquivos, então paciência.&lt;/p&gt;

&lt;p&gt;Um novo diretório com o nome do projeto citado é criado, ele é o nosso mais novo projeto React.&lt;/p&gt;

&lt;p&gt;para executar certifique-se de estar dentro do diretório criado e digite &lt;br&gt;
&lt;code&gt;npm start&lt;/code&gt;. &lt;br&gt;
Seu mais novo projeto React será executado na porta 3000. Os trabalhos podem ser iniciados.&lt;/p&gt;

&lt;p&gt;Aqui está a estrutura dos diretórios que é criado por padrão pelo React. Iremos apagar todos os arquivos dentro do diretório src. Criaremos nossa própria estrutura do 0.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzhyggl8l0ikx2f2o24g.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzhyggl8l0ikx2f2o24g.PNG" alt="Alt Text" width="257" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro do diretório src criaremos um novo arquivos javascript chamado &lt;code&gt;index.js&lt;/code&gt; ele que será responsável por renderizar todos os elementos do nosso projeto React. É nosso arquivo principal.&lt;/p&gt;

&lt;p&gt;Ao criamos este novo arquivo, utilizaremos um padrão utilizado em todos os arquivos React. A importação do react para sua devida utilização. &lt;/p&gt;

&lt;p&gt;Esta importação é realizada no início de cada arquivo, e utilizamos o comando:&lt;br&gt;
&lt;code&gt;import React from 'react';&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4q09n78zkfrxwcgcoag.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4q09n78zkfrxwcgcoag.PNG" alt="Alt Text" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como supracitado, o index.js ele será responsável por renderizar os elementos criados na tela. Para isso necessitamos de uma dependência de renderização e seleção de elementos. O React já tem por natureza uma dependência deste tipo, o ReactDOM &lt;a href="https://pt-br.reactjs.org/docs/react-dom.html" rel="noopener noreferrer"&gt;https://pt-br.reactjs.org/docs/react-dom.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Importaremos o ReactDOM para nosso index, e assim, poderemos começar a execução do nosso pequeno projeto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l3jsaoijim0pzpp74g2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l3jsaoijim0pzpp74g2.PNG" alt="Alt Text" width="715" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O ReactDOM possui um método chamado render, ele recebe elementos que queremos renderizar na tela. Um exemplo bem prático é a renderização de um H1 conforme a seguir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16papkuzvf5l1vyxjte7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16papkuzvf5l1vyxjte7.PNG" alt="Alt Text" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;o método render necessita de alguns elementos para funcionar corretamente. O primeiro elemento trata-se do que ele irá renderizar, o segundo trata-se de onde. Neste caso, ele se refere a uma div com o id "root" que está no nosso index.html&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr19jcn0a46ao4nkv3vkp.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr19jcn0a46ao4nkv3vkp.PNG" alt="Alt Text" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao salvar, nosso projeto será executado na porta 3000 e estará exibindo uma h1 no seu body, conforme especificamos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdsqg66o6wy9npoeqbtb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdsqg66o6wy9npoeqbtb.PNG" alt="Alt Text" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para efeito de melhor visualização, iremos alterar apenas algumas configurações do arquivo, adicionar alguns estilos e fontes. &lt;br&gt;
Para isso, criaremos um novo arquivo &lt;code&gt;.css&lt;/code&gt; dentro do diretório src. Importaremos este arquivo dentro do nosso &lt;code&gt;index.js&lt;/code&gt; através do comando&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import "./index.css"&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Assim, conseguiremos importar os estilos especificados no arquivo css para o nosso projeto.&lt;/p&gt;

&lt;p&gt;Fiz algumas alterações de background color, color font, font family e weight. A imagem abaixo mostra as alterações realizadas e o resultado final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihzuiki5gtxpsid84906.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihzuiki5gtxpsid84906.PNG" alt="Alt Text" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como ficou:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffv5apzu4xd16sq6cueqf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffv5apzu4xd16sq6cueqf.PNG" alt="Alt Text" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segue o jogo agora.&lt;/p&gt;

&lt;p&gt;Utilizamos o reactDOM apenas no nosso arquivo principal do projeto. Utilizaremos o import react nos arquivos que utilizamos a sintaxe jsx.&lt;/p&gt;

&lt;p&gt;então em todos os arquivos iremos importar o react para que nossa aplicação funcione.&lt;/p&gt;

&lt;p&gt;A estrutura do React é baseada em componentes, ou seja, nossos projetos serão criados e estruturados seguindo esta metodologia organizacional.&lt;/p&gt;

&lt;p&gt;Inicialmente criaremos um diretório chamado components. Nele iremos guardar todos os nossos componentes React. Lembrando que os componentes são .jsx, note que quando criados, meu VSCODE já exibe os exibe com o símbolo do React.&lt;/p&gt;

&lt;p&gt;Criei meu diretório de componentes e criei um novo chamado First.jsx. Nele faremos alguns exercícios.&lt;/p&gt;

&lt;p&gt;Começaremos criando uma função chamada First que retornará um exemplo de componente React. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg60gnu7ilwx50l3fy747.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg60gnu7ilwx50l3fy747.PNG" alt="Alt Text" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Começamos importando o react pois iremos utilizar a sintaxe html dentro de funções. Feito isso, criamos uma nova função chamada First, nela retornaremos dois elementos html, um H1 e um H2. É importante que estes elementos estejam todos guardados dentro de uma div para que possamos renderizar dentro do nosso projeto.&lt;/p&gt;

&lt;p&gt;Após a criação, temos que exportar esta função para que ela possa ser utilizada em qualquer arquivo do nosso projeto. Para isso, executamos o comando &lt;code&gt;export default "nomedafunção"&lt;/code&gt; Assim, disponibilizamos nossa função para posterior uso.&lt;/p&gt;

&lt;p&gt;Abaixo chamamos nossa função dentro do index. Ela é importada e chamada no render utilizando a sintaxe ``.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lhuh0tv0xxprayaapxe.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lhuh0tv0xxprayaapxe.PNG" alt="Alt Text" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O resultado final é este:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dbr85qec0t2fthw7rkx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dbr85qec0t2fthw7rkx.PNG" alt="Alt Text" width="800" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aprendemos a renderizar componentes dentro do React. Agora iremos aprender a passar parâmetros para componentes React.&lt;/p&gt;

&lt;p&gt;Criaremos um novo componente chamado Parameters, ele será nossa ferramenta de estudo agora.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando Parâmetros
&lt;/h2&gt;

&lt;p&gt;Como já vimos, vamos importar o react e criar um novo componente dentro do arquivo através de uma função chamada Parameters. Nela iremos retornar um título e um subtítulo. Lembre-se sempre de exportar a função para que ela possa ser utiliziada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqb910hecp0rq4pf69br8.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqb910hecp0rq4pf69br8.PNG" alt="Alt Text" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro do nosso index, iremos solicitar o que a função Parameters retorna, sendo assim, nosso título e subtítulo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7gzt9o8reeten739fkwv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7gzt9o8reeten739fkwv.PNG" alt="Alt Text" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É importante frisar que os elementos solicitados dentro do render devem estar agrupados dentro de uma div para que não haja erros.&lt;/p&gt;

&lt;p&gt;Após retornado o componente, podemos começar a atribuir parâmetros aos elementos, esses parâmetros são chamados de props. Atribuir props aos elementos é bem simples, basta adicionar o nome que se deseja dentro da tag do componente, dessa forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nlrpr6x9v25cez7d6a7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nlrpr6x9v25cez7d6a7.PNG" alt="Alt Text" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, dentro do meu componente, podemos retornar estas props com chaves de chamada javascript. Lembrando que na função, atribuiremos o valor de props de entrada para que possamos retornar os valores de título e subtítulo especificados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gwclnkc9s5fpd3h0sh4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gwclnkc9s5fpd3h0sh4.PNG" alt="Alt Text" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que passamos a string informada no index através de uma chamada javascript, como se estivéssemos retornando o valor de um objeto. Sendo assim &lt;code&gt;props.titulo&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Depois de retornado este valores, este é o resultado final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gjv7tggjvevbdpaijv1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gjv7tggjvevbdpaijv1.PNG" alt="Alt Text" width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Passando elementos filhos para um componente
&lt;/h2&gt;

&lt;p&gt;Agora iremos aprender como passar elementos filhos para um componente.&lt;/p&gt;

&lt;p&gt;Primeiro criaremos um novo arquivo, chamado ChildElement.jsx.&lt;/p&gt;

&lt;p&gt;Nele iremos criar uma nova função como já vimos antes e especificar o comando para retornar os valores dos filhos que passaremos no index.&lt;/p&gt;

&lt;p&gt;A estrutura segue desta forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx51nznzaoyodhohdhzzj.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx51nznzaoyodhohdhzzj.PNG" alt="Alt Text" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro do elemento onde ficarão os filhos, especificamos o comando &lt;code&gt;.children&lt;/code&gt;. Desta forma o react entenderá que queremos retornar todos os filhos que são especificados no nosso index.&lt;/p&gt;

&lt;p&gt;Já dentro do index, temos a seguinte estrutura dos dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovabfeuyciu02wpzknzk.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovabfeuyciu02wpzknzk.PNG" alt="Alt Text" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comentei os valores anteriores para ficar mais fácil a visualização do que estamos retornando.&lt;/p&gt;

&lt;p&gt;Agora, passamos uma lista não ordenada para nosso componente, neste caso, são os filhos. O resultado é o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zmurje30c3fkfm32qp0.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zmurje30c3fkfm32qp0.PNG" alt="Alt Text" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algumas opções de retorno de componentes e criação de projeto foram explanadas com sucesso. O próximo post será de um pequeno projeto em React para que vejamos na prática a utilização do poder do React.&lt;/p&gt;

&lt;p&gt;A intenção do post era apenas explicar como criar um novo projeto de React e algumas de suas funcionalidades. Aqui vimos a estrutura básica de chamada de funções e retorno de componentes. Obviamente tudo que podemos estudar é bem mais complexo e envolve uma gama de ferramentas que podemos utilizar. Mas para efeito prático, esta pequena introdução já basta. Trarei em breve um projeto mais rebuscado que pretendo colocar em meu portfólio.&lt;/p&gt;

&lt;p&gt;Você pode conferir mais informações na própria documentação do React. É uma atitude que devemos fazer com mais frequência. Te vejo na próxima.&lt;/p&gt;

&lt;p&gt;Minhas redes:&lt;br&gt;
Github - &lt;a href="https://github.com/lazaro-contato/" rel="noopener noreferrer"&gt;https://github.com/lazaro-contato/&lt;/a&gt;&lt;br&gt;
LinkdIn - &lt;a href="https://www.linkedin.com/in/lazaro-contato/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/lazaro-contato/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>beginners</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Consultando API de CEP com Fetch</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Wed, 28 Jul 2021 17:27:33 +0000</pubDate>
      <link>https://forem.com/lazarocontato/consultado-api-de-cep-com-fetch-3h9b</link>
      <guid>https://forem.com/lazarocontato/consultado-api-de-cep-com-fetch-3h9b</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxanep73gwgkiq0irekt7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxanep73gwgkiq0irekt7.jpg" alt="Alt Text" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esses dias tive que consumir uma API que retornava dados dos países do mundo. Até então meu contato com consumo de API era 0. Tinha apenas estudado os métodos HTTP, um amigo me ensinou sobre CRUD e criamos um pequeno server com Express. Mas consumir de fato eu não tinha noção de como fazer. Pois bem, um amigo me apresentou o fetch e decidi escrever algo sobre para que eu pudesse aprender fazendo e explicando no ponto de vista de um iniciante. Então vamos começar.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é fetch?
&lt;/h1&gt;

&lt;p&gt;A ferramenta é utilizada principalmente no Front-end e é utilizada para retornar dados de uma API existente e exibir para o nosso usuário. &lt;/p&gt;

&lt;p&gt;A API fetch nos fornece uma interface para realizar requisições HTTP através do navegador por meio de Promises. Utilizamos o fetch como meio de substituir o &lt;code&gt;XMLHttpRequest&lt;/code&gt; que já foi bastante utilizado para consumirmos API's. &lt;/p&gt;

&lt;p&gt;Antes de utilizamos o fetch, precisamos entender um pouco sobre promises. É um conceito bastante novo para mim, mas não é tão complexo.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que são promises?
&lt;/h1&gt;

&lt;p&gt;Promises são um padrão de desenvolvimento que visam representar a conclusão de operações assíncronas. Ou seja, elas definem uma ação que vai ser executada no futuro, após algo ter sido concluído. A forma que as promises são feitas no fetch é através do comando &lt;code&gt;.then()&lt;/code&gt;. Quando estamos realizando uma busca numa API, utilizamos as promises para executar ações quando a busca for realizada. &lt;a href="https://medium.com/trainingcenter/entendendo-promises-de-uma-vez-por-todas-32442ec725c2" rel="noopener noreferrer"&gt;Aqui você pode ler um artigo que explana o funcionamento das promises&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Iniciando o projeto
&lt;/h1&gt;

&lt;p&gt;Nosso projeto é bem simples, iremos consumir uma API e retornar dados de endereço quando digitarmos um CEP em um input. Para isso, criaremos um novo projeto chamado &lt;code&gt;cepSearch&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Aqui abaixo uma visão do que construí no html.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fziia2y0ecmb9ftxbmitz.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fziia2y0ecmb9ftxbmitz.PNG" alt="Alt Text" width="351" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para efeito prático não utilizei nenhuma estilização, apenas o código HTML puro. O importante é focar na lógica do projeto.&lt;/p&gt;

&lt;h1&gt;
  
  
  Mão no código
&lt;/h1&gt;

&lt;p&gt;Como utilizarei referência de id para citar alguns processos lógicos do Javascript, coloco abaixo o que foi utilizado no HTML para maior embasamento. É muito importante que, caso você vá reproduzir o que executei, utilize os mesmos id's dos inputs. Assim, poderemos utilizar corretamente os dados que o nosso fetch irá retornar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; &amp;lt;div class="container"&amp;gt;
        &amp;lt;form action=""&amp;gt;
          &amp;lt;div class="form-group"&amp;gt;
            &amp;lt;label for="cep"&amp;gt;CEP&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;input type="text" class="form-control" id="cep"&amp;gt;
            &amp;lt;small&amp;gt;00000-000&amp;lt;/small&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div class="form-group"&amp;gt;
            &amp;lt;label for="logradouro"&amp;gt;Logradouro&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;input type="text" class="form-control" id="logradouro"&amp;gt;
            &amp;lt;small&amp;gt;Rua&amp;lt;/small&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div class="form-group"&amp;gt;
            &amp;lt;label for="bairro"&amp;gt;Bairro&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;input type="text" class="form-control" id="bairro"&amp;gt;
            &amp;lt;small&amp;gt;Bairro&amp;lt;/small&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div class="form-group"&amp;gt;
            &amp;lt;label for="localidade"&amp;gt;Localidade&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;input type="text" class="form-control" id="localidade"&amp;gt;
            &amp;lt;small&amp;gt;Cidade&amp;lt;/small&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div class="form-group"&amp;gt;
            &amp;lt;label for="uf"&amp;gt;UF&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;input type="text" class="form-control" id="uf"&amp;gt;
            &amp;lt;small&amp;gt;Estado&amp;lt;/small&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/form&amp;gt;
      &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inicialmente preciso adicionar um efeito de blur no primeiro elemento input que colocarei o CEP. O blur verifica quando um elemento perde o foco, sendo assim, quando digitarmos o CEP e apertarmos tab, ele irá executar a função que queremos. Para selecionar o input, irei me referenciar pelo id &lt;code&gt;#cep&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Então, selecionando o input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$("#cep").blur(function (e) {
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após selecionado o input, desejo capturar o valor que foi inputado e atribuir este valor a uma variável. Então temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$("#cep").blur(function (e) {
  let cep = this.value
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desse modo, sempre que digitarmos algo no input CEP e tirarmos o foco do input, ele irá atribuir o valor digitado a variável &lt;code&gt;cep&lt;/code&gt;, desse modo, temos o valor que utilizaremos para consultar os dados de endereço.&lt;/p&gt;

&lt;p&gt;Após obtermos o valor inputado no &lt;code&gt;CEP&lt;/code&gt; temos que buscar o valor em alguma API de endereço. Para isso, utilizaremos a API do viacep. Você pode acessa-la através do link: &lt;a href="https://viacep.com.br/" rel="noopener noreferrer"&gt;https://viacep.com.br/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuedd09yy8o4vipsqjg2h.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuedd09yy8o4vipsqjg2h.PNG" alt="Alt Text" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É importante lermos a documentação da API antes de utilizarmos, desse modo, poderemos visualizar como efetuar os métodos HTTP para requisitar os dados.&lt;/p&gt;

&lt;p&gt;No nosso caso, queremos utilizar o método GET, ou seja, iremos obter informações de uma API. Esses valores, desejo que seja retornado no formado JSON, sendo assim, utilizarei a estrutura que o próprio viacep recomenda para essas especificações:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://viacep.com.br/ws/cep/json/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tudo certo, agora temos já temos o necessário para consumir a API. O método que utilizaremos para capturar os dados, iremos utilizar o fetch. Antes de tudo, iremos entender a estrutura do fetch.&lt;/p&gt;

&lt;p&gt;Quando chamamos o fetch, o primeiro valor que ele espera é a URL onde será buscado os dados. Essa é a URL que nossa API disponibiliza para consultas. Como sabemos, nossa URL é dinâmica, pois ela recebe o valor do CEP inserido no input. Para que nossa solicitação GET atualize sempre que um novo valor for digitado faremos a estrutura da URL conforme a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://viacep.com.br/ws/${cep}/json/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, utilizando o template string, podemos adicionar a variável &lt;code&gt;cep&lt;/code&gt; a URL que o fetch utilizará.&lt;/p&gt;

&lt;p&gt;Até então temos a seguinte estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$("#cep").blur(function (e) {
  let cep = this.value


  fetch(`https://viacep.com.br/ws/${cep}/json/`)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O fetch é uma ferramenta assíncrona, o que significa que você tem que esperar a conclusão da operação antes de fazer qualquer coisa com essa resposta, caso contrário, um erro será gerado. Para que utilizemos a resposta após a consulta, utilizamos o recurso &lt;code&gt;.then()&lt;/code&gt; que realiza operações assíncronas. &lt;/p&gt;

&lt;p&gt;Diremos agora que, após a consulta ter sido efetuada, iremos capturar a resposta que foi obtida e a aplicaremos numa função. Esta função transformará nossa resposta num formado JSON, assim, podemos utilizar os dados separadamente como objetos.&lt;/p&gt;

&lt;p&gt;O código será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$("#cep").blur(function (e) {
  let cep = this.value


  fetch(`https://viacep.com.br/ws/${cep}/json/`)
    .then(response =&amp;gt; {
      response.json()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando a resposta for capturada e convertida, queremos que esse objeto passe por um tratamento onde iremos filtrar os dados que serão utilizados. Então utilizaremos outro recurso &lt;code&gt;.then()&lt;/code&gt; que chamará outra função. Esta função receberá o objeto JSON gerado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$("#cep").blur(function (e) {
  let cep = this.value


  fetch(`https://viacep.com.br/ws/${cep}/json/`)
    .then(response =&amp;gt; {
      response.json()
        .then(data =&amp;gt; showData(data))
    })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A resposta JSON solicitará a constante &lt;code&gt;showData&lt;/code&gt;. Aqui iremos tratar o objeto retornado da nossa busca no CEP.&lt;/p&gt;

&lt;p&gt;A constante &lt;code&gt;showData&lt;/code&gt; irá conter uma arrow function que será responsável por retornar os dados do objeto gerado e atribuir estes dados aos campos correspondentes do formulário. &lt;/p&gt;

&lt;p&gt;Iniciamos a constante e chamamos a arrow function para pesquisar os dados através de um For-In.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const showData = (result) =&amp;gt; {
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de declarada a constante, iremos atribuir um For-In.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const showData = (result) =&amp;gt; {
  for(const campo in result){
  console.log(campo)
    }
  }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O For-In passado na arrow function retorna os dados de cada um dos elementos do objeto. E como ele faz isso? não é tão complexo.&lt;/p&gt;

&lt;p&gt;Cada um dos campos do objeto &lt;code&gt;result&lt;/code&gt; está sendo guardada na constante campo, o console.log executado nos mostra isso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1ovnoe2c4tkfccn1fcv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1ovnoe2c4tkfccn1fcv.PNG" alt="Alt Text" width="791" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como você pode ver, cada um dos valores do objeto esta sendo retornado a partir da constante campo.&lt;/p&gt;

&lt;p&gt;Com esses valores em mão, iremos utilizar a estrutura condicional &lt;code&gt;if&lt;/code&gt; para tratar os dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const showData = (result) =&amp;gt; {
  for(const campo in result){
    if(document.querySelector("#"+campo)){
      document.querySelector("#"+campo).value = result[campo]

    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O if utilizado captura os elementos HTML com os id's dos campos que retornamos (Esta observação é importante, pois os id's devem possuir exatamente os mesmos nomes dos campos no nosso caso).&lt;/p&gt;

&lt;p&gt;Após isso, iremos atribuir o valor de cada um dos campos retornados ao id de cada um dos inputs. A linha de código &lt;code&gt;document.querySelector("#"+campo).value = result[campo]&lt;/code&gt; atribui o valor do campo ao input com o id do campo em questão. Assim, o funcionamento é estabelecido.&lt;/p&gt;

&lt;p&gt;Como você pôde ver, o funcionamento do fetch não é tão complexo, ele captura dados através de uma URL especificada e retorna os dados através de promises. Esses dados podem ser convertidos para objetos JSON e utilizados dentro da nossa aplicação. &lt;/p&gt;

&lt;p&gt;É interessante termos um conhecimento acerca de objetos, desse modo, conseguiremos tratar nossas requisições corretamente.&lt;/p&gt;

&lt;p&gt;Nos links abaixo vocês poderão conhecer mais sobre fetch e sua utilização.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Fetching_data" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Fetching_data&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.github.io/fetch/" rel="noopener noreferrer"&gt;https://github.github.io/fetch/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Git - Um breve estudo.</title>
      <dc:creator>José Lázaro</dc:creator>
      <pubDate>Mon, 12 Jul 2021 18:04:00 +0000</pubDate>
      <link>https://forem.com/lazarocontato/git-um-breve-estudo-9gl</link>
      <guid>https://forem.com/lazarocontato/git-um-breve-estudo-9gl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvtwxpf35ic622e22i4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvtwxpf35ic622e22i4f.png" alt="Alt Text" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desde que comecei a estudar programação com maior assiduidade procuro metodologias de documentar o que venho aprendendo de alguma forma. Um amigo recomendou utilizar o Dev.to e minha experiência tem sido bastante positiva. &lt;/p&gt;

&lt;p&gt;Sendo assim, irei documentar tudo que acabo estudando ou desenvolvendo, além da solução de problemas que eventualmente venham a ser um percalço no meu processo de aprendizado.&lt;/p&gt;

&lt;p&gt;Neste Post irei tratar da utilização do Git. Abordando todos os pontos que estudei e desafios enfrentados durante o estudo. Sintam-se livres para comentar e adicionar dicas adicionais. Posteriormente poderei criar anexos com observações e dicas úteis que edifiquem o conteúdo tratado. Então vamos lá.&lt;/p&gt;




&lt;h1&gt;
  
  
  Índice
&lt;/h1&gt;

&lt;p&gt;1. O que é Git&lt;br&gt;
2. Como configurar o git&lt;br&gt;
3. Repositórios&lt;br&gt;
4. Ciclo de vida de arquivos&lt;br&gt;
5. O que é um commit&lt;br&gt;
6. Visualizando diferenças entre arquivos&lt;br&gt;
7. Branch&lt;br&gt;
8. Visualizando Logs&lt;br&gt;
9. Manipulando commits&lt;br&gt;
10. Merge&lt;/p&gt;
&lt;h1&gt;
  
  
  O que é Git
&lt;/h1&gt;

&lt;p&gt;Em resumo, o git é um sistema de controle de versionamento. É isso. &lt;/p&gt;

&lt;p&gt;Ok, a definição certamente é mais complexa, mas foi a melhor frase que encontrei para definir a função principal do Git. Ele certamente é o sistema de controle de versionamento mais utilizado no mundo, e essa fama se dá pela facilidade de uso, e principalmente no desempenho. &lt;/p&gt;
&lt;h4&gt;
  
  
  Mas o que são sistemas de controle versionamento?
&lt;/h4&gt;

&lt;p&gt;O controle de versão é a atividade de rastrear e gerenciar as mudanças em um código de software. Através dele as equipes de desenvolvimento conseguem realizar múltiplas tarefas e modificações de código com o intuito de adicionar funcionalidades, corrigir bugs entre outras atividades.&lt;/p&gt;

&lt;p&gt;Os sistemas de controle de versão guardam as alterações ao longo do tempo em um tipo de banco de dados especial que pode ser visualizado e chamado quando se deseja obter uma certa versão específica do código. Geralmente essa solicitação ocorre quando erros são cometidos e se quer voltar numa versão anterior do código.&lt;/p&gt;

&lt;p&gt;Assim como todo software, necessitamos configurar suas opções para que possamos utilizar com maior precisão e utilizar seus recursos com maestria. Desse modo, vamos começar pelo básico.&lt;/p&gt;
&lt;h1&gt;
  
  
  Como configurar o Git
&lt;/h1&gt;
&lt;h4&gt;
  
  
  Baixando o Git
&lt;/h4&gt;

&lt;p&gt;Para começarmos a utilizar o controle de versão em nossos projetos devemos inicialmente instalar o Git no nossa máquina. Essa instalação pode ser feita através do download do Git através do site oficial do &lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;Git&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No meu caso estou utilizando atualmente o Windows 10 Pro e a versão mais atual do Git disponível é esta do dia 06/06/2021.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4xlvhqwf74yloc57nwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4xlvhqwf74yloc57nwp.png" alt="image" width="795" height="287"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Configurando o Git
&lt;/h4&gt;

&lt;p&gt;Após instalado o Git em nosso sistema, devemos fazer as primeiras configurações para utilizarmos o controle de versão adequadamente.&lt;/p&gt;

&lt;p&gt;As configurações do utilizador podem ser visualizadas através do comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Numa primeira instalação, algumas informações como o nome do usuário, e-mail e editor padrão por exemplo não terão sido definidas. Sendo assim, configuraremos cada informação.&lt;/p&gt;

&lt;h4&gt;
  
  
  Escopos do Git
&lt;/h4&gt;

&lt;p&gt;Antes de nos aprofundarmos nas configurações do Git, quero apenas explanar parcialmente sobre os escopos dos comandos.&lt;/p&gt;

&lt;p&gt;O Git guarda as informações em três lugares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitConfig --system:
Altera as configurações para todos os usuários do seu sistema se utilizada a opção &lt;code&gt;--system&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;GitConfig do usuário --global:
Altera as configurações apenas para o usuário que está executando o projeto. &lt;code&gt;--global&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;GitConfig do projeto:
Altera as configurações apenas do projeto que se está desenvolvendo. O comando para utilizar este escopo é:
&lt;code&gt;git config&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Configuração dos dados
&lt;/h4&gt;

&lt;p&gt;Para definir informações que aplicaremos para todos os repositórios de um usuário, utilizaremos a configuração global.&lt;/p&gt;

&lt;p&gt;Configurando o user-name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.name "nomedousuario"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configurando o e-mail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.email "seuemail"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode utilizar também um editor padrão para o seu código. Por padrão o Vim é utilizado. No meu caso, quero definir meu editor de texto padrão para o VS Code. Você pode utilizar o seguinte comando para utiliza-lo também:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global core.editor "code --wait"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso você utilize outro editor de texto, sugiro procurar a documentação que trate desta temática.&lt;/p&gt;

&lt;p&gt;Essas são as configurações elementares do Git. Para visualizar as configurações definidas, você pode chamar no control cada uma:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config user.name&lt;/code&gt; - No caso do nome do usuário.&lt;br&gt;
&lt;code&gt;git config user.email&lt;/code&gt; - No caso do e-mail.&lt;/p&gt;

&lt;p&gt;Pronto, a configuração mais básica do git foi feita. Agora, quando realizamos alterações em nosso código e submete-las ao git, essas informações serão levadas também.&lt;/p&gt;
&lt;h1&gt;
  
  
  Repositórios
&lt;/h1&gt;

&lt;p&gt;Obviamente todo mundo que está desenvolvendo um projeto precisa colocar esse projeto em algum lugar para administrar suas versões, guardar de maneira segura seus dados, enfim, gerenciar todas as atividades desenvolvidas durante o processo de produção. Como eu já disse, o Git auxilia nisso, e para começarmos a executar tais atividades necessitamos criar algo chamado repositório.&lt;/p&gt;

&lt;p&gt;O repositório Git armazena todas as alterações feitas em um projeto dentro de uma pasta chamada &lt;code&gt;.git/&lt;/code&gt;. Aqui ele constrói algo como uma linha do tempo que armazena cada alteração enviada. Cada alteração guarda um código Hash único que poderá ser chamado posteriormente para consulta dos dados armazenados. Vou detalhar tudo a seguir. Vamos partir para a inicialização e cada etapa será explanada.&lt;/p&gt;
&lt;h3&gt;
  
  
  Inicializando repositórios
&lt;/h3&gt;

&lt;p&gt;Para iniciarmos um repositório devemos antes de qualquer coisa ter um projeto, neste caso vou criar um diretório através do terminal do Win10.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir git-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de criado o diretório, podemos adicionar um novo arquivo, no nosso caso irei criar um HTML para simular algumas alterações.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, agora temos um repositório chamado &lt;code&gt;git-project&lt;/code&gt; e dentro dele temos um arquivo chamado &lt;code&gt;index.html&lt;/code&gt;. Vamos imaginar que esse é o nosso super projeto, iremos usa-lo por hora para explicar alguns conceitos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Destrinchando o Git Init
&lt;/h4&gt;

&lt;p&gt;Agora que já temos o mínimo para iniciar o repositório, podemos prosseguir com o estudo.&lt;/p&gt;

&lt;p&gt;Vamos inicializar um novo repositório  para o diretório criado, a inicialização é feita através do seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando inicializamos um repositório através do comando supracitado, o Git cria um repositório vazio o &lt;code&gt;.git/&lt;/code&gt; com subdiretórios para &lt;code&gt;objects&lt;/code&gt;, &lt;code&gt;refs/heads&lt;/code&gt;, &lt;code&gt;refs/tags&lt;/code&gt; arquivos e models. Além disso, cria uma branch vazia sem nenhum commit. (Veremos mais sobre branches em breve).&lt;/p&gt;

&lt;p&gt;Bom citar que existem outros tipos de Git Init, não pretendo me aprofundar muito, mas para efeito de informação temos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git init&lt;/code&gt; Transforma o diretório atual num repositório Git.&lt;br&gt;
&lt;code&gt;git init &amp;lt;directory&amp;gt;&lt;/code&gt; Transforma um diretório especificado num repositório Git.&lt;br&gt;
&lt;code&gt;git init --bare&lt;/code&gt; Cria um novo repositório vazio (um repositório para ser usado apenas como um repositório remoto). Esse tipo de &lt;em&gt;init&lt;/em&gt; é utilizado em servidores e são considerados apenas repositórios para armazenamento. Ele facilita a troca de informações entre os desenvolvedores. No link a seguir você pode ver um pouco sobre &lt;a href="https://pt.stackoverflow.com/questions/80182/qual-%C3%A9-a-diferen%C3%A7a-entre-git-init-e-git-init-bare" rel="noopener noreferrer"&gt;a diferença entre git init e git bare&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Caso você inicialize um repositório Git num diretório errado  você pode remover o repositório muito facilmente. Basta utilizar o comando &lt;code&gt;$ rm -rf .git&lt;/code&gt; e pronto, seu repositório local foi removido.&lt;/p&gt;

&lt;p&gt;Caso exista o &lt;code&gt;.gitignore/&lt;/code&gt; e &lt;code&gt;.gitmodules/&lt;/code&gt; você pode exclui-los também utilizando o comando &lt;code&gt;$ rm -rf .git*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Quando executar, sugiro visualizar se alguma pasta oculta ainda existe.&lt;/p&gt;

&lt;p&gt;Tudo pronto, aprendemos a iniciar um repositório local no nosso Git. Agora podemos começar a manipular arquivos livremente. A partir daqui somos capazes de realizar alterações em nosso código e transferi-los entre status. A seguir vamos entender o ciclo de vida de arquivos e como eles se comportam no Git.&lt;/p&gt;
&lt;h1&gt;
  
  
  Ciclo de vida de arquivos
&lt;/h1&gt;

&lt;p&gt;O ciclo de vida dos arquivos é uma descrição bem grosseira para referenciar os status que cada arquivo passa durante o processo de produção de um projeto.&lt;/p&gt;

&lt;p&gt;Quero explicar antes de tudo cada um dos status para melhor entendimento do assunto.&lt;/p&gt;
&lt;h4&gt;
  
  
  Status
&lt;/h4&gt;

&lt;p&gt;Os status são situações (num grosso modo) que os arquivos se encontram. Esses status são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Untracked - O arquivo acabou de ser adicionado mas ainda não foi visto pelo Git&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unmodifier - Quando o arquivo foi visto pelo git mas não foi modificado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modified - O arquivo foi modificado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Staged - Área onde será criada a versão.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuz4o22zxp08nxnafpkdo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuz4o22zxp08nxnafpkdo.png" alt="Alt Text" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como vemos na imagem, existem regras que levam um arquivo de um status para outro. Seguindo o fluxo podemos definir como sendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Untracked -&amp;gt; Unmodified&lt;br&gt;
Quando adicionamos um arquivo e ele é visto pelo Git e não tem modificações, ele passa a ter o status de unmodified.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unmodified -&amp;gt; Modified&lt;br&gt;
Quando qualquer alteração no arquivo é executada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modified -&amp;gt; Staged&lt;br&gt;
Quando a modificação é salva no Git. Neste momento ela ainda não foi efetivada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Staged -&amp;gt; Unmodified&lt;br&gt;
Essa alteração se dá quando realizamos um commit, aqui um código hash da modificação é gerada e nosso arquivo está apto a receber novas mudanças do código para um novo commit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unmodified -&amp;gt; Untracked&lt;br&gt;
Quando removemos um arquivo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podemos visualizar o status de cada arquivo atráves de um comando que o Git nos fornece, o &lt;code&gt;git status&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Este comando exibe algumas informações relevantes sobre os status dos nossos arquivos, essas informações podem ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Onde o arquivo está.&lt;/li&gt;
&lt;li&gt;Os commits realizados.&lt;/li&gt;
&lt;li&gt;Se existe algum commit pendente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui podemos ver alguns exemplos:&lt;/p&gt;
&lt;h4&gt;
  
  
  Untracked
&lt;/h4&gt;

&lt;p&gt;Arquivo house.html foi criado mas não foi visto pelo Git.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v6wlaimted19mn679vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v6wlaimted19mn679vn.png" alt="Alt Text" width="651" height="173"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Staged
&lt;/h4&gt;

&lt;p&gt;Aqui o arquivo foi adicionado através do comando &lt;code&gt;git add house.html&lt;/code&gt;. Ele passa para o estágio stage e está pronto para ser commitado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkjxj7k10qf3qf5it98t.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkjxj7k10qf3qf5it98t.PNG" alt="Alt Text" width="716" height="147"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Staged -&amp;gt; Unmodified
&lt;/h4&gt;

&lt;p&gt;Aqui o arquivo foi commitado, ou seja, criamos uma snap (ou espelho) das modificações que estarão salvas num código hash que podemos utilizar posteriormente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt5hb7mue48a8ge47j5p.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt5hb7mue48a8ge47j5p.PNG" alt="Alt Text" width="777" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O commit é feito através do comando &lt;code&gt;git commit -m "First commit"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;-m = comando para passarmos uma mensagem.&lt;br&gt;
"" = A mensagem é passada entre as aspas.&lt;/p&gt;

&lt;p&gt;A partir desse momento o arquivo tem o status de unmodified pois ele foi criado, adicionado e commitado. Agora o Git aguarda modificações do arquivo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76f9ufie06bdaljhx5s1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76f9ufie06bdaljhx5s1.PNG" alt="Alt Text" width="649" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando modifico o arquivo ele vai para o status de modified e aguarda ser transferido para o status staged. E o ciclo se inicia novamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyujpbz4lhel5mapzyo5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyujpbz4lhel5mapzyo5.PNG" alt="Alt Text" width="648" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver, entender os ciclos não é muito complexo. Caso você tenha alguma dúvida, existe um curso gratuito na udemy que pode te auxiliar em todo o contexto de entendimento básico do Git.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.udemy.com/course/git-e-github-para-iniciantes/" rel="noopener noreferrer"&gt;https://www.udemy.com/course/git-e-github-para-iniciantes/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A própria documentação do Git pode te auxiliar nisso também. O link abaixo te direciona para um artigo que explica mais detalhadamente os status do Git.&lt;br&gt;
&lt;a href="https://git-scm.com/docs/git-status" rel="noopener noreferrer"&gt;https://git-scm.com/docs/git-status&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  O que é um commit
&lt;/h1&gt;

&lt;p&gt;Sei que já falei bastante de commits, que precisamos dele para subir alterações num projeto e bla bla bla, mas não cheguei a explicar ele muito bem. Vou fazer a boa e dar uma breve introdução sobre commits para ficamos alinhados a partir daqui.&lt;/p&gt;

&lt;p&gt;Bom, o &lt;code&gt;git commit&lt;/code&gt; é usado para salvar alterações num repositório local. E esse comando só funciona quando arquivos são inseridos para serem commitados, ou seja, quando passamos esses arquivos para o status staged através do comando &lt;code&gt;git add&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando commitamos informações de um arquivo criamos uma cópia dos arquivos no que podemos chamar de espelho. Cada espelho guarda todas as informações do commit, como um código hash por exemplo, que seria basicamente um ID único que nomeia aquele commit. Quando precisamos retornar as informações de um determinado commit, é esse código hash que utilizamos. Além do hash, temos também quem realizou o commit e quando foi feito. Posteriormente explicarei a estrutura de informações do commit quando estivermos estudando o &lt;code&gt;git log&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Acho importante frisar que o commit adiciona no repositório &lt;strong&gt;LOCAL&lt;/strong&gt; as alterações realizadas, ou seja, para inserirmos num remoto, precisamos de outro comando que subiria para o GitHub por exemplo, mas nos limitaremos apenas a Git neste artigo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.git-tower.com/learn/git/commands/git-commit/" rel="noopener noreferrer"&gt;Aqui você pode ler um pouco também sobre commits&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Visualizando diferenças entre arquivos
&lt;/h1&gt;
&lt;h4&gt;
  
  
  Diff commit
&lt;/h4&gt;

&lt;p&gt;Quando vamos realizar commits, podemos comparar as alterações entre os arquivos através do comando &lt;code&gt;git diff&lt;/code&gt;. As alterações são listadas conforme a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sae7n6dfdfqwu9aunn3.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sae7n6dfdfqwu9aunn3.PNG" alt="Alt Text" width="636" height="378"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Branch
&lt;/h1&gt;

&lt;p&gt;A partir desse ponto iremos falar muito sobre branches. É um assunto bem recorrente quando começamos a trabalhar em projetos com outras pessoas, sendo assim, é um conceito que precisamos entender bem para manipular com mais eficiência nosso processo de produção.&lt;/p&gt;

&lt;p&gt;Branch é exatamente o que diz a palavra se traduzida, são ramos. Esses ramos são criados para que possamos trabalhar de maneira organizada em nossos projetos. Isso porque nossos repositórios são como uma árvore, onde temos uma estrutura base(o tronco) e dela derivam todas as ramificações(os galhos).&lt;/p&gt;

&lt;p&gt;Quando criamos um repositório, ele contem uma branch principal chamada branch master da qual derivam todas as outras branches. Na imagem abaixo é exibida como é a estrutura de ramos dos nossos repositórios.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqzvq7hgy3aamkrib0wf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqzvq7hgy3aamkrib0wf.png" alt="Alt Text" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao criarmos uma nova branch temos agora duas linhas de trabalho diferentes, onde podemos executar modificações em nosso projeto sem impactar diretamente no funcionamento do mesmo. Isso permite para nós desenvolvedores, criamos funcionalidades e testa-las sem impactar no projeto principal.&lt;/p&gt;
&lt;h2&gt;
  
  
  Manipulando branches
&lt;/h2&gt;

&lt;p&gt;Como eu disse, quando criamos um projeto novo, ele já contém uma branch, a branch master. Podemos verificar isso digitando:&lt;br&gt;
&lt;code&gt;git status&lt;/code&gt;. Ele exibirá exatamente em qual branch estamos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fst460i8a2lfrf14u0cdn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fst460i8a2lfrf14u0cdn.PNG" alt="Alt Text" width="649" height="57"&gt;&lt;/a&gt;&lt;br&gt;
O caso acima nos mostra que estamos na branch master.&lt;/p&gt;

&lt;p&gt;Além disso, podemos ver quais branches estão disponíveis no nosso projeto a partir do comando &lt;code&gt;git branch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujfrbyiopec81vy4ua8v.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujfrbyiopec81vy4ua8v.PNG" alt="Alt Text" width="642" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O asterisco exibe em qual branch estamos no momento. Note que existe outra branch ativa chamada feature, nela poderemos desenvolver ferramentas para nosso projeto e depois vincular as alterações a branch master.&lt;/p&gt;
&lt;h4&gt;
  
  
  Criando nova branch
&lt;/h4&gt;

&lt;p&gt;Para criarmos uma nova branch, basta executarmos o comando &lt;code&gt;git checkout -b nomedabranch&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlo68h7b8nce81ojof3f.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlo68h7b8nce81ojof3f.PNG" alt="Alt Text" width="751" height="34"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando criamos uma nova branch, automaticamente a branch ativa é trocada. Acima o próprio git nos informa que "NovaBranch" é a branch ativa no momento, sendo assim, as alterações no código que forem efetuadas, estarão vinculadas a essa branch específica.&lt;/p&gt;
&lt;h4&gt;
  
  
  Deletando branches
&lt;/h4&gt;

&lt;p&gt;Para excluirmos uma branch criada, o comando que podemos executar é &lt;code&gt;git checkout -D nomedabranch&lt;/code&gt;. Desse modo, a branch especificada será removida do nosso projeto.&lt;/p&gt;
&lt;h4&gt;
  
  
  Alternando entre branches
&lt;/h4&gt;

&lt;p&gt;Para mudarmos para outra branch existente basta digitarmos o comando &lt;code&gt;git checkout nomeDaBranch&lt;/code&gt;. Assim, iremos trocar a branch ativa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50grzhe3gku3hglhlutq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50grzhe3gku3hglhlutq.PNG" alt="Alt Text" width="719" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que após executado o comando, o git nos informa que mudamos a branch ativa. Na imagem acima, faço a mudança para a branch master.&lt;/p&gt;

&lt;p&gt;Você pode acessar esse artigo do &lt;a href="https://medium.com/@Juliobguedes/entendendo-git-branches-parte-2-3778f4258843" rel="noopener noreferrer"&gt;medium&lt;/a&gt; para entender um pouco mais sobre branch e manipulação.&lt;/p&gt;

&lt;p&gt;Sabendo disso, podemos partir para as próximas partes do artigo. Lembrando que manipulação de branches é de extrema importância caso queiramos trabalhar com grandes projetos.&lt;/p&gt;
&lt;h1&gt;
  
  
  Visualizando Logs
&lt;/h1&gt;
&lt;h4&gt;
  
  
  Git Log
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O log tem relação direta com o seu significado em português, registro. Com esse comando você pode visualizar as informações de registro de um commit realizado. Caso tenha interesse, você pode ler sobre esta função &lt;a href="https://git-scm.com/book/pt-br/v2/Fundamentos-de-Git-Vendo-o-hist%C3%B3rico-de-Commits" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Supondo que temos um projeto já criado, o git já iniciado, e commits já executados, podemos visualizar os commits e as informações pertinentes a cada um apenas utilizando o comando &lt;code&gt;git log&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nsrdmwddd3dav9z88xh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nsrdmwddd3dav9z88xh.PNG" alt="Alt Text" width="660" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se executar o comando, poderemos ver algo bem semelhante a imagem acima. Para descrever melhor cada informação, temos então:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit - código Hash único que nomeia o commit&lt;/li&gt;
&lt;li&gt;Author - Quem que executou o commit&lt;/li&gt;
&lt;li&gt;Date - Data que o commit foi realizado&lt;/li&gt;
&lt;li&gt;Mensagem - Por último a mensagem que foi passada através do &lt;code&gt;git commit -m "sua mensagem"&lt;/code&gt;. É importante descrever bem o que foi executado para que posteriormente possamos identificar com melhor precisão um commit em específico.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Git decorate
&lt;/h4&gt;

&lt;p&gt;Podemos visualizar as logs exibindo a relação entre as branches através do seguinte comando &lt;code&gt;git log --decorate&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0udigrvivbdn2ww3lf8e.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0udigrvivbdn2ww3lf8e.PNG" alt="Alt Text" width="550" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Diferente do git log convecional, podemos ver agora as branches de cada commit realizado.&lt;/p&gt;
&lt;h4&gt;
  
  
  Git Log Author
&lt;/h4&gt;

&lt;p&gt;Para visualizarmos apenas os commits realizados por um autor em específico, podemos utilizar o comando &lt;code&gt;git log --author "Nome do Autor"&lt;/code&gt;. Veja o exemplo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyhdesm75aocyfi0u5nh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyhdesm75aocyfi0u5nh.PNG" alt="Alt Text" width="788" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui o que se exibe são as mesmas informações do git log só que filtradas por autor.&lt;/p&gt;
&lt;h4&gt;
  
  
  Git log graph
&lt;/h4&gt;

&lt;p&gt;Podemos visualizar de forma gráfica as branches dos commits realizados com o comando &lt;code&gt;git log --graph&lt;/code&gt;, é bem útil caso queiramos ter uma melhor visualização do fluxo de trabalho que estamos executando no projeto. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7hbg2r48tzy139cf1eua.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7hbg2r48tzy139cf1eua.PNG" alt="Alt Text" width="691" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A linha lateral mostra o caminho que percorremos durante os commits. Note que todos os commits realizados neste caso ilustrado foram realizados diretamente na branch master, não é uma prática recomendada quando estamos trabalhando com mais pessoas e diversas outras funcionalidades. Existem metodologias de fluxo de trabalho que utilizam branches para melhor desenvolvimento de aplicações. Vamos conhecer uma delas em breve.&lt;/p&gt;
&lt;h4&gt;
  
  
  Git Shortlog
&lt;/h4&gt;

&lt;p&gt;Caso desejemos visualizar a relação de commits realizada por autor, podemos visualizar com o comando &lt;code&gt;git log shortlog&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fezbczor19v3ehbxj6o7h.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fezbczor19v3ehbxj6o7h.PNG" alt="Alt Text" width="664" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A lista de commits por autor exibida pelo shortlog nos mostra a quantidades de commits, e a mensagem passada em cada commit. É bem útil caso queiramos visualizar quem executou determinada alteração no código.&lt;/p&gt;

&lt;p&gt;Caso queiramos visualizar as quantidade de commits sem exibir a mensagens, basta adicionar o comando &lt;code&gt;-sn&lt;/code&gt; na frente do código. Sendo assim, &lt;code&gt;git log shortlog -sn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsbag6pv7dfuojhix0t34.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsbag6pv7dfuojhix0t34.PNG" alt="Alt Text" width="686" height="54"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Git show
&lt;/h4&gt;

&lt;p&gt;Como eu já disse, a hash de um commit serve para retornar dados referente a ele e fazer algumas alterações quanto ao projeto. O &lt;code&gt;git show "código hash da branch"&lt;/code&gt; mostra os detalhes de um commit específico. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzq8k9xzerew2t8osbcm.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzq8k9xzerew2t8osbcm.PNG" alt="Alt Text" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Existe uma documentação do próprio Git que trata do Git show. Você pode verificar aqui no link: &lt;a href="https://git-scm.com/docs/git-show" rel="noopener noreferrer"&gt;https://git-scm.com/docs/git-show&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Manipulando commits
&lt;/h1&gt;

&lt;p&gt;Quando fazemos alterações em arquivos é bem natural que existam erros e bugs. Quando executamos alterações que influenciam negativamente na usabilidade da ferramenta que estamos desenvolvendo muitas vezes necessitamos retornar para versões antigas até que um problema seja corrigido. Para nos auxiliar no gerenciamento de versões, podemos utilizar algumas funções específicas do Git. Vamos conhecer algumas delas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Git checkout
&lt;/h2&gt;

&lt;p&gt;O comando &lt;code&gt;git checkout&lt;/code&gt; opera em três entidades distintas: os arquivos, os commits e as branches.&lt;/p&gt;

&lt;p&gt;Uma descrição mais precisa da função do checkout descrita pela &lt;a href="https://www.atlassian.com/br/git/tutorials/using-branches/git-checkout" rel="noopener noreferrer"&gt;Atlassian&lt;/a&gt; é:&lt;br&gt;
O checkout pode ser utilizado para visualizar commits antigos além de realizar operações nas branches criadas. A verificação das branches é semelhante à verificação de commits e arquivos antigos, e novas alterações são salvas no histórico do projeto — ou seja, não é uma operação apenas de leitura.&lt;/p&gt;

&lt;p&gt;O git checkout permite a navegação entre branches. A verificação de uma branch atualiza os arquivos no diretório atual para que fique igual à versão armazenada na branch referenciada e diz ao Git para gravar todos os novos commits nessa branch.&lt;/p&gt;
&lt;h4&gt;
  
  
  Retornando status de arquivos
&lt;/h4&gt;

&lt;p&gt;Quando estamos desenvolvendo, é natural que alguns erros sejam cometidos, utilizar a linha do tempo do Git é muito útil caso queiramos manipular arquivos ao bel prazer.&lt;/p&gt;

&lt;p&gt;Quando estamos editando arquivos e eles passam do status unmodified para modified, podemos retornar essas alterações através do comando &lt;code&gt;git checkout NomeDoArquivo&lt;/code&gt;. Veja o exemplo a seguir:&lt;/p&gt;

&lt;p&gt;Aqui existe um arquivo chamado &lt;code&gt;house.html&lt;/code&gt;, ele está com status unmodified. Farei uma pequena modificação para visualizarmos a função do git checkout na prática.&lt;/p&gt;

&lt;p&gt;Arquivo sem nenhuma modificação:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3o9ufwns18qhgwp2vad.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3o9ufwns18qhgwp2vad.PNG" alt="Alt Text" width="638" height="34"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arquivo modificado:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3osblqdzgwud0ofz6xkt.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3osblqdzgwud0ofz6xkt.PNG" alt="Alt Text" width="628" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando executamos o comando &lt;code&gt;git checkout house.html&lt;/code&gt; ele retorna o arquivo do status modified para o status unmodified, sendo assim, as alterações deixam de existir e o arquivo volta ao seu estágio inicial.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b2v0uhzm9dw1xj3xgzv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b2v0uhzm9dw1xj3xgzv.PNG" alt="Alt Text" width="732" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos observar com o &lt;code&gt;git diff&lt;/code&gt; que não existe nenhuma modificação. Sendo assim, o arquivo voltou ao seu estágio de unmodified.&lt;/p&gt;
&lt;h2&gt;
  
  
  Git reset
&lt;/h2&gt;

&lt;p&gt;Como vimos, o checkout retorna um arquivo do status modified para unmodified. Ou seja, não tem influencia quando adicionamos um arquivo para staged ou quando ele é commitado. Para suprir essa necessidade, podemos utilizar outros comandos bem comuns para nos auxiliar. O &lt;code&gt;git reset&lt;/code&gt; e suas opções. &lt;/p&gt;
&lt;h4&gt;
  
  
  Git reset HEAD
&lt;/h4&gt;

&lt;p&gt;O comando &lt;code&gt;git reset HEAD NomeDoArquivo&lt;/code&gt; retorna um arquivo do status staged para o status modified, desse modo, podemos fazer alguma pequena alteração antes de um commit ser realizado.&lt;/p&gt;

&lt;p&gt;Na imagem abaixo realizei uma alteração no arquivo &lt;code&gt;house.html&lt;/code&gt; e o adicionei ao status staged através do comando &lt;code&gt;git add *&lt;/code&gt; (o asterisco adiciona todos os arquivos modificados).&lt;br&gt;
Quando o arquivo passou para o status de staged utilizei o comando &lt;code&gt;git reset HEAD house.html&lt;/code&gt; para retornar o status do arquivo especificado &lt;code&gt;house.html&lt;/code&gt; para o status de modified. Podemos ver que após executado o próprio git nos informa o que foi executado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unstaged changes after reset:
M       house.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pv1o2xj5y3ekjwgyamq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pv1o2xj5y3ekjwgyamq.PNG" alt="Alt Text" width="800" height="662"&gt;&lt;/a&gt;&lt;br&gt;
Desse modo, podemos realizar alterações em arquivos que estão no status staged facilmente.&lt;/p&gt;
&lt;h4&gt;
  
  
  Git reset e suas variações
&lt;/h4&gt;

&lt;p&gt;Além do &lt;code&gt;git reset HEAD&lt;/code&gt; temos outras 3 variações de reset que devem ser utilizadas em situações distintas. Cada um dos comandos altera de forma específica o status de cada arquivo. As formas do &lt;code&gt;git reset&lt;/code&gt; que temos são:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git reset --soft&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git reset --mixed&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git reset --hard&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;É bom explanar que, quando queremos modificar um arquivo do comando reset, devemos sempre referenciar a hash do commit anterior ao que se está tentando dar reset. Para ilustrar posso usar os commits da imagem a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4a273bqgtdg3p9ezyvlx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4a273bqgtdg3p9ezyvlx.PNG" alt="Alt Text" width="573" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso eu queria realizar modificações no commit grifado com azul, eu devo utilizar o reset referenciando o último commit antes do alvo, neste caso, o hash grifado em vermelho. Sabendo disso, podemos seguir com a explicação.&lt;/p&gt;
&lt;h4&gt;
  
  
  Reset Soft
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git reset --soft&lt;/code&gt;&lt;br&gt;
Retorna o commit para o status staged.&lt;/p&gt;

&lt;p&gt;Utilizamos este comando quando realizamos um commit num arquivo e desejamos corrigir ou adicionar algo. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0bx3x5kritvzn6a91wn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0bx3x5kritvzn6a91wn.PNG" alt="Alt Text" width="800" height="251"&gt;&lt;/a&gt;&lt;br&gt;
No caso acima, referenciei a hash de um commit anterior ao foco e utilizei o git status para mostrar que o arquivo house.html voltou para o status de staged, pronto para ser commitado.&lt;/p&gt;
&lt;h4&gt;
  
  
  Reset Mixed
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git reset --mixed&lt;/code&gt;&lt;br&gt;
Retorna o commit para o status modified.&lt;/p&gt;

&lt;p&gt;Aqui o commit retorna para antes de ser adicionado, apenas para o momento que foi modificado. Sendo assim, o status modified.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnxyb4dujqp0ezm0p8kd.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnxyb4dujqp0ezm0p8kd.PNG" alt="Alt Text" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Reset Hard
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;git reset --hard&lt;/code&gt;&lt;br&gt;
Este comando elimina totalmente o seu commit, e retorna para o commit do hash que você está referenciando. Tudo depois dele será eliminado.&lt;/p&gt;

&lt;p&gt;Log antes do git reset. No comando iremos referenciar o segundo commit.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kjdhutsksrofrkeidty.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kjdhutsksrofrkeidty.PNG" alt="Alt Text" width="633" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após o &lt;code&gt;git reset --hard&lt;/code&gt; podemos notar que os commits posteriores ao referenciado deixam de existir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgffdi7h7kkfmwtn7hi5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgffdi7h7kkfmwtn7hi5.PNG" alt="Alt Text" width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É importante lembrar que quando fazemos alguma alteração do tipo, essas alterações são feitas no repositório local, quando se trata de repositórios remotos alguns problemas podem surgir, como conflito de informações entre arquivos por exemplo.&lt;/p&gt;
&lt;h1&gt;
  
  
  Merge
&lt;/h1&gt;

&lt;p&gt;Quando estamos desenvolvendo aplicações em times e precisamos realizar modificações em códigos, adicionar novas funcionalidades ou corrigir bugs, utilizamos as branches do Git para trabalhar. &lt;/p&gt;

&lt;p&gt;Ao finalizamos as alterações, precisamos mover essas alterações para a branch principal (master) para que nossas funcionalidades sejam aplicadas ao projeto. Sendo assim, temos duas metodologias de fluxo de trabalho que podemos seguir para executarmos nossas alterações devidamente. São elas o Merge e o Rebase. &lt;/p&gt;

&lt;p&gt;Para explicar o processo de produção do Merge utilizarei a imagem a seguir. Ela exemplifica o mapa de commits num Merge. Os seus detalhes explicarei a seguir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp59kvjxpyaou4bw42xn1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp59kvjxpyaou4bw42xn1.png" alt="Alt Text" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na ilustração acima podemos notar a presença de duas branches, a master e a feature. Em cada uma das branches são executados commits de acordo com as modificações realizadas. Num determinado momento, os commits realizados na branch feature precisam ser enviados para a branch master. Desse modo, garantimos que a aplicação receba o que foi desenvolvido em outras ramificações. &lt;/p&gt;

&lt;p&gt;Para melhor entendimento, deixe-me descrever melhor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C1 - O primeiro commit realizado na branch master&lt;/li&gt;
&lt;li&gt;C2 - Segundo commit realizado. Aqui foi criada a nova branch chamada feature. A partir daqui começamos a dividir o nosso fluxo de trabalho para o desenvolvimento de uma nova funcionalidade.&lt;/li&gt;
&lt;li&gt;C3 - Na nova branch feature, começamos a realizar commits que inserem as configurações da funcionalidade que queremos implementar.&lt;/li&gt;
&lt;li&gt;C4 - Em paralelo ao desenvolvimento na branch feature, temos modificações executadas na própria master. Essas alterações são exibidas no commit C4.&lt;/li&gt;
&lt;li&gt;C5 - As últimas modificações da feature são efetuadas e a partir daqui precisamos unir nossas alterações realizadas na branch feature, com nosso projeto da master.&lt;/li&gt;
&lt;li&gt;C6 - A união das duas branches acontece através do commit C6, e temos agora todas as modificações do código realizadas na feature pertencendo a branch master.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gostaria de fazer uma simulação de um Merge na prática, desse modo sinto que visualizar o código será mais efetivo para concretizar o conhecimento. &lt;/p&gt;

&lt;p&gt;Configurações do projeto&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diretório chamado merge&lt;/li&gt;
&lt;li&gt;Arquivo &lt;code&gt;index.html&lt;/code&gt; que será modificado&lt;/li&gt;
&lt;li&gt;Duas branches presentes, a branch master e outra chamada feature.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O arquivo index.html foi iniciado e commitado na branch master. Alternamos agora para a branch Feature e criamos um novo arquivo chamado &lt;code&gt;index.js&lt;/code&gt;, iremos commita-lo na branch feature. Após isso, realizamos um novo commit na branch master. Após essas alterações podemos realizar um Merge entre as branches, vinculando as alterações da branch Feature com a branch Master.Desse modo temos a estrutura de commits das duas branches ilustrada a seguir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2mt7vqaj0zanaxbgvay.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2mt7vqaj0zanaxbgvay.PNG" alt="Alt Text" width="564" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Descrevendo o fluxo de commits de cada branch:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Master&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apenas o commit do &lt;code&gt;index.html&lt;/code&gt; que chamei de first commit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdlhm52hmku8o0xisof3x.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdlhm52hmku8o0xisof3x.PNG" alt="Alt Text" width="390" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Criamos uma nova branch e commitamos um novo arquivo chamado &lt;code&gt;index.js&lt;/code&gt; na nova branch feature. Abaixo podemos verificar os commits realizados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqvcv52vp3xkfemdgbs0.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqvcv52vp3xkfemdgbs0.PNG" alt="Alt Text" width="456" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver, temos dois commits, o primeiro realizado na branch master e o o segundo na branch feature. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Master&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alternamos para a branch master e realizamos um novo commit, dessa vez alterando o conteúdo do arquivo index.html.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yac9veympv6opydtudx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yac9veympv6opydtudx.PNG" alt="Alt Text" width="449" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora precisamos unir as alterações das branches através do Merge. Para realizamos um merge, utilizamos o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git merge feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando acima junta a branch feature com a branch master. Lembrando que para o comando funcionar, você precisa estar na branch master, onde a feature será mesclada. A imagem a seguir exibe a união das duas branches. O arquivo &lt;code&gt;index.js&lt;/code&gt; foi adicionado, logo tivemos uma nova inserção.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F781g1ete4eyecsfqw8vv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F781g1ete4eyecsfqw8vv.PNG" alt="Alt Text" width="592" height="69"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora podemos verificar o histórico de commits em forma de gráfico com o comando &lt;code&gt;git log --graph&lt;/code&gt;. Ele exibe todo o fluxo de commits e nos mostra também de onde surgiu determinado commit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flq018mfrxigc9lt0g3jm.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flq018mfrxigc9lt0g3jm.PNG" alt="Alt Text" width="582" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pela ordem de commits temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;first commit realizado na branch master;&lt;/li&gt;
&lt;li&gt;add html document realizado na branch master;&lt;/li&gt;
&lt;li&gt;add js realizado na branch feature;&lt;/li&gt;
&lt;li&gt;merge, união entre as duas branches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A branch master agora contém todas as alterações realizadas na branch feature e na própria branch master.&lt;/p&gt;

&lt;p&gt;Com isso podemos finalizar essa breve introdução ao Git. Você pode utilizar este artigo para fins de consulta. Aprender a teoria de assuntos é muito importante para nos aprofundarmos em algum estudo, mas não se sinta pressionado a decorar cada um dos comandos, programar exige mais capacidade de aprender a consultar do que decorar métodos. &lt;br&gt;
Pretendo atualizar este guia inicial periodicamente, colocando dicas que vocês podem me mandar ou que eu posso acabar descobrindo, sintam-se livres para opinar nos comentários. Até a próxima.&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
