<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Thủ thuật Javascript</title>
	<atom:link href="https://thienanblog.com/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://thienanblog.com/category/javascript/</link>
	<description>Javascript - PHP - SEO - Web Development</description>
	<lastBuildDate>Sat, 07 Apr 2018 05:33:26 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>

<image>
	<url>https://thienanblog.com/wp-content/uploads/2017/05/TAB_favicon.ico.png</url>
	<title>Thủ thuật Javascript</title>
	<link>https://thienanblog.com/category/javascript/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Redux Video Series</title>
		<link>https://thienanblog.com/video-source-code/redux-video-series/</link>
					<comments>https://thienanblog.com/video-source-code/redux-video-series/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Sat, 07 Apr 2018 05:33:26 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Redux]]></category>
		<category><![CDATA[Video - Source Code]]></category>
		<category><![CDATA[async action middleware]]></category>
		<category><![CDATA[cách sử dung redux]]></category>
		<category><![CDATA[học redux]]></category>
		<category><![CDATA[hướng dẫn redux]]></category>
		<category><![CDATA[hướng dẫn redux cho người mới]]></category>
		<category><![CDATA[middleware async action]]></category>
		<category><![CDATA[middleware là gì]]></category>
		<category><![CDATA[middleware redux]]></category>
		<category><![CDATA[reducer]]></category>
		<category><![CDATA[redux aciton]]></category>
		<category><![CDATA[redux là gì]]></category>
		<category><![CDATA[redux middleware]]></category>
		<category><![CDATA[redux react]]></category>
		<category><![CDATA[redux store]]></category>
		<category><![CDATA[tìm hiểu về redux]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=340</guid>

					<description><![CDATA[<p>Trong Series này các bạn sẽ được tìm hiểu về Redux là gì một cách nhanh nhất có thể. Mọi kiến thức được tóm gọn ít nhất qua các ví&#8230;</p>
<p>The post <a href="https://thienanblog.com/video-source-code/redux-video-series/">Redux Video Series</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Trong Series này các bạn sẽ được tìm hiểu về Redux là gì một cách nhanh nhất có thể. Mọi kiến thức được tóm gọn ít nhất qua các ví dụ thực tiễn thay vì chỉ lý thuyết suông rồi mới thực hành. Nên sẽ rất phù hợp với người mới chưa biết gì về Redux sẽ nhanh chóng nắm bắt được nó hơn so với cách thông thường là phải thông qua tài liệu của Redux và làm từng bước giống họ.</p>
<p>[embedyt] https://www.youtube.com/embed?listType=playlist&amp;list=PLWk-xAvPITxFyvt3DB6Rosl5vKa9Bj7i3&amp;layout=gallery[/embedyt]</p>
<p>The post <a href="https://thienanblog.com/video-source-code/redux-video-series/">Redux Video Series</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/video-source-code/redux-video-series/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tìm hiểu Reducer là gì trong Javascript</title>
		<link>https://thienanblog.com/video-source-code/tim-hieu-reducer-la-gi-trong-javascript/</link>
					<comments>https://thienanblog.com/video-source-code/tim-hieu-reducer-la-gi-trong-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Wed, 04 Apr 2018 10:15:46 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Javascript cơ bản]]></category>
		<category><![CDATA[Video - Source Code]]></category>
		<category><![CDATA[reducer javascript]]></category>
		<category><![CDATA[reducer js]]></category>
		<category><![CDATA[reducer là gì]]></category>
		<category><![CDATA[reducer trong redux]]></category>
		<category><![CDATA[redux reducer]]></category>
		<category><![CDATA[tìm hiểu reducer]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=334</guid>

					<description><![CDATA[<p>Reducer là gì? Chắc hẳn đây là câu hỏi mà đa số người dùng sử dụng qua thư viện của Redux hoặc vô tình biết qua phương thức reduce() này&#8230;</p>
<p>The post <a href="https://thienanblog.com/video-source-code/tim-hieu-reducer-la-gi-trong-javascript/">Tìm hiểu Reducer là gì trong Javascript</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Reducer là gì? Chắc hẳn đây là câu hỏi mà đa số người dùng sử dụng qua thư viện của Redux hoặc vô tình biết qua phương thức reduce() này nên sẽ thắc mắc về nó.</p>
<p>(Bài viết này có bao gồm một số kiến thức ở bài <a href="https://thienanblog.com/javascript/tim-hieu-ve-mutable-va-immutable-object-trong-javascript/">Tìm hiểu về Mutable và Immutable Object trong Javascript</a>)</p>
<p>Reducer được dùng thay thế cho vòng lặp ở một số nhiệm vụ nhất định, giúp cho việc viết Code nhanh hơn. Nên các bạn cũng không cần quá bận tâm nếu như các bạn thật sự không thích cách làm việc này của nó mà có thể thay thế bằng các vòng lặp khác như for, foreach, map&#8230;</p>
<p>[embedyt] https://www.youtube.com/watch?v=fUC3u-srdUA[/embedyt]</p>
<p>Source: <a href="https://jsbin.com/fatifam/2/edit?js,console">https://jsbin.com/fatifam/2/edit?js,console</a></p>
<p>The post <a href="https://thienanblog.com/video-source-code/tim-hieu-reducer-la-gi-trong-javascript/">Tìm hiểu Reducer là gì trong Javascript</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/video-source-code/tim-hieu-reducer-la-gi-trong-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tìm hiểu về Mutable và Immutable Object trong Javascript</title>
		<link>https://thienanblog.com/video-source-code/tim-hieu-ve-mutable-va-immutable-object-trong-javascript/</link>
					<comments>https://thienanblog.com/video-source-code/tim-hieu-ve-mutable-va-immutable-object-trong-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Sun, 01 Apr 2018 13:16:27 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Javascript cơ bản]]></category>
		<category><![CDATA[Video - Source Code]]></category>
		<category><![CDATA[immutable là gì]]></category>
		<category><![CDATA[immutable object là gì]]></category>
		<category><![CDATA[immutable redux]]></category>
		<category><![CDATA[mutable là gì]]></category>
		<category><![CDATA[mutable object là gì]]></category>
		<category><![CDATA[mutable và immutable]]></category>
		<category><![CDATA[mutable và immutable có gì khác]]></category>
		<category><![CDATA[sự khác nhau giữa mutable và immutable]]></category>
		<category><![CDATA[tại sao nên dùng immutable]]></category>
		<category><![CDATA[xu hướng lập trình immutable]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=331</guid>

					<description><![CDATA[<p>Bắt kịp với xu hướng mới, trong Video này chúng ta cùng tìm hiểu về 2 khái niệm Mutable Object và Immutable Object khác nhau như thế nào? Và tại&#8230;</p>
<p>The post <a href="https://thienanblog.com/video-source-code/tim-hieu-ve-mutable-va-immutable-object-trong-javascript/">Tìm hiểu về Mutable và Immutable Object trong Javascript</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Bắt kịp với xu hướng mới, trong Video này chúng ta cùng tìm hiểu về 2 khái niệm Mutable Object và Immutable Object khác nhau như thế nào? Và tại sao chúng ta nên sử dụng chúng? Nhất là xu thế hiện tại rất chuộng bộ đôi &#8220;sát thủ&#8221; React + Redux. Hãy cùng tôi tìm hiểu nó các bạn nhé!</p>
<p>[embedyt] https://www.youtube.com/watch?v=hMd_nr1dexg[/embedyt]</p>
<p>The post <a href="https://thienanblog.com/video-source-code/tim-hieu-ve-mutable-va-immutable-object-trong-javascript/">Tìm hiểu về Mutable và Immutable Object trong Javascript</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/video-source-code/tim-hieu-ve-mutable-va-immutable-object-trong-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tìm hiểu Component trong ReactJS</title>
		<link>https://thienanblog.com/javascript/reactjs/tim-hieu-component-trong-reactjs/</link>
					<comments>https://thienanblog.com/javascript/reactjs/tim-hieu-component-trong-reactjs/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Wed, 18 Oct 2017 03:16:08 +0000</pubDate>
				<category><![CDATA[ReactJS]]></category>
		<category><![CDATA[cách viết component reactjs]]></category>
		<category><![CDATA[component jsx]]></category>
		<category><![CDATA[component là gì]]></category>
		<category><![CDATA[component react]]></category>
		<category><![CDATA[component reactjs]]></category>
		<category><![CDATA[component trong react]]></category>
		<category><![CDATA[component trong reactjs]]></category>
		<category><![CDATA[viết component reactjs]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=321</guid>

					<description><![CDATA[<p>Trong ReactJS, mỗi đoạn code sẽ được phân chia thành những Component không lệ thuộc lẫn nhau và có thể tái sử dụng khi cần thiết. Vì vậy trong bài&#8230;</p>
<p>The post <a href="https://thienanblog.com/javascript/reactjs/tim-hieu-component-trong-reactjs/">Tìm hiểu Component trong ReactJS</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Trong ReactJS, mỗi đoạn code sẽ được phân chia thành những Component không lệ thuộc lẫn nhau và có thể tái sử dụng khi cần thiết. Vì vậy trong bài viết này chúng ta sẽ tìm hiểu cách viết và sử dụng Component như thế nào trong ReactJS.</p>
<h3>Yêu cầu trong bài viết</h3>
<div>Bài viết này được viết trên nền tảng JavaScript ES6 + Babel Compiler có sẵn trong <span class="lang:default decode:true  crayon-inline ">create-react-app</span> . Vì thế, các bạn hãy tập làm quen với các cú pháp mới và &#8220;lạ&#8221; trong bài viết này.</div>
<div></div>
<h3>Cú pháp</h3>
<div>Để khởi tạo Component chúng ta sẽ có nhiều cách như sau:</div>
<ul>
<li>Dùng let, const trong JavaScript ES6 hoặc var ở các phiên bản JavaScript thấp hơn.</li>
<li>Dùng Function.</li>
<li>Dùng Class trong JavaScript ES6.</li>
</ul>
<h3>Ví dụ</h3>
<pre class="lang:default decode:true ">import React, { Component } from 'react';

// Ví dụ 1
let Tab_let = () =&gt; {
  return (
    &lt;div&gt;Khởi tạo bằng let&lt;/div&gt;
  );
};

// Ví dụ 2
const Tab_const = () =&gt; {
  return (
    &lt;div&gt;Khởi tạo bằng const&lt;/div&gt;
  );
};

// Ví dụ 3 - const hoặc let đều được
const Tab_shorthand = () =&gt; (
  &lt;div&gt;Cách tắt khi dùng Arrow Function&lt;/div&gt;
);

// Ví dụ 4
function Tab_function() {
  return (
    &lt;div&gt;Khởi tạo bằng Function&lt;/div&gt;
  );
}

// Ví dụ 5
class Tab_class extends Component {
  render() {
    return (
      &lt;div&gt;Khởi tạo bằng Class&lt;/div&gt;
    );
  }
}</pre>
<div>Qua ví dụ trên thì khi dùng let hoặc const, chúng ta cần dùng <a href="https://thienanblog.com/javascript/su-khac-biet-giua-arrow-function-va-function-thong-thuong/">Arrow Function</a> hoặc <a href="https://thienanblog.com/javascript/javascript-co-ban/bai-6-anonymous-function-va-closure/">Anonymous Function</a> để gán vào cho biến hoặc hằng. Trong khi Function có cách dùng tương tự cách định nghĩa biến và hằng thì Class lại phải kế thừa từ Class Component trong ReactJS để có thể chạy được.</div>
<div></div>
<div>Ở ví dụ 3, các bạn nên lưu ý là cú pháp dùng 2 dấu <span class="lang:default decode:true  crayon-inline">(&#8230;)</span>  này có ý nghĩa là vừa vừa <strong>return</strong> như ví dụ 2 và vừa <strong>tạo ra JSX</strong> ở bên trong nó. Chúng ta sẽ tìm hiểu sâu hơn về JSX ở những bài sau nên bài này các bạn &#8220;chịu khó&#8221; vẫn chưa hiểu nó nhé.</div>
<div></div>
<div>Tiếp tục sau khi khởi tạo, tên của biến, hằng, function và class sẽ trở thành 1 Component với HTML Tag là <span class="lang:default decode:true  crayon-inline ">&lt;tenBien /&gt;</span> . <strong>Nên nhớ là HTML Tag phải là thẻ tự đóng</strong>, còn khi nào thì nên dùng thẻ bao thì tôi sẽ nói rõ khi chúng ta tìm hiểu tới khái niệm về Props (Properties).</div>
<div></div>
<div>
<h3>Cách sử dụng</h3>
<div>Chúng ta chỉ đơn giản sử dụng tên thẻ như trước đó tôi đã đề cập vào bất kỳ vị trí nào nằm bên trong phạm vi sử dụng React. Chắc có lẽ sẽ có nhiều bạn đến khúc này sẽ bị lấn cấn đó là làm sao biết phạm vi của React là ở đâu? Và nó đã được khởi tạo như thế nào?</div>
<div></div>
<div>Quay lại bài viết trước, các bạn có nhớ rằng khi các bạn tạo dựng ReactJS bằng cách dùng <span class="lang:default decode:true  crayon-inline ">create-react-app</span> , chúng ta đã thấy qua file <span class="lang:default decode:true  crayon-inline ">index.js</span>  trong thư mục <span class="lang:default decode:true  crayon-inline ">src</span>  chứ. Vâng, chính là nó! Tôi sẽ giải thích cho các bạn qua cấu trúc file <span class="lang:default decode:true  crayon-inline ">public/index.html</span>  và <span class="lang:default decode:true  crayon-inline ">src/index.js</span>  bằng hình ảnh sau:</div>
<div><a href="https://thienanblog.com/wp-content/uploads/2017/10/1.index-html-index-js-structure.png"><img fetchpriority="high" decoding="async" class="aligncenter wp-image-322 size-full" src="https://thienanblog.com/wp-content/uploads/2017/10/1.index-html-index-js-structure.png" alt="1.index-html-index-js-structure.png" width="1279" height="826" srcset="https://thienanblog.com/wp-content/uploads/2017/10/1.index-html-index-js-structure.png 1279w, https://thienanblog.com/wp-content/uploads/2017/10/1.index-html-index-js-structure-300x194.png 300w, https://thienanblog.com/wp-content/uploads/2017/10/1.index-html-index-js-structure-768x496.png 768w, https://thienanblog.com/wp-content/uploads/2017/10/1.index-html-index-js-structure-1024x661.png 1024w" sizes="(max-width: 1279px) 100vw, 1279px" /></a></div>
<div>
<div></div>
<div>Hình ảnh trên chứa các phương thức mặc định dùng để khởi động ReactJS cũng như trỏ tới <span class="lang:default decode:true  crayon-inline ">&lt;div id=&#8221;root&#8221;&gt;&lt;/div&gt;</span>  để nhận biết đâu là vùng hoạt động của ReactJS. Tiếp tục, chúng ta quay trở lại file <span class="lang:default decode:true  crayon-inline ">App.js</span>  và thêm những Component mà chúng ta đã viết ở trên vào:</div>
</div>
</div>
<div></div>
<div><a href="https://thienanblog.com/wp-content/uploads/2017/10/2.add-to-app.png"><img decoding="async" class="aligncenter wp-image-323 size-full" src="https://thienanblog.com/wp-content/uploads/2017/10/2.add-to-app.png" alt="2.add-to-app" width="1109" height="826" srcset="https://thienanblog.com/wp-content/uploads/2017/10/2.add-to-app.png 1109w, https://thienanblog.com/wp-content/uploads/2017/10/2.add-to-app-300x223.png 300w, https://thienanblog.com/wp-content/uploads/2017/10/2.add-to-app-768x572.png 768w, https://thienanblog.com/wp-content/uploads/2017/10/2.add-to-app-1024x763.png 1024w" sizes="(max-width: 1109px) 100vw, 1109px" /></a></div>
<div></div>
<div>
<div>Và kết quả nhận được:</div>
</div>
<div></div>
<div><a href="https://thienanblog.com/wp-content/uploads/2017/10/3.result.png"><img decoding="async" class="aligncenter wp-image-324 size-full" src="https://thienanblog.com/wp-content/uploads/2017/10/3.result.png" alt="result" width="1217" height="454" srcset="https://thienanblog.com/wp-content/uploads/2017/10/3.result.png 1217w, https://thienanblog.com/wp-content/uploads/2017/10/3.result-300x112.png 300w, https://thienanblog.com/wp-content/uploads/2017/10/3.result-768x287.png 768w, https://thienanblog.com/wp-content/uploads/2017/10/3.result-1024x382.png 1024w" sizes="(max-width: 1217px) 100vw, 1217px" /></a></div>
<div>
<div></div>
<h3>Lời kết</h3>
<div>Như vậy, chúng ta đã tạo ra những Component trong ReactJS bằng nhiều cú pháp khác nhau và kết hợp với cú pháp JSX để tạo ra React Element. Vậy JSX là gì? Component chỉ có vậy thôi sao? Hãy đón xem tiếp ở phần sau các bạn nhé.</div>
</div>
<p>The post <a href="https://thienanblog.com/javascript/reactjs/tim-hieu-component-trong-reactjs/">Tìm hiểu Component trong ReactJS</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/javascript/reactjs/tim-hieu-component-trong-reactjs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tìm hiểu ReactJS và hướng dẫn cài đặt</title>
		<link>https://thienanblog.com/javascript/reactjs/tim-hieu-reactjs/</link>
					<comments>https://thienanblog.com/javascript/reactjs/tim-hieu-reactjs/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Mon, 16 Oct 2017 17:46:23 +0000</pubDate>
				<category><![CDATA[ReactJS]]></category>
		<category><![CDATA[cách sử dụng react]]></category>
		<category><![CDATA[cách sử dụng reactjs]]></category>
		<category><![CDATA[cài đặt react]]></category>
		<category><![CDATA[cài đặt reactjs]]></category>
		<category><![CDATA[hướng dẫn react]]></category>
		<category><![CDATA[hướng dẫn reactjs]]></category>
		<category><![CDATA[react là gì]]></category>
		<category><![CDATA[reactjs là gì]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=300</guid>

					<description><![CDATA[<p>ReactJS là một thư viện JavaScript dùng trong việc xây dựng giao diện người dùng và được phát triển bởi đội ngũ Facebook. Tới nay, ReactJS đã thu hút hàng&#8230;</p>
<p>The post <a href="https://thienanblog.com/javascript/reactjs/tim-hieu-reactjs/">Tìm hiểu ReactJS và hướng dẫn cài đặt</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>ReactJS là một thư viện JavaScript dùng trong việc xây dựng giao diện người dùng và được phát triển bởi đội ngũ Facebook. Tới nay, ReactJS đã thu hút hàng triệu lập trình viên trên thế giới. ReactJS thường được dùng bởi Frontend Developer trong thiết kế Web Application một cách nhanh chóng hơn. Vậy để tìm hiểu ReactJS, chúng ta phải tìm hiểu từ đâu? Và cần gì để chạy được ReactJS? Qua bài viết này, các bạn đọc giả sẽ hiểu được cách cài đặt và sử dụng ReactJS một cách đơn giản nhất.</p>
<h3>Yêu cầu</h3>
<ul>
<li>Cài đặt NodeJS phiên bản mới &gt;= 6 (LTS hoặc bản hiện tại &#8211; <a href="https://nodejs.org/en/download/">https://nodejs.org/en/download/</a>)</li>
<li>Cài đặt Visual Studio Code/Sublime Text hoặc WebStorm (tùy chọn)</li>
</ul>
<h3>Cài đặt</h3>
<div>Đầu tiên, các bạn phải chắc chắn rằng mình đã cài đặt đúng phiên bản NodeJS và có NPM bằng cách gõ vào cửa sổ Command Prompt/Windows Powershell hay Terminal trên Mac và Linux:</div>
<div><a href="https://thienanblog.com/wp-content/uploads/2017/10/1.node-npm-version.png"><img loading="lazy" decoding="async" class="size-full wp-image-301 aligncenter" src="https://thienanblog.com/wp-content/uploads/2017/10/1.node-npm-version.png" alt="" width="625" height="352" srcset="https://thienanblog.com/wp-content/uploads/2017/10/1.node-npm-version.png 625w, https://thienanblog.com/wp-content/uploads/2017/10/1.node-npm-version-300x169.png 300w" sizes="auto, (max-width: 625px) 100vw, 625px" /></a></div>
<div></div>
<div>Như ở trên, các bạn cũng đã thấy phiên bản hiện tại của NodeJS là 8.6.0 và như thế là đã đạt tiêu chuẩn của ReactJS, còn NPM khi bạn cài các phiên bản 8.x trở lên thì NPM cũng đã ở phiên bản 5.x. Vì thế các bạn hãy kiểm tra kỹ, tránh tình trạng cài nhầm NPM phiên bản thấp hơn khi xài các thư viện khác khi thư viên đó đòi hỏi 1 phiên bản NodeJS hoặc NPM thấp hơn để có thể chạy ổn định.</div>
<div></div>
<div>Tiếp tục, chúng ta sẽ tiến hành cài đặt ReactJS thông qua Package đã được viết sẵn cho chúng ta bằng cách gõ vào lệnh <span class="lang:default decode:true crayon-inline ">npm install -g create-react-app</span>  và nó sẽ cài đặt như hình bên dưới:</div>
<div></div>
<div><a href="https://thienanblog.com/wp-content/uploads/2017/10/2.install-create-react-app.png"><img loading="lazy" decoding="async" class="size-full wp-image-302 aligncenter" src="https://thienanblog.com/wp-content/uploads/2017/10/2.install-create-react-app.png" alt="" width="625" height="352" srcset="https://thienanblog.com/wp-content/uploads/2017/10/2.install-create-react-app.png 625w, https://thienanblog.com/wp-content/uploads/2017/10/2.install-create-react-app-300x169.png 300w" sizes="auto, (max-width: 625px) 100vw, 625px" /></a></div>
<div></div>
<div></div>
<div>Sau khi cài đặt hoàn tất, các bạn có thể gõ tiếp lệnh theo cú pháp sau:</div>
<div>
<pre class="lang:default decode:true ">create-react-app thienanblog</pre>
<p>Trong đó <span class="lang:default decode:true crayon-inline" style="color: #ff0000;">thienanblog</span>  là tên Folder mà các bạn ấn định nên không cần phải làm theo bài viết. Tuy nhiên với những bạn không rành thì trước mắt cứ làm theo đi đã, để dễ dàng theo dõi bài viết hơn.</p>
</div>
<div><a href="https://thienanblog.com/wp-content/uploads/2017/10/3.installing-reactjs.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-303" src="https://thienanblog.com/wp-content/uploads/2017/10/3.installing-reactjs.png" alt="" width="700" height="514" srcset="https://thienanblog.com/wp-content/uploads/2017/10/3.installing-reactjs.png 1010w, https://thienanblog.com/wp-content/uploads/2017/10/3.installing-reactjs-300x220.png 300w, https://thienanblog.com/wp-content/uploads/2017/10/3.installing-reactjs-768x564.png 768w" sizes="auto, (max-width: 700px) 100vw, 700px" /></a></div>
<div></div>
<div></div>
<div>Quá trình cài đặt hoàn tất, các bạn cũng sẽ thấy ứng dụng trả về cho chúng ta cách thức để khởi chạy ReactJS như sau:</div>
<div></div>
<div></div>
<div><a href="https://thienanblog.com/wp-content/uploads/2017/10/4.install-done.png"><img loading="lazy" decoding="async" class="size-full wp-image-304 aligncenter" src="https://thienanblog.com/wp-content/uploads/2017/10/4.install-done.png" alt="" width="704" height="463" srcset="https://thienanblog.com/wp-content/uploads/2017/10/4.install-done.png 704w, https://thienanblog.com/wp-content/uploads/2017/10/4.install-done-300x197.png 300w" sizes="auto, (max-width: 704px) 100vw, 704px" /></a></div>
<div>
<div></div>
<div>Tôi sẽ giải thích cho các bạn các cú pháp họ đã đính kèm cho chúng ta:</div>
<ul>
<li><span class="lang:default decode:true crayon-inline">npm start</span>  : tiến hành khởi tạo Server phát triển để chạy ReactJS trên môi trường Web của NodeJS.</li>
<li><span class="lang:default decode:true crayon-inline">npm run build</span>  : tiến hành xây dựng sản phẩm sau khi hoàn tất giai đoạn phát triển, bao gồm sẽ copy các file tĩnh đi kèm khi các bạn bỏ vào đúng thư mục chỉ định (Các bạn có thể xem chi tiết ở 1 bài viết khác trong Blog này).</li>
<li><span class="lang:default decode:true crayon-inline">npm test</span>  : tiến hành kiểm thử ứng dụng (Dành cho các bạn biết qua về thư viện Tester).</li>
<li><span class="lang:default decode:true crayon-inline">npm run eject</span>  : khi các bạn chạy lệnh này, tool này sẽ không còn tự động hóa mọi vấn đề khi phát triển nữa mà nó sẽ bung ra toàn bộ các config để những bạn nào am hiểu về Webpack hay Babel&#8230; có thể config lại theo ý đồ của mình (Không khuyến khích các bạn không rành). <strong>Nên nhớ, một khi đã chạy mà quên backup thì &#8220;toi&#8221; luôn nhé.</strong></li>
</ul>
<p>Như vậy ở bên trên các bạn cũng đã tìm hiểu qua 1 số lệnh cơ bản của ReactJS rồi, giờ thì chạy thôi nào:</p>
<pre class="lang:default decode:true ">cd thienanblog
npm start</pre>
</div>
<p><a href="https://thienanblog.com/wp-content/uploads/2017/10/5.run-reactjs.png"><img loading="lazy" decoding="async" class="wp-image-305 aligncenter" src="https://thienanblog.com/wp-content/uploads/2017/10/5.run-reactjs.png" alt="" width="700" height="514" srcset="https://thienanblog.com/wp-content/uploads/2017/10/5.run-reactjs.png 1010w, https://thienanblog.com/wp-content/uploads/2017/10/5.run-reactjs-300x220.png 300w, https://thienanblog.com/wp-content/uploads/2017/10/5.run-reactjs-768x564.png 768w" sizes="auto, (max-width: 700px) 100vw, 700px" /></a></p>
<p>&nbsp;</p>
<p>Một cửa sổ sẽ hiện lên và các bạn thấy ReactJS đã chạy rồi đấy:</p>
<p>&nbsp;</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2017/10/6.reactjs-on-browser.png"><img loading="lazy" decoding="async" class="wp-image-306 aligncenter" src="https://thienanblog.com/wp-content/uploads/2017/10/6.reactjs-on-browser.png" alt="" width="700" height="589" srcset="https://thienanblog.com/wp-content/uploads/2017/10/6.reactjs-on-browser.png 1218w, https://thienanblog.com/wp-content/uploads/2017/10/6.reactjs-on-browser-300x252.png 300w, https://thienanblog.com/wp-content/uploads/2017/10/6.reactjs-on-browser-768x646.png 768w, https://thienanblog.com/wp-content/uploads/2017/10/6.reactjs-on-browser-1024x861.png 1024w" sizes="auto, (max-width: 700px) 100vw, 700px" /></a></p>
<p>&nbsp;</p>
<p>Xong như vậy là chúng ta đã hoàn tất cách cài đặt ReactJS. Chuyển sang tinh chỉnh một số File nào. Bạn hãy vào trong thư mục <span class="lang:default decode:true crayon-inline ">src</span>  và tìm file <span class="lang:default decode:true crayon-inline">App.js</span>  như hình:</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-307" src="https://thienanblog.com/wp-content/uploads/2017/10/7.reactjs-app-js.png" alt="" width="700" height="527" srcset="https://thienanblog.com/wp-content/uploads/2017/10/7.reactjs-app-js.png 1010w, https://thienanblog.com/wp-content/uploads/2017/10/7.reactjs-app-js-300x226.png 300w, https://thienanblog.com/wp-content/uploads/2017/10/7.reactjs-app-js-768x579.png 768w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p>&nbsp;</p>
<p>Sau đó tinh chỉnh lại như sau và save lại:</p>
<p>&nbsp;</p>
<pre class="lang:js decode:true ">/// ...
class App extends Component {
  render() {
    return (
      &lt;div className="App"&gt;
        &lt;header className="App-header"&gt;
          &lt;img src={logo} className="App-logo" alt="logo" /&gt;
          &lt;h1 className="App-title"&gt;Chào mừng tới React tại Thienanblog&lt;/h1&gt;
        &lt;/header&gt;
        &lt;p className="App-intro"&gt;
          &lt;ThienanBlog /&gt;
        &lt;/p&gt;
      &lt;/div&gt;
    );
  }
}
/// ...</pre>
<p>Lập tức màn hình Browser sẽ tự động Reload lại mà không cần bạn phải F5. Đó chính là do NodeJS vẫn đang chạy, nên vì thế nó sẽ nhận biết được khi nào các bạn thay đổi nội dung trong file.</p>
<h3>Viết Component đơn giản</h3>
<p>Tiếp tục, chúng ta sẽ viết ngay 1 Component đơn giản nhất trong ReactJS bằng cách gõ vào đoạn Code sau:</p>
<pre class="lang:js decode:true ">function ThienanBlog() {
  return (
    &lt;div&gt;Thienanblog xin chào các bạn độc giả&lt;/div&gt;
  );
}</pre>
<p>Đoạn code trên chắc chắn sẽ có rất nhiều bạn thấy dòng code &#8220;quái lạ&#8221;&#8230; làm thế nào mà có HTML gì đó ở trong đây vậy? Đó chính là JSX đấy các bạn ạ và nó là gì thì từ từ rồi chúng ta sẽ biết, đừng vội nản các bạn nhé. Và nội dung file <span class="lang:default decode:true crayon-inline ">App.js</span>  sẽ như sau:</p>
<pre class="lang:js decode:true ">import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
function ThienanBlog() {
  return (
    &lt;div&gt;Thienanblog xin chào các bạn độc giả&lt;/div&gt;
  );
}
class App extends Component {
  render() {
    return (
      &lt;div className="App"&gt;
        &lt;header className="App-header"&gt;
          &lt;img src={logo} className="App-logo" alt="logo" /&gt;
          &lt;h1 className="App-title"&gt;Chào mừng tới React tại Thienanblog&lt;/h1&gt;
        &lt;/header&gt;
        &lt;p className="App-intro"&gt;
          &lt;ThienanBlog /&gt;
        &lt;/p&gt;
      &lt;/div&gt;
    );
  }
}
export default App;</pre>
<p>&nbsp;</p>
<p>Sau đó, các bạn save lại và xem lại kết quả của chúng ta:</p>
<p>&nbsp;</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2017/10/8-reactjs-app-done.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-308" src="https://thienanblog.com/wp-content/uploads/2017/10/8-reactjs-app-done.png" alt="" width="700" height="589" srcset="https://thienanblog.com/wp-content/uploads/2017/10/8-reactjs-app-done.png 1218w, https://thienanblog.com/wp-content/uploads/2017/10/8-reactjs-app-done-300x252.png 300w, https://thienanblog.com/wp-content/uploads/2017/10/8-reactjs-app-done-768x646.png 768w, https://thienanblog.com/wp-content/uploads/2017/10/8-reactjs-app-done-1024x861.png 1024w" sizes="auto, (max-width: 700px) 100vw, 700px" /></a></p>
<h3>Lời kết</h3>
<div>Như vậy, chúng ta đã tìm hiểu ReactJS và cách cài đặt như thế nào, cũng như đã tự viết ra 1 Component đầu tiên cho mình. Hãy theo từng bước và thử lại nhiều lần ở các vấn đề mà bạn khó hiểu, vì sắp tới chúng ta còn phải tìm hiểu tiếp về Component và JSX các bạn nhé.</div>
<p>The post <a href="https://thienanblog.com/javascript/reactjs/tim-hieu-reactjs/">Tìm hiểu ReactJS và hướng dẫn cài đặt</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/javascript/reactjs/tim-hieu-reactjs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tìm hiểu Array Object trong JavaScript</title>
		<link>https://thienanblog.com/javascript/javascript-co-ban/tim-hieu-array-object-trong-javascript/</link>
					<comments>https://thienanblog.com/javascript/javascript-co-ban/tim-hieu-array-object-trong-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Sat, 07 Oct 2017 06:46:49 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Javascript cơ bản]]></category>
		<category><![CDATA[array object es6]]></category>
		<category><![CDATA[Array Object Javascript]]></category>
		<category><![CDATA[Array Object là gì]]></category>
		<category><![CDATA[cách sử dụng array object]]></category>
		<category><![CDATA[mảng chứa các đối tượng]]></category>
		<category><![CDATA[mảng đối tượng]]></category>
		<category><![CDATA[tại sao nên sử dụng array object]]></category>
		<category><![CDATA[Tìm hiểu về Array Object]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=291</guid>

					<description><![CDATA[<p>Array Object là một mảng chứa các phần tử, cho phép truy xuất các phương thức của Object bên trong nó để đáp ứng các nhu cầu xử lý dữ&#8230;</p>
<p>The post <a href="https://thienanblog.com/javascript/javascript-co-ban/tim-hieu-array-object-trong-javascript/">Tìm hiểu Array Object trong JavaScript</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div><a href="https://thienanblog.com/wp-content/uploads/2017/10/array-object.png"><img loading="lazy" decoding="async" class=" wp-image-295 aligncenter" src="https://thienanblog.com/wp-content/uploads/2017/10/array-object.png" alt="array-object" width="493" height="404" srcset="https://thienanblog.com/wp-content/uploads/2017/10/array-object.png 638w, https://thienanblog.com/wp-content/uploads/2017/10/array-object-300x246.png 300w" sizes="auto, (max-width: 493px) 100vw, 493px" /></a></div>
<div>Array Object là một mảng chứa các phần tử, cho phép truy xuất các phương thức của Object bên trong nó để đáp ứng các nhu cầu xử lý dữ liệu khác nhau khi mà Array chỉ có tác dụng duy nhất là lấy phần tử trong nó ra. Trong bài này, chúng ta cùng tìm hiểu Array Object nhé.</div>
<div></div>
<p><span id="more-291"></span></p>
<h3>Tại sao nên sử dụng Array Object ?</h3>
<div>Có rất nhiều lý do để có thể sử dụng Array Object mà tôi không thể liệt kê hết được cho các bạn, nhưng ở đây tôi sẽ tóm tắt một cách vắn tắt cho các bạn:</div>
<ul>
<li>Bạn có nhu cầu thể hiện dữ liệu trong mảng bằng nhiều cách khác nhau.</li>
<li>Bạn có nhu cầu thể hiện kiểu dữ liệu của Object chứa bên trong mảng.</li>
<li>Bạn có nhu cầu thể hiện gợi ý các phương thức trong Visual Studio Code hoặc JavaScript IDE bất kỳ, rất phù hợp khi sử dụng trong TypeScript hay Babel.</li>
<li>Bạn có nhu cầu thể hiện kỹ năng viết Code của mình trước các nhà tuyển dụng hoặc các thành viên trong Team.</li>
</ul>
<h3>Mặt hạn chế của Array Object</h3>
<div>Tiếp theo sau những lợi ích của Array Object thì cũng tồn tại một số nhược điểm khi sử dụng nó:</div>
<ul>
<li>Làm chậm ứng dụng của bạn so với việc sử dụng Array thông thường.</li>
<li>Chỉ hữu ích khi bạn sử dụng một mảng dữ liệu nhưng ở nhiều mục đích khác nhau.</li>
<li>Bạn cần có kiến thức nhất định về Lập trình hướng đối tượng để sử dụng thành thạo.</li>
</ul>
<h3>Một số ví dụ khi sử dụng Array Object</h3>
<div><p class='codepen'  data-height='365' data-theme-id='0' data-slug-hash='mBXKMP' data-default-tab='js,result' data-animations='run' data-editable='' data-embed-version='2'>
See the Pen Array Object trong JavaScript by An Vu (@thienanblog) on CodePen.</p>
</div>
<div>Chuyển ví dụ trên theo chuẩn JavaScript ES6 (Xem thêm <a href="https://thienanblog.com/javascript/cu-phap-es6-es2015-trong-javascript/" target="_blank" rel="noopener">Tìm hiểu về một số cú pháp ES6 trong JavaScript</a>).</div>
<div><p class='codepen'  data-height='365' data-theme-id='0' data-slug-hash='zERaPe' data-default-tab='js,result' data-animations='run' data-editable='' data-embed-version='2'>
See the Pen Array Object trong JavaScript ES6 by An Vu (@thienanblog) on CodePen.</p>
</div>
<h3>Lời kết</h3>
<div>Mong rằng qua ví dụ trên, các bạn đã có thể hiểu thêm về Array Object trong JavaScript. Thật sự mà nói, Array Object không có gì là mới cả nếu như các bạn đã từng biết qua về JSON hoặc chính JavaScript này là tập hợp của các Array Object (Object <span class="lang:default decode:true crayon-inline ">window</span>  là một ví dụ). Thay vì JSON trả về cho các bạn chỉ là chuỗi và sau đó được <span class="lang:default decode:true crayon-inline ">JSON.parse(&#8230;)</span>  thành 1 Array Object và bạn có thể truy xuất tới các thuộc tính chứa dữ liệu của nó, thì nay nó chỉ khác là chúng ta bổ sung thêm các phương thức cho 1 Object bên trong Array để sử dụng nó cho nhiều mục đích khác nhau theo nhu cầu của mình.</div>
<p>The post <a href="https://thienanblog.com/javascript/javascript-co-ban/tim-hieu-array-object-trong-javascript/">Tìm hiểu Array Object trong JavaScript</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/javascript/javascript-co-ban/tim-hieu-array-object-trong-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sự khác biệt giữa Arrow Function và Function thông thường</title>
		<link>https://thienanblog.com/javascript/javascript-co-ban/su-khac-biet-giua-arrow-function-va-function-thong-thuong/</link>
					<comments>https://thienanblog.com/javascript/javascript-co-ban/su-khac-biet-giua-arrow-function-va-function-thong-thuong/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Sun, 03 Sep 2017 13:42:26 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Javascript cơ bản]]></category>
		<category><![CDATA[anonymous function và arrow function]]></category>
		<category><![CDATA[arrow function là gì]]></category>
		<category><![CDATA[arrow function trong es6]]></category>
		<category><![CDATA[Arrow Function và Function có giống nhau không]]></category>
		<category><![CDATA[cách sử dụng Arrow Function]]></category>
		<category><![CDATA[function và arrow function]]></category>
		<category><![CDATA[sự khác biệt giữa Arrow Function]]></category>
		<category><![CDATA[sự khác nhau giữa Arrow Function]]></category>
		<category><![CDATA[sự khác nhau giữa Arrow Function và Function]]></category>
		<category><![CDATA[tìm hiểu arrow function]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=283</guid>

					<description><![CDATA[<p>Sơ lược về bài viết Ở bài viết trước, chúng ta đã xem qua Tìm hiểu về một số cú pháp ES6 trong JavaScript . Trong bài viết này, chúng ta sẽ&#8230;</p>
<p>The post <a href="https://thienanblog.com/javascript/javascript-co-ban/su-khac-biet-giua-arrow-function-va-function-thong-thuong/">Sự khác biệt giữa Arrow Function và Function thông thường</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://thienanblog.com/wp-content/uploads/2017/09/arrow-funcs.png"><img loading="lazy" decoding="async" class="wp-image-284 aligncenter" src="https://thienanblog.com/wp-content/uploads/2017/09/arrow-funcs.png" alt="" width="407" height="226" srcset="https://thienanblog.com/wp-content/uploads/2017/09/arrow-funcs.png 1080w, https://thienanblog.com/wp-content/uploads/2017/09/arrow-funcs-300x167.png 300w, https://thienanblog.com/wp-content/uploads/2017/09/arrow-funcs-768x427.png 768w, https://thienanblog.com/wp-content/uploads/2017/09/arrow-funcs-1024x569.png 1024w" sizes="auto, (max-width: 407px) 100vw, 407px" /></a></p>
<h3>Sơ lược về bài viết</h3>
<div>Ở bài viết trước, chúng ta đã xem qua <a href="https://thienanblog.com/javascript/cu-phap-es6-es2015-trong-javascript/">Tìm hiểu về một số cú pháp ES6 trong JavaScript</a> . Trong bài viết này, chúng ta sẽ tìm hiểu về sự khác biệt giữa Arrow Function và Function thông thường khi sử dụng trên thực tế. Tuy <a href="https://thienanblog.com/javascript/cu-phap-es6-es2015-trong-javascript/">Arrow Function</a> và Function phần giống nhau về cách định nghĩa 1 hàm nhưng tham chiếu đến bối cảnh (<strong>context</strong>) hay môi trường xung quanh nó sẽ khác. Vậy tham chiếu đến bối cảnh hay môi trường xung quanh là như thế nào? Chúng ta sẽ cùng bắt đầu tìm hiểu.</div>
<div></div>
<p><span id="more-283"></span></p>
<p>Các chủ đề mà chúng ta sẽ tìm hiểu như sau:</p>
<ol>
<li>Ví dụ cơ bản về bối cảnh (<strong>context</strong>)</li>
<li>Ví dụ bối cảnh khi dùng trong setTimeout kết hợp với jQuery</li>
<li>Một ví dụ khác khi kết hợp Arrow Function với Animation của jQuery</li>
<li>Arrow Function thường được dùng trên Class (ES6)</li>
</ol>
<h3>Ví dụ cơ bản về bối cảnh (<strong>context</strong>)</h3>
<div>Vậy bối cảnh ở đây là gì? Thật khó để định nghĩa cho các bạn chính xác được nghĩa của nó ở ngữ cảnh tiếng Việt. Vì thế các bạn chỉ cần hiểu đơn giản là từ khóa <span class="lang:default decode:true crayon-inline">this</span> được sử dụng trong Function thông thường và Arrow Function sẽ tham chiếu đến những môi trường hay bối cảnh khác nhau. Để tránh khó hiểu thêm, các bạn hãy xem qua ví dụ bên dưới:</div>
<div><p class='codepen'  data-height='265' data-theme-id='0' data-slug-hash='dzrMag' data-default-tab='js,result' data-animations='run' data-editable='' data-embed-version='2'>
See the Pen Sự khác nhau giữa Function thông thường và Arrow Function by An Vu (@thienanblog) on CodePen.</p>
</div>
<div>
<div>Ở ví dụ này các bạn cũng đã thấy từ khóa <span class="lang:default decode:true crayon-inline">this</span> của chúng ta có giá trị khác biệt, <span class="lang:default decode:true crayon-inline ">this</span> ở function thường sẽ tham chiếu đến chính Object chứa nó, còn Arrow Function sẽ tham chiếu đến cha gần nhất của nó nên vì thế nó hiểu từ khóa <span class="lang:default decode:true crayon-inline">this</span> của function cha bao hàm nó.</div>
<div></div>
<div>Và khi các bạn có dùng thêm <span class="lang:default decode:true crayon-inline ">use strict</span> để ràng buộc chặt chẽ hơn về <a href="https://thienanblog.com/javascript/javascript-co-ban/bai-2-pham-vi-hoat-dong-cua-bien-trong-javascript/">phạm vi hoạt động của biến</a> thì <span class="lang:default decode:true crayon-inline ">this</span>  trong Arrow Function có giá trị sẽ là <span class="lang:default decode:true crayon-inline ">undefined</span> thay vì trả về cho các bạn đối tượng <span class="lang:default decode:true crayon-inline">window</span>. Nên các bạn hãy chú ý điều này.</div>
</div>
<h3>Ví dụ bối cảnh khi dùng trong setTimeout kết hợp với jQuery</h3>
<p class='codepen'  data-height='265' data-theme-id='0' data-slug-hash='RZdRrX' data-default-tab='js,result' data-animations='run' data-editable='' data-embed-version='2'>
See the Pen Bối cảnh khi dùng trong setTimeout kết hợp với jQuery của Arrow Function by An Vu (@thienanblog) on CodePen.</p>

<div>
<div>Như các bạn cũng thấy rằng ở <a href="https://thienanblog.com/javascript/javascript-co-ban/bai-6-anonymous-function-va-closure/">Anonymous Function</a>, chúng ta phải lưu tạm <span class="lang:default decode:true crayon-inline">this</span> của phương thức click vào biến <span class="lang:default decode:true crayon-inline">btn</span> để có thể truyền vào bên trong setTimeout. Trong đó, từ khóa <span class="lang:default decode:true crayon-inline ">this</span> ở đối số của setTimeout được tham chiếu đến chính Anonymous Function của nó. Vì vậy, nó sẽ không hiểu <span class="lang:default decode:true crayon-inline ">this</span> ở đây có ý nghĩa là btn chứ không phải là Anonymous Function đang được dùng.</div>
<div></div>
<div>Và khi các bạn dùng Arrow Function, chúng ta đã đơn giản hóa đi 1 bước khi dùng, giúp cho code của chúng ta dễ hiểu hơn là <span class="lang:default decode:true crayon-inline ">this</span> này được tham chiếu đến chính Anonymous Function của phương thức click của jQuery chứ không phải chính nó nữa.</div>
</div>
<div></div>
<h3>Một ví dụ khác khi kết hợp Arrow Function với Animation của jQuery</h3>
<p class='codepen'  data-height='265' data-theme-id='0' data-slug-hash='QMoNoN' data-default-tab='js,result' data-animations='run' data-editable='' data-embed-version='2'>
See the Pen Một ví dụ khác khi kết hợp Arrow Function với Animation của jQuery by An Vu (@thienanblog) on CodePen.</p>

<p>Tương tự với ví dụ ở trên, trong ví dụ này tôi chủ yếu muốn cho các bạn thêm một số kinh nghiệm khi sử dụng trên thực tế như thế nào.</p>
<h3>Arrow Function thường được dùng trên Class</h3>
<div>Chuẩn ES6 cho phép chúng ta có thể viết class giống như những ngôn ngữ khác mà các bạn có thể đã từng biết qua, nếu chưa biết thì bây giờ các bạn biết, không sao cả. Tuy nhiên, class trong Javascript có những quy ước và cách khởi tạo thuộc tính khác biệt so với các ngôn ngữ từng được biết. Thông qua ví dụ này, phần nào các bạn cũng sẽ thích thú viết class hơn là viết function thông thường.</div>
<div><p class='codepen'  data-height='265' data-theme-id='0' data-slug-hash='gxEryV' data-default-tab='js,result' data-animations='run' data-editable='' data-embed-version='2'>
See the Pen Arrow Function trên Class by An Vu (@thienanblog) on CodePen.</p>
</div>
<div>
<div>Khi chạy ví dụ này, các bạn cũng sẽ thấy rằng việc chúng ta sử dụng Function thông thường trên Class sẽ khiến từ khóa <span class="lang:default decode:true crayon-inline ">this</span> của chúng ta có giá trị <span class="lang:default decode:true crayon-inline">undefined</span> ngay. Nên Arrow Function cũng thường rất được dùng trên Class thay vì Function thông thường. Chỉ là thường dùng thôi nhé, vì một số trường hợp chúng ta vẫn phải sử dụng Function thông thường để tham chiếu đến <span class="lang:default decode:true crayon-inline ">this</span> của chính nó. Thường là các callback được gọi từ các sự kiện của thư viện bên ngoài mà chúng ta sử dụng.</div>
<div></div>
<div>Nếu bạn vẫn còn hứng thú thì hãy xem qua sự kiện onSet trong thư viện <strong><a href="http://amsul.ca/pickadate.js/">Pickadate</a></strong> để hiểu rõ hơn tôi nói cái gì. Nếu như chúng ta dùng Arrow Function trong trường hợp đó thì chắc chắn sẽ nhận sai giá trị ngay. Vì vậy, hãy đón xem ở 1 bài viết khác về thư viện Pickadate này mà tôi sẽ viết sắp tới các bạn nhé.</div>
<div></div>
<div>Qua bài viết này, chúng ta cũng đã tìm hiểu xong sự khác biệt giữa Arrow Function và Function thông thường như thế nào rồi. Cám ơn các bạn đọc giả đã ủng hộ Website.</div>
</div>
<p>The post <a href="https://thienanblog.com/javascript/javascript-co-ban/su-khac-biet-giua-arrow-function-va-function-thong-thuong/">Sự khác biệt giữa Arrow Function và Function thông thường</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/javascript/javascript-co-ban/su-khac-biet-giua-arrow-function-va-function-thong-thuong/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tìm hiểu về một số cú pháp ES6 trong JavaScript</title>
		<link>https://thienanblog.com/javascript/javascript-co-ban/cu-phap-es6-es2015-trong-javascript/</link>
					<comments>https://thienanblog.com/javascript/javascript-co-ban/cu-phap-es6-es2015-trong-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Thu, 31 Aug 2017 19:10:27 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Javascript cơ bản]]></category>
		<category><![CDATA[arrow function là gì]]></category>
		<category><![CDATA[const trong javascript]]></category>
		<category><![CDATA[cú pháp es2015]]></category>
		<category><![CDATA[cú pháp es6]]></category>
		<category><![CDATA[es2015 là gì]]></category>
		<category><![CDATA[es6 là gì]]></category>
		<category><![CDATA[hằng số trong javascript]]></category>
		<category><![CDATA[let trong javascript]]></category>
		<category><![CDATA[let và const]]></category>
		<category><![CDATA[tìm hiểu về es6]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=270</guid>

					<description><![CDATA[<p>Giới thiệu Cú pháp ES6 hay còn được gọi là ES2015 đều là những chuẩn chung để nói về cú pháp mới trong JavaScript, kể cả sau này chúng ta&#8230;</p>
<p>The post <a href="https://thienanblog.com/javascript/javascript-co-ban/cu-phap-es6-es2015-trong-javascript/">Tìm hiểu về một số cú pháp ES6 trong JavaScript</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3><a href="https://thienanblog.com/wp-content/uploads/2017/08/a-bright-new-future-is-comming.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-271" src="https://thienanblog.com/wp-content/uploads/2017/08/a-bright-new-future-is-comming.jpg" alt="JS ES6" width="442" height="332" srcset="https://thienanblog.com/wp-content/uploads/2017/08/a-bright-new-future-is-comming.jpg 1024w, https://thienanblog.com/wp-content/uploads/2017/08/a-bright-new-future-is-comming-300x225.jpg 300w, https://thienanblog.com/wp-content/uploads/2017/08/a-bright-new-future-is-comming-768x576.jpg 768w" sizes="auto, (max-width: 442px) 100vw, 442px" /></a></h3>
<h3>Giới thiệu</h3>
<div>Cú pháp ES6 hay còn được gọi là ES2015 đều là những chuẩn chung để nói về cú pháp mới trong JavaScript, kể cả sau này chúng ta cũng có thể gặp ES7 (đã ra mắt 2016) và ES8 nữa không chừng. Ngoài những cú pháp mới hỗ trợ cho các lập trình viên tận răng sức mạnh từ JavaScript, các cú pháp cũ của chúng ta cũng sẽ được thay đổi và nâng cấp theo chuẩn mới. Giúp cho mã nguồn chúng ta dễ đọc và dễ quản lý hơn.</div>
<h3>Sơ lược về bài viết</h3>
<div>
<div>Trong bài viết này chúng ta sẽ tìm hiểu qua các chủ đề sau:</div>
<ol>
<li>Cú pháp khởi tạo biến (<strong>Variable</strong>) hoặc hằng số (<strong>Constant</strong>)</li>
<li>Tìm hiểu nội suy chuỗi (<strong>String Interpolation</strong>)</li>
<li>Tìm hiểu về các giá trị mặc định (<strong>Default Values</strong>) của các tham số (<strong>Parameters</strong>) trong hàm (<strong>Function</strong>)</li>
<li>Tìm hiểu về <strong>Arrow Function</strong> và <strong>cách viết tắt</strong> của <strong>Arrow Function</strong></li>
</ol>
</div>
<div>
<h3>Cú pháp khởi tạo biến hoặc hằng số</h3>
<div>Trong cú pháp ES6, các bạn có thể dùng từ khóa <span class="lang:default decode:true crayon-inline ">let</span>và <span class="lang:default decode:true crayon-inline">const</span> để định nghĩa 1 biến hay hằng số. Những vấn đề này có lẽ các bạn đã từng khá quen thuộc nếu như đã từng học qua lập trình ở các ngôn ngữ khác rồi.</div>
<div>
<div>
<pre class="lang:js decode:true">// Cú pháp khởi tạo biến và hằng số
let numVar = 1;
let stringVar = 'Hello World!!!';
// numVar += 1; ==&gt; numVar === 2

const numConst = 1;
const stringConst = 'Hello World!!!';
// numConst += 1; ==&gt; error</pre>
</div>
<div>Ở đoạn code trên cho các bạn thấy rằng, cách thức sử dụng <span class="lang:default decode:true crayon-inline ">let</span>  hoàn toàn không khác gì so với cách chúng ta sử dụng <span class="lang:default decode:true crayon-inline">var</span>  cả. Vì thế các bạn nên sử dụng <span class="lang:default decode:true crayon-inline ">let</span>  thay vì <span class="lang:default decode:true crayon-inline ">var</span>  trong mã nguồn để tránh gặp lại các lỗi xưa kia mà Javascript từng bị mắc phải và đã được thay thế ở cú pháp mới.</div>
</div>
</div>
<div>
<h3>Nội suy chuỗi</h3>
<div>Trước đây để có thể nối các chuỗi ở các biến lại với nhau, ta thường dùng phép cộng (<span class="lang:default decode:true crayon-inline ">+</span> ) để cộng các vế lại sẽ ra được 1 chuỗi hoàn chỉnh. Thì với cú pháp ES6 này, việc sử dụng biến hoặc hằng số trực tiếp trong chuỗi giúp đơn giản hóa việc chúng ta gõ và code nhìn cũng sạch sẽ hơn rất nhiều.</div>
<div>
<pre class="lang:js decode:true">// Nội suy chuỗi (String Interpolation)
let stringVar = 'Hello World!!!';
console.log(`Nội suy chuỗi: ${stringVar}`); // ==&gt; "Nội suy chuỗi: Hello World!!!"

function stringInterpolation() {
  return 'stringInterpolation đã được gọi!!!';
}
console.log(`Nội suy chuỗi: ${stringInterpolation()}`);</pre>
</div>
<div>Các bạn thấy đấy để có thể nội suy một biến nào đó bên trong rất là dễ dàng đúng không? Javascript sẽ tự hiểu và thay thế hoặc gọi lại hàm mà bạn muốn bên trong dấu hiệu <span class="lang:default decode:true crayon-inline ">${}</span>này.</div>
</div>
<div>
<h3>Tìm hiểu về các giá trị mặc định của các tham số trong hàm</h3>
<div>Trước đây, để các bạn có thể định nghĩa được các tham số mặc định khi truyền vào thì cách truyền thống sẽ như thế này:</div>
<div>
<pre class="lang:js decode:true">function originalDefaultValues(a, b) {
     a = a || 1; // Nếu có giá trị và không rỗng hoặc sai(false) thì set là a, nếu không sẽ là 1
     b = b || 2; // Tương tự như trên
}</pre>
</div>
<div>
<p>Và với cú pháp mới, Javascript đã cho phép chúng ta viết dễ dàng hơn hẳn:</p>
<pre class="lang:js decode:true">// Các giá trị mặc định của các tham số trong Function
function defaultParams(a = 1, b = 2) {
  console.log(`Giá trị mặc định: ${a} - ${b}`);
}
defaultParams();</pre>
<h3>Tìm hiểu về Arrow Function và cách viết tắt của Arrow Function</h3>
<div>Arrow Function hay còn gọi là hàm mũi tên, nhưng mà tốt nhất thì các bạn đừng dịch ra vì nghe nó rất &#8220;củ chuối&#8221;. Nó thừa hưởng cách viết ngắn gọn bằng cú pháp ES6 nhưng bên trong nó sẽ có nhiều điểm khác biệt so với hàm thông thường mà chúng ta được biết.</div>
<div>
<pre class="lang:js decode:true">// Function thông thường
function regularFunc() {
  this.hello = 'Hello Regular Function';
  console.log('regularFunc: ' + this.hello);
}
regularFunc();

// Anonymous Function
let anonymousFunc = function() {
  this.hello = 'Hello Anonymous Function';
  console.log('anonymousFunc: ' + this.hello);
}
anonymousFunc();

// Arrow Function
let arrowFunc = () =&gt; {
  // this ở đây sẽ không hiểu nếu bạn dùng 'use strict' ở Javascript hoặc khi dùng Babel
  this.hello = 'Hello Arrow Function';
  console.log('arrowFunc: ' + this.hello);
}
arrowFunc();

// Một số cách viết tắt trong Arrow Function
let full = (a = 1 , b = 2) =&gt; {
  return a + b;
}
full(); // full === 3
let one = a =&gt; a; one(5); // one === 5
let two = (a, b) =&gt; a + b; two(1, 2) // two === 3</pre>
</div>
<div>Qua đoạn code trên thì các bạn cũng sẽ được thấy 2 cách thông dụng nhất từ trước đến nay là Function thông thường và cách sử dụng <a href="https://thienanblog.com/javascript/javascript-co-ban/bai-6-anonymous-function-va-closure/">Anonymous Function</a> (Hàm vô danh &#8211; một cách khởi tạo hàm khác của hàm thông thường) để khởi tạo hàm thì nay chúng ta sẽ tạo hàm bằng cú pháp gần như tương đương với 2 cách trên.</div>
<div></div>
<div>
<div>
<div>
<div>Ngoài ra, các bạn còn được hỗ trợ thêm cho việc &#8220;lười biếng&#8221; với các cách viết tắt không kém phần khó hiểu khi sử dụng ban đầu. Vậy đâu là sự khác biệt giữa Function thông thường và Arrow Function ??? Mời đọc giả hãy đón xem ở các bài viết sau.</div>
</div>
</div>
</div>
</div>
<h3>Source tham khảo</h3>
<div><p class='codepen'  data-height='300' data-theme-id='0' data-slug-hash='dzaBNB' data-default-tab='js,result' data-animations='run' data-editable='' data-embed-version='2'>

See the Pen Tìm hiểu cú pháp ES6 by Ân Vũ (@thienanblog) on CodePen
</p>
</div>
</div>
<div></div>
<p>The post <a href="https://thienanblog.com/javascript/javascript-co-ban/cu-phap-es6-es2015-trong-javascript/">Tìm hiểu về một số cú pháp ES6 trong JavaScript</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/javascript/javascript-co-ban/cu-phap-es6-es2015-trong-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Phóng to hình ảnh với jQuery EasyZoom</title>
		<link>https://thienanblog.com/javascript/jquery/phong-to-hinh-anh-voi-jquery-easyzoom/</link>
					<comments>https://thienanblog.com/javascript/jquery/phong-to-hinh-anh-voi-jquery-easyzoom/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Tue, 07 Jul 2015 05:35:36 +0000</pubDate>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[cách sử dụng jquery easyzoom]]></category>
		<category><![CDATA[hướng dẫn easyzoom]]></category>
		<category><![CDATA[hướng dẫn phóng to hình ảnh js]]></category>
		<category><![CDATA[jQuery EasyZoom là gì]]></category>
		<category><![CDATA[phóng lớn hình ảnh js]]></category>
		<category><![CDATA[phóng to hình ảnh js]]></category>
		<category><![CDATA[plugin zoom hình ảnh]]></category>
		<category><![CDATA[sử dụng jquery zoom]]></category>
		<category><![CDATA[sử dụng js zoom hình]]></category>
		<category><![CDATA[Zoom hình ảnh js]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=166</guid>

					<description><![CDATA[<p>Giới thiệu và cài đặt Tác giả: Alen Grakalic Website: http://i-like-robots.github.io/EasyZoom Plugin này được tạo ra để giúp chúng ta có thể hiển thị những hình ảnh cỡ lớn giúp&#8230;</p>
<p>The post <a href="https://thienanblog.com/javascript/jquery/phong-to-hinh-anh-voi-jquery-easyzoom/">Phóng to hình ảnh với jQuery EasyZoom</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Giới thiệu và cài đặt</h2>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/07/ny-zoom.jpg"><img loading="lazy" decoding="async" class=" wp-image-175 size-medium aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/07/ny-zoom-300x225.jpg" alt="Zoom hình ảnh" width="300" height="225" srcset="https://thienanblog.com/wp-content/uploads/2015/07/ny-zoom-300x225.jpg 300w, https://thienanblog.com/wp-content/uploads/2015/07/ny-zoom-1024x768.jpg 1024w, https://thienanblog.com/wp-content/uploads/2015/07/ny-zoom.jpg 1600w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Tác giả: Alen Grakalic</p>
<p>Website: <a href="http://i-like-robots.github.io/EasyZoom">http://i-like-robots.github.io/EasyZoom</a></p>
<p>Plugin này được tạo ra để giúp chúng ta có thể hiển thị những hình ảnh cỡ lớn giúp người dùng có thể xem rõ hình ảnh hơn. Nhất là ở những Website bán hàng, khi mà người dùng rất cần một hình ảnh chân thật, to và rõ ràng để họ có thể xem sản phẩm một cách tốt nhất trước khi quyết định mua.</p>
<p>Plugin này ra đời để giúp ta làm điều đó bằng cách tải hình ảnh lớn khi chúng ta rê chuột vào hình ảnh nhỏ, tạo cảm giác cho người xem như chúng ta đang dùng chức năng<strong> Zoom In</strong> (Phóng to) hình ảnh lên vậy.</p>
<p>Để có thể sử dụng Plugin các bạn cần theo các bước sau:</p>
<ol>
<li>Truy cập vào <a href="https://github.com/i-like-robots/EasyZoom/zipball/master">https://github.com/i-like-robots/EasyZoom/zipball/master</a> . Sau đó hãy tải file nén về và giải nén ra và chúng ta sẽ có cấu trúc thư mục như sau:</li>
</ol>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/07/1.-Cau-truc-thu-muc.png"><img loading="lazy" decoding="async" class=" size-full wp-image-167 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/07/1.-Cau-truc-thu-muc.png" alt="Cau truc thu muc" width="178" height="327" srcset="https://thienanblog.com/wp-content/uploads/2015/07/1.-Cau-truc-thu-muc.png 178w, https://thienanblog.com/wp-content/uploads/2015/07/1.-Cau-truc-thu-muc-163x300.png 163w" sizes="auto, (max-width: 178px) 100vw, 178px" /></a></p>
<p>&nbsp;</p>
<ol start="2">
<li>Các bạn hãy tìm 2 file cần thiết sau đây: <span class="lang:default highlight:0 decode:true  crayon-inline ">easyzoom.js</span> <strong> </strong>và <span class="lang:default highlight:0 decode:true  crayon-inline ">easyzoom.css</span> <strong>.</strong></li>
<li>Tiến hành thêm thư viện vào trong website của chúng ta, nhưng các bạn cũng cần phải tải thư viện jQuery tại <a href="http://jquery.com">http://jquery.com</a> về trước nhé:</li>
</ol>
<p>&nbsp;</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/07/2.-Them-thu-vien.png"><img loading="lazy" decoding="async" class=" size-full wp-image-168 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/07/2.-Them-thu-vien.png" alt="Them thu vien" width="505" height="48" srcset="https://thienanblog.com/wp-content/uploads/2015/07/2.-Them-thu-vien.png 505w, https://thienanblog.com/wp-content/uploads/2015/07/2.-Them-thu-vien-300x29.png 300w" sizes="auto, (max-width: 505px) 100vw, 505px" /></a></p>
<ol start="4">
<li>(Tùy chọn) Nếu như bạn không có sẵn hình ảnh để Demo Plugin này có thể Copy luôn thư mục <span class="lang:default highlight:0 decode:true  crayon-inline ">example-images</span>  bên trong để sử dụng.</li>
<li>Cài đặt hoàn tất</li>
</ol>
<h2>Sử dụng</h2>
<p>Để sử dụng Plugin này, các bạn cần phải làm chính xác những gì tôi hướng dẫn. Bởi vì, website của tác giả hướng dẫn rất sơ sài. Và chủ yếu nhờ vào cách sử dụng của tác giả và tôi hiểu ra cách sử dụng của nó.</p>
<h3><strong>Tính năng Overlay (Che Phủ)</strong></h3>
<p>Đầu tiên, các bạn cần chuẩn bị các hình ảnh ở những bước trước chúng ta đã làm, sau đó hãy tạo ra một file và bạn có thể tùy nghi đặt tên, ở đây tôi sẽ đặt là <span class="lang:default decode:true crayon-inline">overlay.html</span>  và có cấu trúc như sau:</p>
<pre class="lang:default decode:true ">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta charset="utf-8"&gt;
	&lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
	&lt;title&gt;EasyZoom - Thienanblog.com&lt;/title&gt;
	&lt;link rel="stylesheet" type="text/css" href="css/easyzoom.css"&gt;
	&lt;script type="text/javascript" src="js/jquery-1.11.3.min.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="js/easyzoom.js"&gt;&lt;/script&gt;
	&lt;style type="text/css"&gt;
	.wrap {
		width: 940px;
		margin: 0px auto;
		padding: 5px 15px;
	}
	&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div class="wrap"&gt;
		&lt;div class="easyzoom easyzoom--overlay ten-class-tu-dat"&gt;
			&lt;a href="img/2_zoom.jpg"&gt;
				&lt;!-- WIDTH | HEIGHT có thể ấn định bằng CSS thay vì HTML --&gt;
				&lt;img src="img/2_standard.jpg" alt="" width="500" height="400"&gt; 
			&lt;/a&gt;
		&lt;/div&gt;
	&lt;/div&gt;
	&lt;script type="text/javascript"&gt;
		// Instantiate EasyZoom instances
		var $easyzoom = $('.ten-class-tu-dat').easyZoom();
	&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Khi chạy ví dụ trên các bạn sẽ thấy như sau:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/07/3.-Overlay.png"><img loading="lazy" decoding="async" class=" size-full wp-image-169 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/07/3.-Overlay.png" alt="Overlay" width="1021" height="401" srcset="https://thienanblog.com/wp-content/uploads/2015/07/3.-Overlay.png 1021w, https://thienanblog.com/wp-content/uploads/2015/07/3.-Overlay-300x118.png 300w" sizes="auto, (max-width: 1021px) 100vw, 1021px" /></a></p>
<p>&nbsp;</p>
<p>Vậy do đâu Plugin này có thể chạy được, các bạn hãy chú ý các điểm sau:</p>
<ol>
<li><span class="lang:default decode:true  crayon-inline ">&lt;div class=&#8221;easyzoom easyzoom&#8211;overlay ten-class-tu-dat&#8221;&gt;</span>  : các tên lớp cần thiết để Plugin có thể chạy. Và trong đó bạn để ý <span class="lang:default decode:true  crayon-inline ">easyzoom—overlay</span> <strong> </strong>chính là tên tính năng sẽ chạy khi thiết lập.</li>
<li>Bên trong <span class="lang:default decode:true  crayon-inline ">&lt;div class=&#8221;easyzoom easyzoom&#8211;overlay ten-class-tu-dat&#8221;&gt;</span>  sẽ có cấu trúc như sau:</li>
</ol>
<pre class="lang:default decode:true ">&lt;a href="img/2_zoom.jpg"&gt;
	&lt;!-- WIDTH | HEIGHT có thể ấn định bằng CSS thay vì HTML --&gt;
	&lt;img src="img/2_standard.jpg" alt="" width="500" height="400"&gt; 
&lt;/a&gt;</pre>
<ol start="3">
<li><span class="lang:default decode:true  crayon-inline ">&lt;a href=&#8221;img/2_zoom.jpg&#8221;&gt;</span>  : chứa thẻ href chính là đường dẫn đến hình ảnh lớn của bạn.</li>
<li><span class="lang:default decode:true  crayon-inline">&lt;img src=&#8221;img/2_standard.jpg&#8221; alt=&#8221;&#8221; width=&#8221;500&#8243; height=&#8221;400&#8243;&gt;</span>  : Chứa hình ảnh nhỏ và hiển thị ra bên ngoài trước khi người dùng rê chuột vào. Các bạn lưu ý<strong> chiều rộng</strong> và <strong>chiều cao</strong> (Width &amp; Height), các bạn phải ấn định <strong>nhỏ hơn</strong> tấm hình lớn nhé và có thể tùy nghi chọn kích thước phù hợp với website của mình.</li>
<li>Đoạn mã trong cặp thẻ <span class="lang:default decode:true  crayon-inline ">&lt;script&gt;</span>  đơn giản chỉ như sau:</li>
</ol>
<pre class="lang:default decode:true">&lt;script type="text/javascript"&gt;
	// Instantiate EasyZoom instances
	var $easyzoom = $('.ten-class-tu-dat').easyZoom();
&lt;/script&gt;</pre>
<ol start="6">
<li>Như vậy là bạn đã hoàn tất việc chạy Ví dụ đầu tiên với tính năng &#8220;<strong>Overlay</strong>&#8221; rồi đấy.</li>
</ol>
<h3>Tính năng Ajacent (Liền kề)</h3>
<p>Các bạn có thể chuẩn bị cấu trúc HTML như sau và lưu tên file là <strong>ajacent.html</strong> :</p>
<pre class="lang:default decode:true ">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta charset="utf-8"&gt;
	&lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
	&lt;title&gt;EasyZoom - Thienanblog.com&lt;/title&gt;
	&lt;link rel="stylesheet" type="text/css" href="css/easyzoom.css"&gt;
	&lt;script type="text/javascript" src="js/jquery-1.11.3.min.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="js/easyzoom.js"&gt;&lt;/script&gt;
	&lt;style type="text/css"&gt;
	.wrap {
		width: 940px;
		margin: 0px auto;
		padding: 5px 15px;
	}
	&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div class="wrap"&gt;
		&lt;div class="easyzoom easyzoom--adjacent ten-class-tu-dat"&gt;
			&lt;a href="img/2_zoom.jpg"&gt;
				&lt;!-- WIDTH | HEIGHT có thể ấn định bằng CSS thay vì HTML --&gt;
				&lt;img src="img/2_standard.jpg" alt="" width="500" height="400"&gt; 
			&lt;/a&gt;
		&lt;/div&gt;
	&lt;/div&gt;
	&lt;script type="text/javascript"&gt;
		// Instantiate EasyZoom instances
		var $easyzoom = $('.ten-class-tu-dat').easyZoom();
	&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Khi chạy ví dụ trên các bạn sẽ thấy như sau:</p>
<p><img loading="lazy" decoding="async" class=" size-full wp-image-172 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/07/4.-Ajacent.png" alt="4. Ajacent" width="1033" height="416" srcset="https://thienanblog.com/wp-content/uploads/2015/07/4.-Ajacent.png 1033w, https://thienanblog.com/wp-content/uploads/2015/07/4.-Ajacent-300x121.png 300w, https://thienanblog.com/wp-content/uploads/2015/07/4.-Ajacent-1024x412.png 1024w" sizes="auto, (max-width: 1033px) 100vw, 1033px" /></p>
<p>Tính năng này giúp chúng ta khi rê chuột vô hình ảnh, thì đồng thời Plugin sẽ tạo ra một hình ảnh nữa nằm bên phải và có chiều dài và cao bằng với hình ảnh được rê chuột. Tính năng này các bạn thường thấy ở các Website bán hàng như Ebay.</p>
<p>Và trong ví dụ này, cách sử dụng cũng giống ở ví dụ trước ở tính năng “<strong>Overlay</strong>” chỉ khác duy nhất chính là tên class mà các bạn sử dụng là <span class="lang:default decode:true  crayon-inline ">&lt;div class=&#8221;easyzoom easyzoom&#8211;adjacent ten-class-tu-dat&#8221;&gt;</span>  và trong đó class <span class="lang:default decode:true  crayon-inline ">easyzoom—adjacent</span> <strong> </strong>đại diện cho tính năng “<strong>Ajacent</strong>”.</p>
<h3>Tính năng Thumbnail – Overlay (Hình thu nhỏ &#8211; Che Phủ)</h3>
<p>Tính năng này là sự kết hợp giữa thư viện hình ảnh (Gallery) nhờ vào các hình ảnh thu nhỏ kết hợp với tính năng “Overlay” để phóng to hình ảnh được chọn và rê chuột vào.</p>
<p>Các bạn cần chuẩn bị cấu trúc file <span class="lang:default highlight:0 decode:true  crayon-inline ">thumbnail-overlay.html</span>  như sau:</p>
<pre class="lang:default decode:true ">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta charset="utf-8"&gt;
	&lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
	&lt;title&gt;EasyZoom - Thienanblog.com&lt;/title&gt;
	&lt;link rel="stylesheet" type="text/css" href="css/easyzoom.css"&gt;
	&lt;script type="text/javascript" src="js/jquery-1.11.3.min.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="js/easyzoom.js"&gt;&lt;/script&gt;
	&lt;style type="text/css"&gt;
	.wrap {
		width: 940px;
		margin: 0px auto;
		padding: 5px 15px;
	}

	ul {
		list-style: none;
	}

	ul li {
		float:left;
		margin: 5px;
	}
	&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div class="wrap"&gt;
		&lt;div class="easyzoom easyzoom--overlay easyzoom--with-thumbnails ten-class-tu-dat"&gt;
			&lt;a href="img/3_zoom_1.jpg"&gt;
				&lt;!-- WIDTH | HEIGHT có thể ấn định bằng CSS thay vì HTML --&gt;
				&lt;img src="img/3_standard_1.jpg" alt="" width="640" height="360"&gt;
			&lt;/a&gt;
		&lt;/div&gt;
		&lt;ul class="thumbnails"&gt;
			&lt;li&gt;
				&lt;a href="img/3_zoom_1.jpg" data-standard="img/3_standard_1.jpg"&gt;
					&lt;img src="img/3_thumbnail_1.jpg" alt=""&gt;
				&lt;/a&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;a href="img/3_zoom_2.jpg" data-standard="img/3_standard_2.jpg"&gt;
					&lt;img src="img/3_thumbnail_2.jpg" alt=""&gt;
				&lt;/a&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;a href="img/3_zoom_3.jpg" data-standard="img/3_standard_3.jpg"&gt;
					&lt;img src="img/3_thumbnail_3.jpg" alt=""&gt;
				&lt;/a&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;a href="img/3_zoom_4.jpg" data-standard="img/3_standard_4.jpg"&gt;
					&lt;img src="img/3_thumbnail_4.jpg" alt=""&gt;
				&lt;/a&gt;
			&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/div&gt;
	&lt;script type="text/javascript"&gt;
		// Instantiate EasyZoom instances
		var $easyzoom = $('.ten-class-tu-dat').easyZoom();
		var api = $easyzoom.data('easyZoom');

		$('ul').on('click', 'a', function(event) {
			event.preventDefault();
			api.swap($(this).data('standard'), $(this).attr('href'));
		});
	&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Khi chạy ví dụ trên chúng ta sẽ được như sau:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/07/5.Thumbnail-Overlay.png"><img loading="lazy" decoding="async" class=" size-full wp-image-170 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/07/5.Thumbnail-Overlay.png" alt="5.Thumbnail - Overlay" width="1333" height="534" srcset="https://thienanblog.com/wp-content/uploads/2015/07/5.Thumbnail-Overlay.png 1333w, https://thienanblog.com/wp-content/uploads/2015/07/5.Thumbnail-Overlay-300x120.png 300w, https://thienanblog.com/wp-content/uploads/2015/07/5.Thumbnail-Overlay-1024x410.png 1024w" sizes="auto, (max-width: 1333px) 100vw, 1333px" /></a></p>
<p>&nbsp;</p>
<p>Rất đẹp mắt đúng không nào, chỉ khác ở các ví dụ một tí đó chính là chúng ta cần đến thẻ &lt;ul&gt; để hiển thị các hình ảnh nhỏ bên dưới để người dùng có thể chọn nó. Và đây chính là cấu trúc chung khi các bạn sử dụng Plugin này:</p>
<pre class="lang:default decode:true ">&lt;ul class="thumbnails"&gt;
	&lt;li&gt;
		&lt;a href="img/3_zoom_1.jpg" data-standard="img/3_standard_1.jpg"&gt;
			&lt;img src="img/3_thumbnail_1.jpg" alt=""&gt;
		&lt;/a&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;a href="img/3_zoom_2.jpg" data-standard="img/3_standard_2.jpg"&gt;
			&lt;img src="img/3_thumbnail_2.jpg" alt=""&gt;
		&lt;/a&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;a href="img/3_zoom_3.jpg" data-standard="img/3_standard_3.jpg"&gt;
			&lt;img src="img/3_thumbnail_3.jpg" alt=""&gt;
		&lt;/a&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;a href="img/3_zoom_4.jpg" data-standard="img/3_standard_4.jpg"&gt;
			&lt;img src="img/3_thumbnail_4.jpg" alt=""&gt;
		&lt;/a&gt;
	&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>Trong đó, <span class="lang:default decode:true  crayon-inline ">&lt;a href=&#8221;img/3_zoom_1.jpg&#8221; data-standard=&#8221;img/3_standard_1.jpg&#8221;&gt;</span>  có thuộc tính <span class="lang:default decode:true  crayon-inline">href</span> chính là đường dẫn đến <strong>hình ảnh phóng lớn</strong> và <span class="lang:default decode:true  crayon-inline ">data-standard</span>  là <strong>hình ảnh thu nhỏ</strong> ở phía dưới hình chính của chúng ta.</p>
<p>Và các bạn lại cần phải chú ý một điểm vẫn giống các ví dụ trước đó chính là thẻ <span class="lang:default decode:true  crayon-inline">&lt;div class=&#8221;easyzoom easyzoom&#8211;overlay easyzoom&#8211;with-thumbnails ten-class-tu-dat&#8221;&gt;</span>  đã có thêm 1 class mới chính là <span class="lang:default decode:true  crayon-inline ">easyzoom&#8211;with-thumbnails</span>  để giúp nó hiểu đây chính là <strong>thư viện hình ảnh</strong>.</p>
<p>Tuy nhiên, khác biệt lớn nhất chính là đoạn mã Javascript:</p>
<pre class="lang:default decode:true ">&lt;script type="text/javascript"&gt;
	// Instantiate EasyZoom instances
	var $easyzoom = $('.ten-class-tu-dat').easyZoom();
	var api = $easyzoom.data('easyZoom');

	$('ul').on('click', 'a', function(event) {
		event.preventDefault();
		api.swap($(this).data('standard'), $(this).attr('href'));
	});
&lt;/script&gt;</pre>
<p>Trong đó, <span class="lang:default decode:true  crayon-inline ">$easyzoom.data(&#8216;easyZoom&#8217;)</span> sẽ trả về cho chúng ta một <span class="lang:default highlight:0 decode:true  crayon-inline ">Object</span> chứa các phương thức để chúng ta có thể cấu hình Plugin này. Và mỗi khi sự kiện <span class="lang:default highlight:0 decode:true  crayon-inline ">click</span> lên tấm hình ở thư viện thì nó sẽ bị đoạn mã ngăn chặn không cho<strong> refresh lại trang</strong> thông qua phương thức <span class="lang:default decode:true  crayon-inline ">event.preventDefault()</span> . Và ở cách dùng <span class="lang:default decode:true  crayon-inline ">api.swap()</span>  thì các bạn có thể hiểu đơn giản tiếng anh nó đã có nghĩa là “<strong>hoán đổi</strong>”, và <strong>hoán đổi cái gì</strong>? Chính là đường dẫn hình ảnh trong <span class="lang:default highlight:0 decode:true  crayon-inline ">data-standard</span>  mà chúng ta truyền vào <span class="lang:default decode:true  crayon-inline ">href</span> trong thẻ <span class="lang:default decode:true  crayon-inline ">&lt;a&gt;</span>  của chúng ta. Giúp cho Plugin hiểu là hình ảnh mới đã được cấu hình các hình ảnh nhỏ và hình ảnh phóng to.</p>
<p>Và có một điều thú vị là khi các bạn thay đổi <span class="lang:default decode:true  crayon-inline">easyzoom easyzoom—overlay</span>  trong thẻ <span class="lang:default decode:true  crayon-inline ">&lt;div class=&#8221;easyzoom easyzoom&#8211;overlay easyzoom&#8211;with-thumbnails ten-class-tu-dat&#8221;&gt;</span>  các bạn sẽ lại có được luôn cả tính năng “<strong>Ajacent</strong>” mà chúng ta đã được thử qua trước đó.</p>
<h2>Tóm tắt các tính năng cơ bản trong jQuery EasyZoom</h2>
<table>
<tbody>
<tr>
<td width="162">Tên tính năng</td>
<td width="438">Class được sử dụng</td>
</tr>
<tr>
<td width="162">Overlay</td>
<td width="438">easyzoom easyzoom&#8211;overlay</td>
</tr>
<tr>
<td width="162">Ajacent</td>
<td width="438">easyzoom easyzoom&#8211;ajacent</td>
</tr>
<tr>
<td width="162">Thumbnail &#8211; Overlay</td>
<td width="438">easyzoom easyzoom&#8211;overlay easyzoom&#8211;with-thumbnails</td>
</tr>
<tr>
<td width="162">Thumbnail &#8211; Ajacent</td>
<td width="438">easyzoom easyzoom&#8211;ajacent  easyzoom&#8211;with-thumbnails</td>
</tr>
</tbody>
</table>
<p>Qua bài viết này, các bạn đã có thể sử dụng được các tính năng cơ bản nhất của Plugin rồi, ngoài ra các bạn cũng nên tham khảo thêm trong tài liệu của tác giả để có thể hiểu về Plugin này hơn nếu như có nhu cầu chuyên sâu và cao cấp hơn.</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/07/jQuery-EasyZoom.rar">Các bạn có thể tải toàn bộ Source tại đây</a></p>
<p>Xin cám ơn các độc giả đã đón xem bài viết này.</p>
<p>The post <a href="https://thienanblog.com/javascript/jquery/phong-to-hinh-anh-voi-jquery-easyzoom/">Phóng to hình ảnh với jQuery EasyZoom</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/javascript/jquery/phong-to-hinh-anh-voi-jquery-easyzoom/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hướng dẫn jQuery Ajax toàn tập</title>
		<link>https://thienanblog.com/javascript/jquery/huong-dan-jquery-ajax-toan-tap/</link>
					<comments>https://thienanblog.com/javascript/jquery/huong-dan-jquery-ajax-toan-tap/#respond</comments>
		
		<dc:creator><![CDATA[Ân Vũ]]></dc:creator>
		<pubDate>Sat, 27 Jun 2015 11:38:56 +0000</pubDate>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[ajax jquery]]></category>
		<category><![CDATA[ajax jquery là gì]]></category>
		<category><![CDATA[ajax là gì]]></category>
		<category><![CDATA[ajax trong jquery]]></category>
		<category><![CDATA[cách sử dụng jquery ajax]]></category>
		<category><![CDATA[hướng dẫn ajax jquery]]></category>
		<category><![CDATA[hướng dẫn sử dụng jquery ajax]]></category>
		<category><![CDATA[kĩ thuật ajax trong jquery]]></category>
		<guid isPermaLink="false">https://thienanblog.com/?p=147</guid>

					<description><![CDATA[<p>Giới thiệu Ajax không phải là ngôn ngữ mà là kĩ thuật trong Javascript, giúp chúng ta tạo ra các ứng dụng Web Không đồng bộ (Asynchronous). Nói dễ hiểu&#8230;</p>
<p>The post <a href="https://thienanblog.com/javascript/jquery/huong-dan-jquery-ajax-toan-tap/">Hướng dẫn jQuery Ajax toàn tập</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Giới thiệu</h2>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/06/photo.png"><img loading="lazy" decoding="async" class=" size-full wp-image-155 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/06/photo.png" alt="Hướng dẫn jQuery Ajax" width="250" height="250" srcset="https://thienanblog.com/wp-content/uploads/2015/06/photo.png 250w, https://thienanblog.com/wp-content/uploads/2015/06/photo-150x150.png 150w" sizes="auto, (max-width: 250px) 100vw, 250px" /></a></p>
<p>Ajax không phải là ngôn ngữ mà là kĩ thuật trong Javascript, giúp chúng ta tạo ra các ứng dụng Web Không đồng bộ (Asynchronous). Nói dễ hiểu hơn là kĩ thuật “load dữ liệu không cần load lại trang” hay “load một phần website”, giúp website linh hoạt, nhanh chóng và thân thiện với người dùng hơn.</p>
<h2>Hướng dẫn sử dụng</h2>
<p>Để sử dụng kĩ thuật Ajax trong jQuery, trước hết các bạn cần chuẩn bị cho tôi đó chính là thư viện jQuery được tải về từ <a href="http://jquery.com/download">http://jquery.com/download</a> . Trong đó, jQuery sẽ có 2 phiên bản là 1.x và 2.x thì chúng ta có thể chọn lựa bản nào cũng được. Hai bản chỉ khác nhau ở việc hỗ trợ các trình duyệt cũ và mới mà thôi, cụ thể ở đây chính là IE 8 trở về trước. Ở đây tôi sẽ dùng bản jQuery 1.x để dễ dàng cho việc các bạn độc giả thử nghiệm hơn.</p>
<p><span style="color: #ff0000;"><strong>Lưu ý:</strong></span> Các bạn cũng cần phải có ít nhất 1 Web Server như (XAMPP, WampServer,…) hoặc có thể sử dụng mini Webserver Mongoose cho HTML tại đây <a href="https://thienanblog.com/wp-content/uploads/2015/06/mongoose-free-5.3.5.zip">mongoose-free-5.3.5</a> và có thể đọc hướng dẫn sau để sử dụng <a href="https://cesanta.com/docs/FileSharing.shtml">https://cesanta.com/docs/FileSharing.shtml</a></p>
<p>Sau đây, tôi sẽ giới thiệu cho các bạn các phương thức Ajax thông dụng mà jQuery đã viết sẵn:</p>
<h2>Phương thức “load()”</h2>
<p>Dùng trong các trường hợp cần load dữ liệu đơn giản và không cần thiết phải can thiệp vào dữ liệu trả về.</p>
<p>Chuẩn bị HTML như sau trong cặp thẻ “<span class="lang:default decode:true  crayon-inline ">&lt;body&gt;</span> ”:</p>
<pre class="lang:default decode:true">	&lt;div&gt;
		&lt;a href="#" id="load-du-lieu"&gt;Load dữ liệu&lt;/a&gt;
	&lt;/div&gt;
	&lt;div id="noidung"&gt;&lt;/div&gt;</pre>
<p>Và trong cặp thẻ “<span class="lang:default decode:true  crayon-inline ">&lt;script&gt;</span> ”:</p>
<pre class="lang:default decode:true">	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			console.log($('#noidung').load('vidu1.html'));
		});
	});</pre>
<p>Và như các bạn thấy trong đoạn code ở cặp thẻ “<span class="lang:default decode:true  crayon-inline ">&lt;script&gt;</span> ”, các bạn thấy được tôi có sử dụng một file HTML khác là “<strong>vidu1.html</strong>” để chúng ta sẽ load dữ liệu từ nó vào. Các bạn sẽ được cấu trúc đầy đủ và lưu tên file là “<strong>index.html</strong>” (Tên “<strong>index</strong>” các bạn có thể tự đặt) như sau:</p>
<pre class="lang:default decode:true">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta charset="utf-8"&gt;
	&lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
	&lt;title&gt;Hướng dẫn jQuery Ajax - Thienanblog.com&lt;/title&gt;
	&lt;script type="text/javascript" src="jquery-1.11.3.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div&gt;
		&lt;a href="#" id="load-du-lieu"&gt;Load dữ liệu&lt;/a&gt;
	&lt;/div&gt;
	&lt;div id="noidung"&gt;
		
	&lt;/div&gt;
	&lt;script type="text/javascript"&gt;
	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$('#noidung').load('vidu1.html');
		});
	});
	&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Cấu trúc file “<strong>vidu1.html</strong>” sẽ như sau:</p>
<pre class="lang:default decode:true">&lt;p&gt;Đây là vidu1.html&lt;/p&gt;
&lt;p id="chuoi-can-lay"&gt;Chuỗi cần lấy tiếp theo&lt;/p&gt;</pre>
<p>Chúng ta sẽ có cấu trúc thư mục tổng thể như sau trong ví dụ này:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/06/1.-Cau-truc-thu-muc.png"><img loading="lazy" decoding="async" class=" size-full wp-image-149 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/06/1.-Cau-truc-thu-muc.png" alt="Cau truc thu muc" width="181" height="80" /></a></p>
<p>Và trong cặp thẻ “&lt;script&gt;” tôi sẽ nhắc lại một số cú pháp tôi đã xài để bạn nào quên hoặc chưa biết thì có thể tìm hiểu lại:</p>
<ol>
<li><span class="lang:default decode:true  crayon-inline ">$(document).ready(function(){…}) </span> : tương tự với sự kiện “<span class="lang:default decode:true  crayon-inline ">onload</span> ”, có nghĩa là code của bạn chỉ được thực thi khi trang được load hoàn tất.</li>
<li>Sự kiện “<span class="lang:default decode:true  crayon-inline ">click</span> ” đối số mặc định “<strong>e</strong>” được sử dụng phương thức “<span class="lang:default decode:true  crayon-inline ">preventDefault()</span> ” giúp chặn lại việc load lại trang từ trình duyệt.</li>
<li><strong><span class="lang:default decode:true  crayon-inline ">$(‘#id-can-lay’)</span>  </strong>: trỏ tới thẻ HTML mà các bạn cần lấy có “<span class="lang:default decode:true  crayon-inline ">id</span> ” là<strong> “<span class="lang:default decode:true  crayon-inline ">#id-can-lay</span> ”</strong>. Tương tự với việc các bạn sử dụng cho “<span class="lang:default decode:true  crayon-inline ">class</span> ”.</li>
<li><strong><span class="lang:default decode:true  crayon-inline ">load()</span>  </strong>: có đối số là đường dẫn đến file các bạn cần lấy.</li>
</ol>
<p>Và bây giờ, chúng ta hãy thử chạy Ví dụ trên xem thế nào nhé:</p>
<p>Bước 1: Load file “<strong>index.html</strong>” mà chúng ta đã xây dựng bên trên:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/06/2.Buoc-1.png"><img loading="lazy" decoding="async" class=" size-full wp-image-150 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/06/2.Buoc-1.png" alt="Buoc 1" width="211" height="155" /></a></p>
<p>Bước 2: Nhấn vào nút “<strong>Load dữ liệu</strong>” và chạy thử:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/06/2.Buoc-2.png"><img loading="lazy" decoding="async" class=" size-full wp-image-151 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/06/2.Buoc-2.png" alt="Buoc 2" width="168" height="189" /></a></p>
<p>Như vậy, sau 2 bước trên chúng ta đã load thành công dữ liệu từ “<strong>vidu1.html</strong>” rồi đấy. Và một câu hỏi đặt ra, đó chính là có cách nào mà chúng ta có thể chỉ lấy chuỗi mà chúng ta cần sau khi load dữ liệu vào hay không? Các bạn hãy xem lại cấu trúc “<strong>vidu1.html</strong>” nhé:</p>
<pre class="lang:default decode:true">&lt;p&gt;Đây là vidu1.html&lt;/p&gt;
&lt;p id="chuoi-can-lay"&gt;Chuỗi cần lấy tiếp theo&lt;/p&gt;</pre>
<p>Các bạn thấy gì trong ví dụ này? Có phải chúng ta có 2 thẻ “<span class="lang:default decode:true  crayon-inline ">&lt;p&gt;</span> ” ngăn cách mỗi chuỗi đúng không nào. Và nếu trong trường hợp này, tôi muốn lấy ra thẻ “<span class="lang:default decode:true  crayon-inline ">&lt;p&gt;</span> ” có “<span class="lang:default decode:true  crayon-inline ">id</span> ” là “<span class="lang:default decode:true  crayon-inline ">chuoi-can-lay</span> ”. Thì tôi sẽ chỉnh sửa lại một tí đoạn code trong “<span class="lang:default decode:true  crayon-inline ">&lt;script&gt;</span> ” của chúng ta như sau:</p>
<pre class="lang:default decode:true">	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$('#noidung').load('vidu1.html #chuoi-can-lay');
			
		});
	});</pre>
<p>Và sau đó các bạn chạy và load lại dữ liệu thì chúng ta sẽ được như sau:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/06/3.Lay-chuoi-can-lay.png"><img loading="lazy" decoding="async" class=" size-full wp-image-152 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/06/3.Lay-chuoi-can-lay.png" alt="Lay chuoi can lay" width="163" height="161" /></a></p>
<p>Thật bất ngờ đúng không nào? Như vậy, để có thể bóc tách dữ liệu từ file mà chúng ta load lên, và ở đây chính là file “<strong>vidu1.html</strong>” thì chúng ta cần đặt “<span class="lang:default decode:true  crayon-inline ">id</span> ” cho thẻ bao lấy dữ liệu mà chúng ta cần tách lọc. Sau đó thêm vào <strong>ĐẰNG SAU </strong>đường dẫn như cách chúng ta dùng jQuery để trỏ đến một thẻ trong HTML nào đó vậy.</p>
<p>Vậy là chúng ta đã hoàn tất tìm hiểu xong được phương thức “<span class="lang:default decode:true  crayon-inline ">load()</span> ” trong jQuery Ajax rồi đấy.</p>
<h2>Phương thức “get()” và “post()”</h2>
<p>Ở 2 phương thức này thì trong đó phương thức “<span class="lang:default decode:true  crayon-inline ">get()</span> ” giống “<span class="lang:default decode:true  crayon-inline ">load()</span> ” về mặt kĩ thuật đó chính là dùng “<strong>method</strong>” là “<strong>GET</strong>” trong “<span class="lang:default decode:true  crayon-inline ">&lt;form&gt;</span> ”. Tương tự “<span class="lang:default decode:true  crayon-inline ">post()</span> ” sẽ tượng trưng cho “<strong>method</strong>” là “<strong>POST</strong>” của “<span class="lang:default decode:true  crayon-inline ">&lt;form&gt;</span> ”. Cả 2 phương thức này đều cách viết tắt của phương thức “ajax()” mà chúng ta sẽ làm quen ở phần tới.</p>
<h3><strong>Phương thức “get()”</strong></h3>
<p>Vì có sự tương đồng giữa “<span class="lang:default decode:true  crayon-inline ">get()</span> <strong>” </strong>và “<span class="lang:default decode:true  crayon-inline ">load()</span> ” nên chắc hẳn cách dùng cũng không có phần khác lạ so với các ví dụ ở trên, nhưng cần lưu ý một số cú pháp để tránh nhầm lẫn với “<span class="lang:default decode:true  crayon-inline ">load()</span> ”:</p>
<pre class="lang:default decode:true">	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$.get('vidu1.html', function(ketqua) {
				$('#noidung').html(ketqua);
				$('#noidung').html($('#chuoi-can-lay').html());
			});
			
		});
	});</pre>
<p>Kết quả khi chạy ví dụ trên:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/06/4.-Lay-chuoi-can-lay-cua-get.png"><img loading="lazy" decoding="async" class=" size-full wp-image-153 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/06/4.-Lay-chuoi-can-lay-cua-get.png" alt="4. Lay chuoi can lay cua get" width="165" height="167" /></a></p>
<ol>
<li>Đoạn code này cho bạn thấy rằng để sử dụng được phương thức “<span class="lang:default decode:true  crayon-inline ">get()</span> ”, các bạn cần dùng đến biến “<span class="lang:default decode:true  crayon-inline ">$</span> ” (hay “<span class="lang:default decode:true  crayon-inline ">jQuery</span> ”) sau đó sử dụng thẳng phương thức “<span class="lang:default decode:true  crayon-inline ">get()</span> ” chứ không giống như “<span class="lang:default decode:true  crayon-inline ">$(‘#id-can-lay’).load()</span> ” như ví dụ trước ta đã xem ở phương thức “<span class="lang:default decode:true  crayon-inline ">load()</span> ”.</li>
<li>Đối số truyền vào không thể tách lọc được dữ liệu trả về thẳng trong đường dẫn như phương thức “<span class="lang:default decode:true  crayon-inline ">load()</span> ”.</li>
<li>Kết quả trả về sẽ thông qua đối số thứ 2 của phương thức “<span class="lang:default decode:true  crayon-inline ">get()</span> ” là một <a href="https://thienanblog.com/javascript/javascript-co-ban/bai-6-anonymous-function-va-closure/">Anonymous Function</a> có đối số mặc định trả về là “<span class="lang:default decode:true  crayon-inline ">ketqua</span> ” như chúng ta đã thấy. Các bạn có thể dùng “<span class="lang:default decode:true  crayon-inline ">console.log(ketqua)</span> ” và bật F12 của trình duyệt trên Chrome/Mozilla/Opera để xem kết quả trả về khi click vào.</li>
<li>Và để tách lọc dữ liệu từ “<span class="lang:default decode:true  crayon-inline ">ketqua</span> ” chúng ta cần phải ghi nó vào “<strong>DOM</strong>” hay một nơi nào đó trong cặp thẻ “<span class="lang:default decode:true  crayon-inline ">&lt;body&gt;</span> ” của chúng ta. Sau đó chúng ta dùng tiếp “<span class="lang:default decode:true  crayon-inline ">$(‘#id-can-lay’).html()</span> ” để tách lọc dữ liệu như ở phương thức “<span class="lang:default decode:true  crayon-inline ">load()</span> ” mà chúng ta đã xài trước đó. Các bạn có thể bỏ đi dòng “<span class="lang:default decode:true  crayon-inline ">$(&#8216;#noidung&#8217;).html($(&#8216;#chuoi-can-lay&#8217;).html())</span> ” để thấy sự tương đồng giữa “<span class="lang:default decode:true  crayon-inline ">load()</span> ” và “<span class="lang:default decode:true  crayon-inline ">get()</span> ” chỉ khác nhau về cách dùng.</li>
</ol>
<p>Ngoài ra “<span class="lang:default decode:true  crayon-inline ">get()</span> ” còn hỗ trợ bạn truyền dữ liệu sang file lấy dữ liệu, tuy nhiên cái này thuộc về sự hiểu biết của các bạn trong kĩ thuật lập trình Web nên tôi không nói nhiều ở đây, không thì sẽ loãng bài viết.</p>
<h3><strong>Phương Thức “post()”</strong></h3>
<p>Trong phương thức này, cần có ít nhất một ngôn ngữ động ở phía hệ thống để nhận lấy dữ liệu từ phương thức “<span class="lang:default decode:true  crayon-inline ">post()</span> ” truyền qua. Vì thế, ở đây tôi sẽ dùng PHP để demo cho các bạn.</p>
<p>Cách dùng của phương thức “<span class="lang:default decode:true  crayon-inline ">post()</span> ” sẽ giống với “<span class="lang:default decode:true  crayon-inline ">get()</span> ” nhưng khác về kĩ thuật truyền dữ liệu mà thôi.</p>
<pre class="lang:default decode:true">$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$.post('vidu2.php', {
				emNguoiYeu: "Em Yêu Anh",
				anhNguoiYeu: "Anh không phải người dễ dãi nhé"
			},function(ketqua) {
				$('#noidung').html(ketqua);
			});
			
		});
	});</pre>
<p>Nội dung của file &#8220;<strong>vidu2.php</strong>&#8220;:</p>
<pre class="lang:default decode:true">&lt;?php 
echo '&lt;pre&gt;' .print_r($_POST,true). '&lt;/pre&gt;';</pre>
<p>Kết quả ví dụ trên sau khi thực thi:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/06/5.-Nhan-du-lieu-tra-ve-tu-post.png"><img loading="lazy" decoding="async" class=" size-full wp-image-154 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/06/5.-Nhan-du-lieu-tra-ve-tu-post.png" alt="Nhan du lieu tra ve tu post" width="385" height="247" srcset="https://thienanblog.com/wp-content/uploads/2015/06/5.-Nhan-du-lieu-tra-ve-tu-post.png 385w, https://thienanblog.com/wp-content/uploads/2015/06/5.-Nhan-du-lieu-tra-ve-tu-post-300x192.png 300w" sizes="auto, (max-width: 385px) 100vw, 385px" /></a></p>
<p>Ở ví dụ phương thức “<span class="lang:default decode:true  crayon-inline ">post()</span> ” này, ở đối số thứ 2 thay vì là Anonymous Function như ở ví dụ “<span class="lang:default decode:true  crayon-inline ">get()</span> ” mà chúng ta đã xem trước đó, thì đây là “<strong>một đối tượng</strong>” (Object) <strong>chứa những dữ liệu</strong> mà chúng ta cần truyền qua đường dẫn “<strong>vidu2.php</strong>” để nhận và trả về dữ liệu. <strong>Kết quả trả về</strong> sẽ được đưa vào <strong>đối số thứ 3</strong> cho chúng ta.</p>
<p>Như vậy chúng ta đã hoàn tất tìm hiểu xong “<span class="lang:default decode:true  crayon-inline ">get()</span> ” và “<span class="lang:default decode:true  crayon-inline ">post()</span> ” rồi. Quá dễ đúng không nào? Đến với phần tiếp theo chúng ta sẽ tìm hiểu đến phương thức “<span class="lang:default decode:true  crayon-inline ">ajax()</span> ” mạnh nhất trong thư viện jQuery. Nên đòi hỏi cách dùng nó cũng tương đối khó khăn hơn nhưng vẫn dễ rất nhiều hơn so Javascript thuần.</p>
<h3><strong>Phương thức “ajax()”</strong></h3>
<p>Cách sử dụng phương thức nãy vẫn giống cách gọi của các phương thức “<span class="lang:default decode:true  crayon-inline ">get()</span> ” và “<span class="lang:default decode:true  crayon-inline ">post()</span> ” nhưng chúng ta thay vì truyền đường dẫn trực tiếp vào phương thức thì phương thức “<span class="lang:default decode:true  crayon-inline ">ajax()</span> ” lại chấp nhận đối số đầu tiên chính là cấu hình cho kĩ thuật Ajax của chúng ta:</p>
<pre class="lang:default decode:true">	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$.ajax({
				url: 'vidu2.php',
				type: 'POST',
				dataType: 'html',
				data: {
					emNguoiYeu: "Em Yêu Anh",
					anhNguoiYeu: "Anh không phải người dễ dãi nhé"
				}
			}).done(function(ketqua) {
				$('#noidung').html(ketqua);
			});
			
		});
	});</pre>
<p>Các bạn thấy chứ? Rõ ràng đối số đầu tiên chúng ta truyền vào cho phương thức “<span class="lang:default decode:true  crayon-inline ">ajax()</span> ” chính là một đối tượng (Object) gồm các thuộc tính cấu hình để kĩ thuật AJAX của chúng ta có thể thực thi. Trong đó:</p>
<ol>
<li><span class="lang:default decode:true crayon-inline">url</span> : chuỗi chứa đường dẫn tới file cần lấy và trả về dữ liệu</li>
<li><span class="lang:default decode:true  crayon-inline ">type</span> : phương thức gửi đi tương tự như của “<span class="lang:default decode:true  crayon-inline ">&lt;form&gt;</span> ”, <strong>mặc định</strong> là “<strong>GET</strong>” nếu như các bạn không truyền vào.</li>
<li><span class="lang:default decode:true  crayon-inline ">dataType</span> : xác định dữ liệu trả về thuộc dạng nào? Nếu các bạn không truyền thì jQuery tự động nhận biết kiểu dữ liệu (script, html, json…). Tuy nhiên, tôi khuyến cáo các bạn nên truyền vào đầy đủ để nhận dữ liệu chính xác nhất. Và thông dụng nhất chính là “<strong>html</strong>”.</li>
<li><span class="lang:default decode:true  crayon-inline ">data</span> : truyền dữ liệu sang đường dẫn chỉ định để thực hiện xử lý và trả về dữ liệu. Tương tự như cách truyền dữ liệu của phương thức “<span class="lang:default decode:true  crayon-inline ">post()</span> ”.</li>
<li>“<span class="lang:default decode:true  crayon-inline ">done()</span> ” : ở loạt các bài viết hướng dẫn các bài viết về kĩ thuật Ajax với phương thức “<span class="lang:default decode:true  crayon-inline ">ajax()</span> ” trước đây trên Internet. Thay vì dùng “done()” chúng ta sẽ dùng thuộc tính “<strong>success</strong>” trong đối tượng truyền vào “<span class="lang:default decode:true  crayon-inline ">ajax()</span> ” nhưng từ các phiên bản mới hơn của jQuery. Họ khuyến cáo chúng ta nên sử dụng các phương thức như “<span class="lang:default decode:true  crayon-inline ">done()</span> , <span class="lang:default decode:true  crayon-inline ">fail()</span> , <span class="lang:default decode:true  crayon-inline ">always()</span> ” (Tương ứng: Hoàn thành, thất bại và luôn luôn thực hiện). Nên tùy vào nhu cầu mà bạn xài phương thức tương ứng. Và nên nhớ là đi kèm với phương thức “<span class="lang:default decode:true  crayon-inline ">ajax()</span> ” hoặc lưu vào một tên biến rồi dùng sau để nhận kết quả trả về.</li>
</ol>
<p>Kết quả thực thi ví dụ trên:</p>
<p><a href="https://thienanblog.com/wp-content/uploads/2015/06/5.-Nhan-du-lieu-tra-ve-tu-post.png"><img loading="lazy" decoding="async" class=" size-full wp-image-154 aligncenter" src="https://thienanblog.com/wp-content/uploads/2015/06/5.-Nhan-du-lieu-tra-ve-tu-post.png" alt="Nhan du lieu tra ve tu post" width="385" height="247" srcset="https://thienanblog.com/wp-content/uploads/2015/06/5.-Nhan-du-lieu-tra-ve-tu-post.png 385w, https://thienanblog.com/wp-content/uploads/2015/06/5.-Nhan-du-lieu-tra-ve-tu-post-300x192.png 300w" sizes="auto, (max-width: 385px) 100vw, 385px" /></a></p>
<p>Hoàn toàn không khác ví dụ trước ở phương thức “<span class="lang:default decode:true  crayon-inline ">post()</span> ” đúng không nào? Và không chỉ có nhiêu đó, phương thức “<span class="lang:default decode:true  crayon-inline ">ajax()</span> ” còn hỗ trợ hàng tá các chức năng khác nhưng tôi không thể giới thiệu hết cho các bạn trong nội dung bài viết này được. Các bạn có thể xem thêm về tài liệu hướng dẫn của phương thức trên tại: <a href="http://api.jquery.com/category/ajax">http://api.jquery.com/category/ajax</a></p>
<p>Các bạn có thể tải toàn bộ <a href="https://thienanblog.com/wp-content/uploads/2015/06/jquery-ajax.rar">Sources Code của các ví dụ trên tại đây.</a></p>
<p>Trân trọng cám ơn độc giả đã xem qua bài viết này, mong được sự ủng hộ của các bạn ở các bài viết tới.</p>
<p>The post <a href="https://thienanblog.com/javascript/jquery/huong-dan-jquery-ajax-toan-tap/">Hướng dẫn jQuery Ajax toàn tập</a> appeared first on <a href="https://thienanblog.com">Thien An Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thienanblog.com/javascript/jquery/huong-dan-jquery-ajax-toan-tap/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
