Skip to content

Instantly share code, notes, and snippets.

@paulnguyen-mn
Created June 25, 2020 15:46
Show Gist options
  • Save paulnguyen-mn/e8a80c07ab9c090c19bce3c89d7cc50f to your computer and use it in GitHub Desktop.
Save paulnguyen-mn/e8a80c07ab9c090c19bce3c89d7cc50f to your computer and use it in GitHub Desktop.
Lộ trình học ReactJS cơ bản cho người mới bắt đầu 2020 🚀

Lộ trình học ReactJS cơ bản cho người mới bắt đầu 2020 🎉

  • Đôi tượng: mới bắt đầu học ReactJS mà không biết học những gì.
  • Yêu cầu kiến thức:

Nếu như mọi người chưa biết Javascript là gì, thì mình khuyên các bạn nên học JS trước rồi hẵn sang ReactJS nhé, kẻo ngợp nè! 😉

Mảng kiến thức cơ bản (BẮT BUỘC)

MỘT VÀI NOTES:

  • ReactJS là thư viện để xây dựng UI component, chứ không phải framework nha.
  • Lib (thư viện) vs framework khác nhau cái gì? Các bạn chịu khó google để biết thêm nha.
  • Version hiện tại của ReactJS là bao nhiêu?
  • ReactJS là của ai hay tổ chức nào?
  • Tại sao phải cần ReactJS, sao không viết thuần javascript?
  • Sẽ hơi khó hiểu khi mới đầu tiếp cận ReactJS, nhưng không sao, cứ đi tiếp nha hehee

0. Setup môi trường làm việc

Bạn cần gì để bắt đầu code được ReactJS:

  • Cài đặt NodeJS (runtime của javascript)
  • Code editor: dùng VSCode
  • Cài đặt một vài extension hữu ích của VSCode: (OPTIONAL)
    • Live Server
    • Material Theme Icons
    • Material Theme
    • Sử dụng Fira Code font
    • ReactJS code snippets
    • ESLint
    • Babel Javascript
    • Bracket Pair Colorizer:
  • Bắt đầu tạo project:

Tada xong tới đây là bạn phải chạy lên được cái website đơn giản của ReactJS rồi đó.
Giờ học code ReactJS thôi hehe 😎

1. Kiến thức nền tảng

Lưu ý:

  • Không vội vàng, đừng đi nhanh mà không hiểu gì hết.
  • Đi từng mục một, đi chậm, học tới đâu, lấy code bỏ vào VSCode chạy lên thử coi nó ra như thế nào để hiêu nó.
  • Nếu gặp khó khăn, không hiểu topic nào thì tìm thêm blog, videos về chủ đề đó mà coi thêm.
  • Sau khi đi hết phần kiến thức này, hãy tự làm một website đơn giản mà bạn thích:
    • Todo App: Thêm, Xoá, Sửa và hiển thị ra danh sách TODOS
    • Simple Cart: Hiển thị danh sách sản phẩm, thêm vào giỏ hàng và tính tiền.
    • ...

Mục đích cho phần này để đảm bảo các bạn hiểu và vận dụng được kiến thức của ReactJS.

2. Type checking

  • Đây là một nội dung OPTIONAL. Không có Type Checking, code của bạn vẫn chạy được bình thường.
  • Thỉnh thoảng bạn thấy code như vầy:
import PropTypes from 'prop-types';

function Item() {
  // ...
}

Item.propTypes = {
  data: PropTypes.object.isRequired,
  isSpecial: PropTypes.bool,
}

export default Item;
  • Để ý cái phần Item.propTypes, khúc này dù có hay không thì code của bạn vẫn chạy.

Vậy Type Checking có tác dụng gì mà mình phải consider thêm nó vào?

  • Cảnh báo lỗi nếu truyền sai kiểu dữ liệu khi đang dev. Thỉnh thoảng mình hay quên, không để ý loại dữ liệu truyền vào component, dẫn tới một số trường hợp tính toán sai và không như mong muốn, với Type Checking nó sẽ giúp mình báo lỗi để mình biết và fix sớm.
  • Type Checking nó chỉ hoạt động khi dev, còn khi lên production nó không chạy nên không sợ bị ảnh hưởng tới performance.
  • Khi component của bạn dần lớn, sử dụng nhiều props, việc khai báo tập trung này giúp bạn có thể biết được, à component này đang sử dụng props gì. Nếu không có, bạn phải scan hết code của component mới biết nó đang dùng những props nào 😭

Link tham khảo: https://reactjs.org/docs/typechecking-with-proptypes.html#proptypes

3. Form

