<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tớ là Đép</title><link>https://toladev.netlify.app/</link><description>Recent content on Tớ là Đép</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 11 Dec 2022 02:45:23 +0700</lastBuildDate><atom:link href="https://toladev.netlify.app/index.xml" rel="self" type="application/rss+xml"/><item><title>Imperative Programming và Declarative Programming</title><link>https://toladev.netlify.app/posts/2022/dec/imperative-and-declarate-programming/</link><pubDate>Sun, 11 Dec 2022 02:45:23 +0700</pubDate><guid>https://toladev.netlify.app/posts/2022/dec/imperative-and-declarate-programming/</guid><description>&lt;img src="https://toladev.netlify.app/posts/2022/dec/imperative-and-declarate-programming/intro.png" alt="Featured image of post Imperative Programming và Declarative Programming" />&lt;p>Gần đây khi đọc vài tài liệu và bài viết mình có thấy lại khái niệm &lt;code>Imperative Programming&lt;/code> và &lt;code>Declarative Programming&lt;/code>, bỗng dưng thấy kiến thức này hơi hổng dù đã có nghía qua nó một lần. Nên mình vội vàng làm ngay một post để hâm lại kiến thức.&lt;/p>
&lt;blockquote>
&lt;p>Imperative vs Declarative Programming&lt;/p>
&lt;p>Imperative là cách bạn làm một thứ.&lt;/p>
&lt;p>Declarative là cái mà bạn muốn.&lt;/p>
&lt;/blockquote>
&lt;h2 id="uhm-vậy-nó-là-cái-quái-gì-">Uhm, vậy nó là cái quái gì (!?)&lt;/h2>
&lt;p>Định nghĩa thì rắc rối, vậy nên mình đưa ra ví dụ cho dễ hình dung.&lt;/p>
&lt;p>&lt;em>Bạn có một cuộc hẹn cho buổi pạt ty cuối tuần, và bạn nhắn: &amp;ldquo;Tao tới CircleK rồi, làm sao tới chỗ mày đây?&amp;rdquo;&lt;/em>&lt;/p>
&lt;p>&lt;strong>Imperative&lt;/strong>: Đi thẳng 100m. Tới đường Nguyễn Văn A, rẽ trái. Đi thẳng đến đường Phan Văn B đi thêm 200m nữa thì rẽ vào hẻm 213, tới nhà có số 12.&lt;/p>
&lt;p>&lt;strong>Declarative&lt;/strong>: Nhà t ở 213/12 Phan Văn B, Google Maps đi con giai.&lt;/p>
&lt;p>&lt;em>Cả 2 cách đều chỉ bạn đến nơi cần đến. Khác biệt ở chỗ, một cách sẽ cho bạn chỉ dẫn để có thể đến nơi, cách còn lại thì mong chị Google không dẫn bạn đi quá xa.&lt;/em>&lt;/p>
&lt;p>Với cách tiếp cận &lt;code>Imperative&lt;/code> thì bạn sẽ có được một chỉ dẫn cụ thể, làm cách nào mà bạn đến được địa chỉ đó (how).&lt;/p>
&lt;p>Với &lt;code>Declarative&lt;/code> thì sẽ cho bạn cái bạn muốn (what) - một địa chỉ và mặc định bạn sẽ biết cách kiếm ra được đường đi.&lt;/p>
&lt;p>Ta có thể thấy được các ngôn ngữ đang chia theo cách tiếp cận nào:&lt;/p>
&lt;p>&lt;strong>Imperative&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>C&lt;/li>
&lt;li>C++&lt;/li>
&lt;li>Java&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Declarative&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>SQL&lt;/li>
&lt;li>HTML&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Both&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Javascript&lt;/li>
&lt;li>C#&lt;/li>
&lt;li>Python&lt;/li>
&lt;/ul>
&lt;h2 id="các-ví-dụ">Các ví dụ&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-SQL" data-lang="SQL">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">SELECT&lt;/span> &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#66d9ef">FROM&lt;/span> Users &lt;span style="color:#66d9ef">WHERE&lt;/span> Country&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;Viet Nam&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Lướt qua ví dụ bạn có thể thấy và hiểu ngay bạn đang cần &lt;em>cái gì&lt;/em> mà không cần quan tâm đến SQL lấy &lt;em>bằng cách nào&lt;/em> hay &lt;em>bằng thuật toán nào.&lt;/em>&lt;/p>
&lt;blockquote>
&lt;p>Bạn sẽ lấy được thông tin người dùng từ table &lt;code>Users&lt;/code>, họ có quốc tịch &lt;code>Viet Nam&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">sum&lt;/span>(&lt;span style="color:#a6e22e">a&lt;/span>, &lt;span style="color:#a6e22e">b&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Rõ ràng, đây là cách tiếp cận &lt;code>Imperative&lt;/code>, bạn khai báo một hàm, đặt tên cho nó, trong hàm có 2 tham số &lt;code>a, b&lt;/code> và nó sẽ trả về cho bạn tổng của 2 số đó.&lt;/p>
&lt;p>Giả sử mình có yêu cầu sau&lt;/p>
&lt;p>&lt;em>Viết 1 hàm tên là &lt;code>add&lt;/code>, nhận vào một mảng số nguyên và trả về tổng của các phần tử trong đó.&lt;/em>&lt;/p>
&lt;p>Và vì &lt;code>Javascript&lt;/code> là ngôn ngữ có cả &lt;code>Imperative&lt;/code> và &lt;code>Declarative&lt;/code> nên ta hoàn toàn có 2 cách tiếp cận nó như sau:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Imperative
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">arr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">len&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">arr&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">len&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span>&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#a6e22e">arr&lt;/span>[&lt;span style="color:#a6e22e">i&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Declarative
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">arr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">arr&lt;/span>.&lt;span style="color:#a6e22e">reduce&lt;/span>((&lt;span style="color:#a6e22e">total&lt;/span>, &lt;span style="color:#a6e22e">current&lt;/span>) =&amp;gt; (&lt;span style="color:#a6e22e">total&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#a6e22e">current&lt;/span>), &lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="tổng-kết">Tổng kết&lt;/h2>
&lt;p>&lt;strong>Imperative&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Quen thuộc&lt;/li>
&lt;li>Dễ học&lt;/li>
&lt;li>Có tính logic&lt;/li>
&lt;/ul>
&lt;p>Đây là cách tiếp cận chúng ta được được học từ những ngày đầu, mô tả cách thực hiện. Logic được thể hiện rõ ra bên ngoài.&lt;/p>
&lt;p>&lt;strong>Declarative&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Hạn chế sự thay đổi&lt;/li>
&lt;li>Giảm side-effects&lt;/li>
&lt;li>Code ngắn và dễ đọc hơn&lt;/li>
&lt;/ul>
&lt;p>Do không phải viết lại các bước logic, nên code sẽ rõ ràng hơn và dễ đọc hơn. Nhưng Logic lại bị ẩn đi (abstract).&lt;/p></description></item><item><title>React hoạt động như thế nào?</title><link>https://toladev.netlify.app/posts/2022/dec/how-react-works-under-the-hood/</link><pubDate>Sat, 10 Dec 2022 21:45:42 +0700</pubDate><guid>https://toladev.netlify.app/posts/2022/dec/how-react-works-under-the-hood/</guid><description>&lt;img src="https://toladev.netlify.app/posts/2022/dec/how-react-works-under-the-hood/intro.jpeg" alt="Featured image of post React hoạt động như thế nào?" />&lt;p>&lt;a class="link" href="https://beta.reactjs.org/" target="_blank" rel="noopener"
>React&lt;/a> là một thư viện Javascript rất phổ biến, và đang phát triển rất mạnh. Nhưng mấy ai biết được cách mà React thực sự hoạt động (trong đó có mình T.T). Đa số các lập trình viên đều biết các khái niệm và làm việc với React (core concepts, API, hooks, &amp;hellip;), nhưng cách React làm việc (how and why) thì vẫn còn khá mù mờ.&lt;/p>
&lt;h2 id="vậy-react-làm-công-chiện-gì">Vậy React làm công chiện gì?&lt;/h2>
&lt;p>Công việc chính của React là làm vườn, nó chăm sóc cho bạn 1 cái cây, không phải cây cảnh mà là cây DOM. Cây này giúp các bạn các phép tính toán trên nodes.&lt;/p>
&lt;p>&lt;img src="https://www.w3schools.com/js/pic_htmltree.gif"
loading="lazy"
alt="DOM"
>&lt;/p>
&lt;p>&lt;em>DOM Nodes (src: w3schools)&lt;/em>&lt;/p>
&lt;p>Nhưng bất ngờ chưa, cây này không phải là cây thật (Real DOM) mà là cây ảo (Virtual DOM). React không những là anh làm vườn, mà còn là một cây tỉa nến chuyên nghiệp =]]z.&lt;/p>
&lt;p>Vậy tại sao lại có cây này, hiểu đơn giản thì &lt;em>Real DOM&lt;/em> giống như ngôi nhà đã được xây dựng vậy, còn &lt;em>Virtual DOM&lt;/em> thì giống như bản thiết kế (blueprint). Đoán xem thay đổi ở đâu nhanh và nhẹ hơn nào.&lt;/p>
&lt;blockquote>
&lt;p>Để có thể hiểu thêm quá trình Rendering trên trình duyệt thì bạn có thể &lt;a class="link" href="https://medium.com/jspoint/how-the-browser-renders-a-web-page-dom-cssom-and-rendering-df10531c9969" target="_blank" rel="noopener"
>nghía qua post này&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;h2 id="jsx">JSX&lt;/h2>
&lt;p>Làm việc với React hẳn rất quen thuộc với cú pháp này, nó gọi là &lt;a class="link" href="https://beta.reactjs.org/learn/writing-markup-with-jsx" target="_blank" rel="noopener"
>JSX&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-jsx" data-lang="jsx">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">Tag&lt;/span> &lt;span style="color:#f92672">=&lt;/span> () =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &amp;lt;&lt;span style="color:#f92672">div&lt;/span>&amp;gt;&lt;span style="color:#a6e22e">Hello&lt;/span> &lt;span style="color:#a6e22e">World&lt;/span>&lt;span style="color:#f92672">!&lt;/span>&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>JSX là một cú pháp đặc biệt, chẳng phải là &lt;code>string&lt;/code>, &lt;code>js&lt;/code> hay là &lt;code>HTML&lt;/code>. Nó là cú pháp mở rộng cho &lt;code>js&lt;/code> và cho phép bạn viết cú pháp giống như &lt;code>HTML&lt;/code> trong file &lt;code>js&lt;/code> để tạo ra một đối tượng cụ thể.&lt;/p>
&lt;p>Về cơ bản những gì bạn làm sẽ là thế này:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-jsx" data-lang="jsx">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">Tag&lt;/span> &lt;span style="color:#f92672">=&lt;/span> () =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">React&lt;/span>.&lt;span style="color:#a6e22e">createElement&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;div&amp;#34;&lt;/span>, {}, &lt;span style="color:#e6db74">&amp;#34;Hello World!&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * createElement sẽ trông như thế này.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * {
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> $$typeof: Symbol(react.element),
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> key: null,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> props: {children: &amp;#34;Hello World!&amp;#34;},
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> ref: null,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> type: &amp;#34;div&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">*/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- raw HTML omitted -->
&lt;p>Giờ bạn biết rồi đấy, khi app chạy, JSX được parsed và mọi phương thức React.createElement được gọi thì ta sẽ có một cục Object siêu to khổng lồ được lồng vào nhau.&lt;/p>
&lt;h2 id="react-virtual-dom-và-reconciliation">React Virtual DOM và Reconciliation&lt;/h2>
&lt;p>Ứng dụng React được tạo thành bởi các Components. Component bản chất là nhóm React Element được trả về bởi phương thức &lt;code>render()&lt;/code> hoặc &lt;code>return&lt;/code>.&lt;/p>
&lt;p>Và bởi các Component được lồng vào nhau và được duyệt trong quá trình chạy, React Elements thiết lập liên kết cha-con tương tự như DOM, đây chính là &lt;em>DOM ảo&lt;/em> mà ta đã nói ở trên. Sau đó React sẽ đồng bộ &lt;em>DOM ảo&lt;/em> với &lt;em>DOM thật&lt;/em>.&lt;/p>
&lt;blockquote>
&lt;p>React uses virtual DOM which is a lightweight version of the DOM. The only difference is the ability to write the screen like the real DOM, in fact, a new virtual DOM is created after every re-render. DOM stores the components of a website in a tree structure.
&lt;a class="link" href="https://www.geeksforgeeks.org/what-is-diffing-algorithm/" target="_blank" rel="noopener"
>Diffing Algorithm&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://media.geeksforgeeks.org/wp-content/cdn-uploads/20220131100246/Group-2-2.jpg"
loading="lazy"
alt="How DOM updated in React"
>&lt;/p>
&lt;p>&lt;em>How DOM updated in react (src: geeksforgeeks)&lt;/em>&lt;/p>
&lt;h3 id="cách-dom-cập-nhật-trên-react">Cách DOM cập nhật trên React&lt;/h3>
&lt;ul>
&lt;li>Lần chạy đầu tiên, cả DOM ảo và DOM thật được khởi tạo.&lt;/li>
&lt;li>React hoạt động trên &lt;code>observable pattern&lt;/code>, từ đây, bất kì thay đổi nào trên state, React sẽ cập nhật lại DOM ảo.&lt;/li>
&lt;li>Sau đó, React so sánh DOM ảo và DOM thật và cập nhật thay đổi, quá trình này gọi là &lt;code>reconciliation&lt;/code> (hay giảng hòa).&lt;/li>
&lt;/ul>
&lt;p>Ract dùng thuật toán heuristic hay gọi là thuật toán Diffing để so sánh sự khác nhau.&lt;/p>
&lt;p>React kiểm tra phần tử gỗc để thay đổi và cập nhật dựa trên &lt;code>type&lt;/code> của element&lt;/p>
&lt;p>React không thực hiện nhiều tính toán ở những phần diffing, React giả sử rằng nếu parent thay đổi, thì child chắn chắn sẽ thay đổi.&lt;/p>
&lt;p>Ví dụ&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-jsx" data-lang="jsx">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">div&lt;/span> &lt;span style="color:#a6e22e">className&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;class&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">p&lt;/span>&amp;gt;&lt;span style="color:#a6e22e">I&lt;/span> &lt;span style="color:#a6e22e">did&lt;/span> &lt;span style="color:#a6e22e">not&lt;/span> &lt;span style="color:#a6e22e">change&lt;/span>&amp;lt;/&lt;span style="color:#f92672">p&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Và nếu ta thay đổi &lt;code>type&lt;/code> của thẻ &lt;code>div&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-jsx" data-lang="jsx">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#f92672">p&lt;/span> &lt;span style="color:#a6e22e">className&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;class&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#f92672">p&lt;/span>&amp;gt;&lt;span style="color:#a6e22e">I&lt;/span> &lt;span style="color:#a6e22e">did&lt;/span> &lt;span style="color:#a6e22e">not&lt;/span> &lt;span style="color:#a6e22e">change&lt;/span>&amp;lt;/&lt;span style="color:#f92672">p&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#f92672">p&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Mặc dù ta không cần tạo lại thẻ &lt;code>p&lt;/code>, nhưng React sẽ không biết khi duyệt cây từ trên xuống. Vì vậy, React quyết định hủy toàn bộ children và khởi tạo lại từ đầu.&lt;/p>
&lt;p>Trong trường hợp phần tử có cùng type, React sẽ kiểm tra đến các thuộc tính. Sau đó mới cập nhật các nodes có thay đổi. Component sex được cập nhật vào lifecycle tiếp theo. Và đây cũng là lí do tại sao ta &lt;strong>bắt buộc&lt;/strong> có thuộc tính &lt;code>key&lt;/code> trong list render, để React có thể dễ dàng xác định các cập nhật trong các phần tử.&lt;/p>
&lt;h2 id="tổng-kết">Tổng kết&lt;/h2>
&lt;p>Hi vọng bài viết này đã đủ để nói về khái niệm về cách mà React đang hoạt động.&lt;/p>
&lt;h2 id="tham-khảo">Tham khảo&lt;/h2>
&lt;p>&lt;a class="link" href="https://www.freecodecamp.org/news/react-under-the-hood/" target="_blank" rel="noopener"
>React under the hood - FreeCodeCamp&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://betterprogramming.pub/what-does-react-actually-do-c9412c08bfe6" target="_blank" rel="noopener"
>What Does React Actually Do?&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://javascript.plainenglish.io/how-react-works-under-the-hood-277356c95e3d" target="_blank" rel="noopener"
>How React Works Under the Hood&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://codewithsudeep.com/sudeep/javascript/reactjs/how-does-react-js-actually-work/" target="_blank" rel="noopener"
>How does React JS actually work?&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://medium.com/@mousumi.cse05/react-behind-the-scene-521dea44ed0e" target="_blank" rel="noopener"
>React Behind The Scene&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://www.geeksforgeeks.org/what-is-diffing-algorithm/" target="_blank" rel="noopener"
>What is Diffing Algorithm ?&lt;/a>&lt;/p></description></item><item><title>Archives</title><link>https://toladev.netlify.app/archives/</link><pubDate>Tue, 28 May 2019 00:00:00 +0000</pubDate><guid>https://toladev.netlify.app/archives/</guid><description/></item><item><title>Search</title><link>https://toladev.netlify.app/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toladev.netlify.app/search/</guid><description/></item></channel></rss>