<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>react on Tớ là Đép</title><link>https://toladev.netlify.app/categories/react/</link><description>Recent content in react on Tớ là Đép</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 10 Dec 2022 21:45:42 +0700</lastBuildDate><atom:link href="https://toladev.netlify.app/categories/react/index.xml" rel="self" type="application/rss+xml"/><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></channel></rss>