Trong dự án thực tế, ít ai mà tự xử lý các vấn đề liên quan tới form, thay vào đó là sử dụng một thư viện có sẵn. Ở đây mình có một vài ứng cử viên:

  • React Hook Form (recommended): mới nhất.
  • Formik: phổ biến nhất.
  • Redux Form: cái này lưu ý bạn phải dùng redux à nhen 😉

Bạn có thể chọn 1 trong 3 để học và áp dụng vào dự án của mình. Nhưng recommend là học React Hook Form hoặc Formik thôi.

Khi làm việc với Form, bạn sẽ cần tới một schema validator để hỗ trợ bạn validate dữ liệu trong Form, 2 ứng cử viên cho vị trí này:

  • Joi
  • Yup: được inspired từ Joi

Làm việc với Form, cần lưu ý điều gì?

  • Làm sao set được giá trị khởi tạo cho form.
  • Tổ chức Form như thế nào, bạn nên phân biệt rõ 3 levels
    • Thứ nhất là Form: Thư viện quản lý Form như Formik hay react-hook-form
    • Thứ hai là Form Field: cầu nối để bind giá trị của form vào ui control.
    • Thứ ba là UI Control: cái này là những control của thư viện Bootstrap, Material Design hay AntDesign.
    • Để hiểu rõ hơn, cùng mình tìm hiểu qua video này nhé: https://youtu.be/LuNYJuyQxKE

4. Routing

Một số điều bạn cần lưu ý khi làm việc với routing:

  • Setup routing trong một project gồm những bước nào?
  • Tìm hiểu về Router, Switch, Route và Redirect.
  • Setup nested routing như thế nào? Đây chính là cách tạo ra layout chung ở component cha, và tuỳ vào routing con sẽ render component con tương ứng.

5. API

  • API là cách thức để client và server có thể giao tiếp với nhau.
  • Mình có một vài lựa chọn để thực hiện gọi một API:
    • XHR: cái này hơi cũ cũ òi, viết dạng callback.
    • Fetch: cái này có sẵn trong trình duyệt, viết dạng Promise.
    • Axios (recommended): cái này nên dùng trong project thực tế nè.

Tổ chức API module trong project thực tế như thế nào?

  • Thường các file api sẽ được đặt trong 1 folder tên là api
  • Lựa chọn 1 http client: thường là axios, còn trường hợp project nhỏ, đơn giản thì có thể dùng fetch cũng được. Fetch tiện cái là ko cần cài thêm thư viện. Còn axios thì phải cài thêm package axios nhen.
api
|__ axiosClient.js hoặc fetchClient.js: config http client và cung cấp các phương thức get, post, put, ...
|__ productApi.js
|__ categoryApi.js
|__ userApi.js
|__ ... cứ mỗi một resource sẽ có một file API tương ứng 😉
  • Sắp tới sẽ có video giải thích về API module này. Mình bổ sung link sau hen hihi

6. Hooks

7. State management

Lưu ý khi có state cần đặt câu hỏi:

  • Nếu state này chỉ dùng cho 1 component hiện tại --> dùng component state.
  • Nếu state này nó share cho nhiều components khác nhau --> cần thư viện quản lý state.

Hiện tại thì Redux chiếm lợi thế trên thị trường òi khi nhắc tới state management.

  • Giờ có Redux Toolkit giúp mình sử dụng Redux đơn giản hơn, code ít hơn và được handle bên dưới nhiều hơn.
  • Khuyến khích các bạn nên học Redux cơ bản trước, rồi hãy tới Redux Toolkit nhé.

Nhưng gần đây, Facebook có đang thử nghiệm một thư viện để quản lý state cho ReactJS, đó là Recoil.

  • Lưu ý vẫn còn đang thử nghiệm, nên hãy khoan apply cho production.
  • Mình có làm 1 vài videos về Recoil, nếu quan tâm bạn có thể tham khảo hen.

Một vài topic nâng cao

1. HOC

2. Authentication

Cái này là phần đăng nhập, đăng ký rồi quên mật khẩu các kiểu, ... Thường project nào cũng có và được làm sẵn, ít người có cơ hội được làm phần này vì nó khá phức tạp và mỗi project setup 1 lần là xong, ít khi phải đụng lại lần 2 🙂

Để làm cái này, mình có thể dùng mấy ông lớn để giúp mình như

Các bạn chịu khó đọc docs để hiểu nó là gì nha.

  • Cần hiểu được 1 cái flow đăng nhập, đăng ký diễn ra như thế nào.
  • Token là gì? Tại sao lại cần quản lý nó ? Không có token có được không?
  • Nhập username, password lên server có bị lộ thông tin giữa đường không?
  • Nên lưu token trên website ở đâu?
  • Lỡ token mà bị expired thì phải xử lý thế nào?
  • ...

