--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Hiển thị các bài đăng có nhãn MERN. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn MERN. Hiển thị tất cả bài đăng

MERN (7) - Chương trình React đầu tiên

Bài trước: MERN (6) - JSX và Babel
-----

2.6       NPX

Đọc thêm về npx ở đây: https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b

Nhắc lại, NPM là chương trình quản lý thư viện trong môi trường Nodejs. NPM gồm hai thành phần: một là kho chứa các thư viện, hay các gói (package) (https://www.npmjs.com/), hai là chương trình chạy ở chế độ dòng lệnh.

Các package trong kho chứa được quản lý bằng cơ sở dữ liệu trực tuyến có tên là npm registry.

Chương trình chạy ở chế độ dòng lệnh dùng để tương tác với kho chứa nhằm cài đặt các package, quản lý phiên bản, quản lý các dependency.

Trong Node, mỗi mô-đun chứa trong một tập tin. Ví dụ các mô-đun Circle, Rectangle và Square chứa trong các tập tin sau: Circle.js, Rectangle.js, Square.js.

Package là một thư viện (hay gói), chứa một hoặc nhiều mô-đun. Ví dụ package Shapes sẽ chứa ba mô-đun là Circle, Rectangle và Square.

Nhiều trường hợp thường dùng lẫn lộn giữa mô-đun và package.

Để tải, cài đặt và chạy một package bằng NPM thì cần phải thực hiện một số bước. Ví dụ:

(tham khảo thêm: https://www.youtube.com/watch?v=GNR5iY0N26U&list=PLJ5qtRQovuEOoKffoCBzTfvzMTTORnoyp&index=3)

– Để tải, cài đặt package có tên là create-react-app, gõ lệnh sau (tham số -g có nghĩa là global, giúp chạy được lệnh create-react-app ở mọi vị trí trong máy tính):

npm install -g create-react-app

– Sau khi cài đặt được package create-react-app, để tạo một dự án mới có tên my-react-app1, gõ lệnh sau:

create-react-app my-react-app1

Lệnh trên sẽ tải, cài đặt các package cần thiết khác (ví dụ: react, react-dom, react-scripts), các dependence, để tạo ra dự án react có tên là my-react-app1, mở thư mục my-react-app1 để xem các thư mục, tập tin đã được tạo ra.

[Kết quả - nội dung của thư mục my-react-app1]

my-react-app1/

– .git/

– node_modules/

– public/

– src/

– .gitignore

– package.json

– package-lock.json

– README.md

Vậy có cách nào đơn giản hơn để có chạy một package không? NPX đã được tạo ra để đáp ứng yêu cầu này.

NPX (Node Package Execute): cũng giống như NPM, NPX là công cụ dùng để cài đặt và quản lý các package trong môi trường Node.

NPX được đóng gói sẵn trong công cụ NPM từ phiên bản 5.2 trở đi. NPX sẽ chạy các package, dù là package đó đã được cài đặt trong nội bộ dự án, chưa được cài đặt hoặc đoạn mã đang đặt trên Github.

Như vậy NPX sẽ tìm các package đã có sẵn trong dự án, hoặc các package đã được khai báo trong biến môi trường $PATH để chạy. Trong trường hợp không tìm thấy package, NPX sẽ tải và cài đặt tạm thời package để chạy.

Vậy khi nào nên sử dụng NPM, khi nào thì nên sử dụng NPX?

https://stackoverflow.com/questions/50605219/difference-between-npx-and-npm#:~:text=npx%20is%20a%20npm%20package,it%20in%20a%20single%20step.

– Những package nào chỉ cần chạy một lần trong dự án thì nên sử dụng NPX

– Những package nào cần chạy nhiều lần trong dự án thì nên sử dụng NPM

Ví dụ,

Sử dụng package create-react-app để tạo ra một dự án react, thay vì dùng 2 lệnh (npm để cài đặt, và create-react-app để tạo dự án), thì bạn có thể sử dụng duy nhất một lệnh NPX theo cú pháp sau:

npx create-react-app my-react-app1

2.7       Chương trình react đầu tiên

Nhắc lại, React là một thư viện JavaScript được sử dụng để xây dựng phần giao diện người dùng cho một ứng dụng web.

Để xây dựng phần giao diện web bằng React, bạn cần nhúng thư viện React vào dự án. Vì thư viện React gồm nhiều thành phần, nếu nhúng thủ công sẽ phức tạp và mất thời gian.

Thay vì vậy, bạn sẽ sử dụng package có tên là create-react-app để nhúng React vào dự án.

Muốn sử dụng package create-react-app, bạn cần tải và cài đặt package này bằng công cụ NPM hoặc NPX.

Ví dụ,

– Tạo một thư mục mới (ví dụ: learnReact)

– Mở chương trình dòng lệnh (cmd), chuyển vào thư mục learnReact

– Gõ lệnh npx create-react-app my-react-app1 để tải, cài đặt package create-react-app, và tạo dự án có tên my-react-app1

– Chuyển vào thư mục my-react-app1, gõ lệnh npm start để chạy ứng dụng web đã nhúng React. Nếu chạy thành công, bạn sẽ thấy một trang web trên trình duyệt, với đường dẫn mặc định (ví dụ: http://localhost:3000/), nội dung trang web đơn giản chỉ có dòng chữ “Edit src/App.js and save to reload. Learn React”.

– Bạn có thể đổi cổng mặc định (từ 3000) thành một cổng khác (8000), bằng cách sửa nội dung trong tập tin package.json. Trong tập tin package.json, thay thế dòng ["start": "react-scripts start"] thành ["start": "set port=8000 && react-scripts start"]

– Vào cửa sổ dòng lệnh để dừng ứng dụng web đang chạy trước đó bằng lệnh Ctrl + C, sau đó chạy lại ứng dụng bằng lệnh npm start, xem đường dẫn trên trình duyệt để kiểm tra cổng đã được đổi.

Lab 1. Tạo một dự án web có sử dụng React, cấu hình để có thể truy cập bằng cổng 8888.

Các thành phần chính của một dự án có sử dụng React:

Xem thêm [view]

– .git, .gitignore, README.md: là các thành phần của phần mềm Git, dùng để quản lý phiên bản (không liên quan đến React)

– package.json: chứa các khai báo của dự án, như tên dự án, các thư viện, các dependencies, các package dự án đang sử dụng, các đoạn script thực thi

– node_modules: nơi chứa các package của dự án

– public: chứa tập tin index.html, là tập tin được chạy đầu tiên của ứng dụng (website); và các tài nguyên khác

– src: chứa các tập tin mã nguồn

Lưu ý: ở đây bạn mới học cách sử dụng React để xây dựng (develop) giao diện trang web, tuy nhiên để có giao diện sản phẩm, thì bạn phải thực hiện kết xuất ra trang web sản phầm (build).

Thứ tự thực thi các tập tin trong một ứng dụng React: bắt đầu từ index.html > src/index.js > App.js

Làm giao diện bằng React là tạo ra các component, rồi ghép các component này lại với nhau theo mục đích sử dụng.

Lab 2. Tạo trang “Chào bác Tèo”.

[Hướng dẫn]

– Tạo component ChaoBacTeo: trong thư mục src, tạo mới tập tin ChaoBacTeo.js

[ChaoBacTeo.js]

import React from 'react';

 

function ChaoBacTeo() {

    return (

        <div>

            <h1>Chào bác Tèo teo teo!</h1>

            <p>Đây là component đầu tiên</p>

        </div>

    );

}

 

export default ChaoBacTeo;

– Vào tập tin index.js để nhúng component ChaoBacTeo

Nhúng component ChaoBacTeo:

import ChaoBacTeo from './ChaoBacTeo';

Đổ component ChaoBacTeo vào vị trí id= “root”, tại trang index.html,

ReactDOM.render(

  <React.StrictMode>

    <ChaoBacTeo />

  </React.StrictMode>,

  document.getElementById('root')

)

[index.js]

import React from 'react';

import ReactDOM from 'react-dom';

import ChaoBacTeo from './ChaoBacTeo';

import * as serviceWorker from './serviceWorker';

 

ReactDOM.render(

  <React.StrictMode>

    <ChaoBacTeo />

  </React.StrictMode>,

  document.getElementById('root')

);

 

// If you want your app to work offline and load faster, you can change

// unregister() to register() below. Note this comes with some pitfalls.

// Learn more about service workers: https://bit.ly/CRA-PWA

serviceWorker.unregister();

 

– Mở chương trình cửa sổ dòng lệnh, chuyển vào thư mục dự án, gõ lệnh “npm start” để xem kết quả.

D:\Code_react\codes\react\myproject\my-react-app1>npm start

– Vì Create React App luôn lấy trình duyệt mặc định của hệ điều hành để chạy, nên muốn xem kết quả trên trình duyệt nào, thì chỉ cần cấu hình lại trình duyệt mặc định của hệ điều hành. Cách làm: bấm phím “cửa sổ” trên bàn phím > gõ Settings > trong cửa sổ Settings gõ default > chọn Choose a default web browser > bấm chuột trái vào mục Web browser, chọn trình duyệt mong muốn.

[Kết quả: http://localhost:8000/]

Chào bác Tèo teo teo!

Đây là component đầu tiên

-----
Cập nhật: [09/07/2020]
-----
Xem thêm: MERN (8) -
Xem thêm: Danh sách bài học

MERN (5) - Tổng quan React và component

Bài trước: MERN (4) - NPM và Module
-----

1.6       Tổng quan về React


Tới đây đã biết tạo database server (tạo cluster trên MongoDB Atlas) để làm việc với cơ sở dữ liệu MongoDB, đã biết cài đặt Nodejs, dùng ngôn ngữ JavaScript để lập trình với Nodejs; đã biết dùng NPM để tải các mô-đun trên mạng về dự án, sau đó dùng require để gọi mô-đun ra sử dụng; và đã biết dùng từ khóa exports để tự định nghĩa mô-đun trong dự án. 

Phần này sẽ tiếp tục tìm hiểu cách dùng React để lập trình xử lý phía client (client-side, front-end) của một ứng dụng web. Gồm tạo giao diện, thực hiện các xử lý, gửi thông tin qua lại giữa client và server.

[Tham khảo thêm khóa học React của tác giả nghiepuit: https://www.youtube.com/watch?v=gL5HBA_1bDQ&list=PLJ5qtRQovuEOoKffoCBzTfvzMTTORnoyp&index=1]


1.6.1       React là gì?


React (cũng được gọi là ReactJS, React.js) là một thư viện JavaScript do Facebook đưa ra năm 2013, được sử dụng để xây dựng giao diện người dùng (UI) cho một ứng dụng mobile application, hoặc SPA - single page application.

React tạo ra giao diện từ các thành phần nhỏ hơn gọi là các component.

Vì React chỉ quan tâm tới việc kết xuất dữ liệu ra DOM, nên khi xây dựng front-end cần kết hợp React với các thư viện khác như Redux, và React Router để quản lý trạng thái (state management) và điều hướng xử lý (routing).

Thư viện React chạy trên cả client và server.

Để kiểm tra một trang web có sử dụng React hay không, cần cài React Developer Tools cho trình duyệt Chrome. Làm như sau:

– Vào google.com, nhập từ khóa: “chrome how to install react developer tools”


– Trình duyệt sẽ mở trang có React Developer Tools, bấm vào nút Add to Chrome để cài đặt
cho trình duyệt

– Nếu cài đặt thành công, biểu tượng của React Developer Tools (đừng nhầm với Developer Tools của trình duyệt) sẽ xuất hiện ở phía phải của thanh địa chỉ trình duyệt, và nó sẽ sáng lên khi trang web hiện tại có sử dụng React. Mở thử trang https://reactjs.org/ là cái biểu tượng nó sẽ sáng lên, bấm vào biểu tượng rồi đọc thông báo để rõ thêm

– Mở Developer Tools sẽ thấy có thêm tab Components và Profiler giúp làm việc với React

1.6.2       Nhúng React vào một website



React được thiết kế để bạn có thể áp dụng nó vào website tùy theo nhu cầu, có thể áp dụng ít hoặc nhiều đều được.

Để đơn giản, phần dưới đây sẽ thực hiện nhúng React vào website có sẵn, bằng cách thêm một nội dung nhỏ (component của React) vào một trang web.

Bước 1: Tạo thư mục để chứa website, ví dụ component; trong thư mục component tạo tập tin component.html; trong trang component.html tạo một phần tử để chứa/hiển thị nội dung sẽ được React thêm vào.

[component.html]

<body>
    <!-- hiển thị một nút like ở đây -->
    <div id="like_button_container"></div>
 </body>

Gắn vào div một id để chút nữa dùng JavaScript tham chiếu tới, rồi hiển thị một cái component của React vào đó.

Bạn có thể tạo ra rất nhiều các div trống như trên để React sẽ chèn nội dung vào sau. Các div này thường được gọi là các thùng chứa (container).

Bước 2: Tải thư viện React về trình duyệt, tải và thực thi mã nguồn của một component.

[component.html]

<body>
    <!-- hiển thị một nút like ở đây -->
    <div id="like_button_container"></div>

    <!-- tải React từ trên mạng về trình duyệt -->
    <script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
    <!-- tải và thực thi đoạn mã của component -->
    <script src="like_button.js"></script>
</body>

Bước 3: Viết đoạn mã để tạo ra một component của React

Trong thư mục component, tạo tập tin like_button.js. Nhập vào đoạn mã sau (chưa cần hiểu đoạn mã này, chỉ cần biết rằng đoạn mã viết bằng JavaScript, dùng thư viện React để tạo ra và xử lý cho một cái nút trên giao diện) :

[like_button.js]

'use strict';

const e = React.createElement;

class LikeButton extends React.Component {
  constructor(props) {
    super(props);
    this.state = { liked: false };
  }

  render() {
    if (this.state.liked) {
      return 'You liked this.';
    }

    return e(
      'button',
      { onClick: () => this.setState({ liked: true }) },
      'Like'
    );
  }
}
// tìm vị trí của div với id="like_button_container" và gắn React component vào
const domContainer = document.querySelector('#like_button_container');
ReactDOM.render(e(LikeButton), domContainer);

Bước 4: Mở tập tin component.html bằng trình duyệt để xem kết quả, sẽ thấy một nút Like xuất hiện, bấm chuột vào, sẽ hiển thị dòng chữ “You liked this.”

Qua ví dụ trên rút ra được điều gì?

– React cũng là một thư viện, viết bằng JavaScript, nên để sử dụng thư viện này thì cần nhúng nó vào trang web

– React component (trong tập tin like_button.js) là một đoạn mã JavaScript, nó sử dụng các lớp (class) của thư viện React để thao tác với DOM (tài liệu HTML)

– Thử dùng trình duyệt, mở mã nguồn của React ra xem (https://unpkg.com/react@16/umd/react.development.js), tìm theo từ khóa “function Component ” để xem qua định nghĩa của lớp này

– Thử dùng trình duyệt, mở mã nguồn của react-dom ra xem (https://unpkg.com/react-dom@16.13.1/umd/react-dom.development.js), tìm theo từ khóa “function render” để xem phần định nghĩa của phương thức render().

– Thư viện React tách thành hai tập tin react và react-dom

– Có thể dùng React mà không cần sử dụng tới các công cụ hỗ trợ khác (ví dụ: công cụ quản lý cài đặt npm, công cụ tạo dự án React tự động)

1.6.3       Dùng lại Component


Một đặc tính hữu ích của React là nó cho phép chia giao diện trang web thành các bộ phận nhỏ hơn, gọi là các component. Lắp ghép các component lại sẽ tạo ra một trang web hoàn chỉnh.

Các component có đặc điểm là nhỏ gọn, độc lập và có thể tái sử dụng.

Ở phần trên đã tạo ra một component là một cái nút (nút like), phần này sẽ sửa mã nguồn để có thể sử dụng cái nút đó ở 3 chỗ khác nhau trên trang HTML.


[reuse_component.html]

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Sử dụng lại component</title>
  </head>
  <body>
    <p>Minh họa việc sử dụng React mà không cần dùng tới các công cụ khác.</p>
    <p>Tải React về như một thư viện JavaScript thông thường</p>

    <p>
      Nội dung của bình luận số 1
     <!-- hiển thị một nút like ở đây -->
      <div class="like_button_container" data-commentid="1"></div>
    </p>

    <p>
        Nội dung của bình luận số 2
     <!-- hiển thị một nút like ở đây -->
      <div class="like_button_container" data-commentid="2"></div>
    </p>

    <p>
        Nội dung của bình luận số 3
      <!-- hiển thị một nút like ở đây -->
      <div class="like_button_container" data-commentid="3"></div>
    </p>

   <!-- tải React từ trên mạng về trình duyệt -->
   <script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
   <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
   <!-- tải đoạn mã của component -->
   <script src="like_button.js"></script>
  </body>

[like_button.js]

Không nhất thiết phải hiểu hiết đoạn mã JavaScript này, chỉ cần đọc các chú thích để biết đoạn mã này làm gì.

 'use strict';

const e = React.createElement;

class LikeButton extends React.Component {
  constructor(props) {
    super(props);
    this.state = { liked: false };
  }

  render() {
    if (this.state.liked) {
      return 'Bạn đã "thích" bình luận số ' + this.props.commentID;
    }

    return e(
      'button',
      { onClick: () => this.setState({ liked: true }) },
      'Like'
    );
  }
}

// tìm tất cả các div với class="like_button_container" (tìm DOM container) và gắn React component vào
document.querySelectorAll('.like_button_container')
  .forEach(domContainer => {
    // ĐọcID của mỗi bình luận (comment) dựa vào thuộc tính data-*
    const commentID = parseInt(domContainer.dataset.commentid, 10);
    ReactDOM.render(
      e(LikeButton, { commentID: commentID }),
      domContainer
    );

  });s
-----
Cập nhật: [09/07/2020]
-----
Xem thêm: MERN (6) - JSX và Babel
Xem thêm: Danh sách bài học