3. I18n

  • Các bạn search Google xem i18n là viết tắt của cái gì nha.
  • Cái này được dùng cho việc hỗ trợ đa ngôn ngữ, khi click vào ngôn ngữ tương ứng thì website được đổi ngôn ngữ tức thì.
  • Package được sử dụng là React i18 next
  • Ông thần này sử dụng được cho cả Class component và Function component (có hooks)
  • Có phải project nào cũng hỗ trợ đa ngôn ngữ không? Cũng tuỳ project, nên xác định ngay từ đầu, nếu có làm đa ngôn ngữ thì setup từ đầu luôn cho đỡ khổ.

4. Static sites

5. Deployment

Làm thế nào để deploy website lên server để share cho người khác xem thành quả cày cuốc của mình.

Nguồn tài liệu tham khảo

Rất nhiều link tham khảo về các thư viện làm việc về ReactJS được tổng hợp ở đây: https://github.com/enaqx/awesome-react. Có gì mọi người tham khảo thêm hen. 😉

CẢNH BÁO: Lạc lối do nhiều links tham khảo quá 🤣

Những thông tin mình ghi nhận trong bài này là từ kinh nghiệm cá nhân, nên sẽ có phần thiếu sót, mọi người hãy cùng bổ sung, đóng góp cho nó hoàn chỉnh nhé.
Cảm ơn mọi người rất nhiều nè ❤️

@paulnguyen-mn
Copy link
Author

a ơi hiện em đang tìm hiểu làm một app chat đợn giản, nhờ anh liệt kê giúp em cần tìm hiểu những gì để làm hoàn thiện một app chat ạ, em dùng reactjs ạ

hi Phúc, về app chat thì em tham khảo thêm Messenger, Zalo, Whatsapp xem người ta làm gì em làm tương tự nhen.

Thứ nhất, cái flow chat đơn giản:

  • Người A gõ, show trạng thái lên để biết người đó đang gõ, hoặc có nhiều người đang gõ.
  • Khi nhấn submit thì tin nhắn hiển thị lên khung chat liền, xong mới gửi lên server sau.
  • Khi gửi không được thì show lỗi và cho retry.
  • Retry ko được thì cho retry tiếp hoặc xoá message luôn.
  • OPTIONAL: thu hồi tin nhắn, chỉ khi người nhận chưa nhận thì mới thu hồi được hoàn toàn.
  • Khi gửi thành công thì người nhận sẽ nhận được liền. Nếu ko có available thì gửi notification cho họ.

Nội dung gửi:

  • Tin nhắn văn bản đơn giản
  • Sticker
  • Hình ảnh, âm thanh và video
  • Attachments: files, documents
  • ...

Kênh chat:

  • Cá nhân 1-1: cho phép tạo group chat với người hiện tại và những người khác.
  • Group chat

Video call:

  • Cá nhân 1-1
  • Group video: cho phép add thêm người trong khi diễn ra hội thoại.

Đồng bộ

  • Có cách nào sync giữa nhiều thiết bị với nhau, nt trên đt nhưng nếu có app trên desktop thì cũng thấy những tin nhắn đó.

Một số lưu ý:

  • Mặc định chỉ show bao nhiêu tin nhắn thôi, ko show hết lịch sử.
  • Khi user scroll lên top khung chat thì load thêm lịch sử chat.
  • Có nút để scroll to bottom (chat mới nhất)
  • Lưu ý lúc render tin nhắn, avatar tránh tình trạng cái list bị nháy, render lại tin nhắn ko thay đổi ko cần thiết.
  • Có hỗ trợ cập nhật tin nhắn ko? nếu có phải đảm bảo cập nhật cho đồng bộ cái chat của tất cả mọi người.

Một vài ý, em xem tham khảo rồi phát triển thêm ý nha. 😉

@vanloc1102
Copy link

vanloc1102 commented Jun 26, 2020

Hi anh , em có 2 câu hỏi mong anh giải đáp giúp ạ :

  1. Hiện tại e dùng bootstrap , matertial UI và code css cơ bản để build các giao diện basic như app todo list hoặc shopping cart rồi chia các component - redux -router -call api v.v.. , giờ e muốn build một giao diện lớn thì có các thư viện UI nào hỗ trợ không ạ ?
  2. Hiện tại để code giao diện với reactjs thì người ta hay dùng style gì ah , e có làm thử các kiểu viết CSS thuần vào app.js , rồi CSS in JS , viết SCSS , dùng Bootstrap.
    Mong anh giải đáp giúp em ạ , e cảm ơn !

@PhucLe2303
Copy link

cám ơn a nhiều ạ !!

@paulnguyen-mn
Copy link
Author

Hi anh , em có 2 câu hỏi mong anh giải đáp giúp ạ :

  1. Hiện tại e dùng bootstrap , matertial UI và code css cơ bản để build các giao diện basic như app todo list hoặc shopping cart rồi chia các component - redux -router -call api v.v.. , giờ e muốn build một giao diện lớn thì có các thư viện UI nào hỗ trợ không ạ ?
  2. Hiện tại để code giao diện với reactjs thì người ta hay dùng style gì ah , e có làm thử các kiểu viết CSS thuần vào app.js , rồi CSS in JS , viết SCSS , dùng Bootstrap.
    Mong anh giải đáp giúp em ạ , e cảm ơn !

hi Lộc, a trả lời 2 câu hỏi của em nhé

  1. Thật ra project lớn nhỏ gì họ cũng base trên các UI library rồi customize lại thôi nè, còn có project đau hơn là tự build hết từ đầu thì hơi cực. Nên khi em làm UI, hãy học luôn cách customize cái UI đó như thế nào, thư viện có hỗ trợ customize hay không nha 🙂

  2. Styles thì anh thấy cũng tuỳ project, có thể

  • Áp dụng SCSS + BEM (mấy project a làm gần đây thì apply cái này)
  • Viết styled component
  • Rồi a còn thấy có tailwindcss: trường phái atomic, một class đại diện cho 1 thuộc tính, cái này viết class trên html element mỏi mòn luôn, a thì thoáng qua thấy không happy với cái này lắm.

Em lưu ý thêm, styles mình cũng có nhiều loại:

  • Global styles: cái này là một số styles chung chung cho site của mình, thường là reset css, set font size các kiểu cho các thẻ, ...
  • Component styles: cái này độc lập cho từng component, apply BEM nữa cho nó clean.
  • UI lib styles: thường mình sẽ có bộ styles để config, override lại cái styles của thư viện mà mình đang sử dụng làm UI.

Em có thể tìm hiểu thêm về kiến trúc CSS qua bài post này https://www.xfive.co/blog/itcss-scalable-maintainable-css-architecture/
Hi vọng giải đáp được thắc mắc của em. 🙂

@manh1451999
Copy link

anh bắt đầu làm video về react tầm 3 tháng nay đúng không ạ, em chưa thấy khoá react nào hoàn chỉnh, anh dự định làm hẳn 1 khoá về react cơ bản trên youtube ko ạ

https://www.youtube.com/c/EasyFrontend/playlists

@dangdinh87
Copy link

khó quá anh ơi

@quangtuyennguyen
Copy link

Dạ e cảm ơn thông tin của anh ạ với lại hôm nào a rảnh làm video login social với React đi ạ.

Yeah sắp tới là phần Authentication a sẽ nói cái này Trọng nha 😉
Trước hết là setup cái API module trong project.
Xong sau đó sẽ tới phần Auth sử dụng API nè hehe

Tuyệt vời anh ơi! Anh đá qua JWT nhé anh. Thanks anh ạ

@paulnguyen-mn
Copy link
Author

anh bắt đầu làm video về react tầm 3 tháng nay đúng không ạ, em chưa thấy khoá react nào hoàn chỉnh, anh dự định làm hẳn 1 khoá về react cơ bản trên youtube ko ạ

https://www.youtube.com/c/EasyFrontend/playlists

Yeah đúng rồi đó Manh. Hiện a ko có dự định làm full khoá cơ bản trên kênh Youtube nè 🙂

@nguyenviettrong
Copy link

Dạ e cảm ơn thông tin của anh ạ với lại hôm nào a rảnh làm video login social với React đi ạ.

Yeah sắp tới là phần Authentication a sẽ nói cái này Trọng nha 😉
Trước hết là setup cái API module trong project.
Xong sau đó sẽ tới phần Auth sử dụng API nè hehe

OK thanks a. Anh accept fb e với ạ http://facebook.com/trongAoTuong/

@HoangVNH
Copy link

HoangVNH commented Jul 1, 2020

Anh ơi, em có thể dùng cái path này để học React Native được không ạ và có gì cần bổ sung thêm để em học React Native không a?

@phungchibao
Copy link

Cái này mà a ra full 1 khóa học thì ngon á a :)

@CongDatt
Copy link

CongDatt commented Mar 2, 2021

Anh cho em hỏi muốn thực tập ReactJs thì cần có skill, kiến thức gì ạ ?

@phungchibao
Copy link

phungchibao commented Mar 3, 2021 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment