ReactJS: Tìm hiểu khái niệm Context (Phần 1)

Bạn có cần sử dụng Context hay không ?

Trong ứng dụng React, data thường truyền từ trên xuống dưới thông qua props. Nhưng cách này sẽ trở nên phức tạp đối với các loại dữ liệu global như locale, theme…, chúng ta phải truyền chúng qua nhiều lớp component để sử dụng. Context lúc này như vị cứu tinh của React: cung cấp một cách chia sẻ dữ liệu giữa các component như một biến global mà không cần phải truyền props qua mỗi cấp component.

Bạn có cần sử dụng Context hay không?

Khi nào cần sử dụng Context?

Thông thường, tất cả chúng ta sử dụng 2 khái niệm “ top-down-data-flow ” và “ Lifting state up ” để truyền tài liệu từ component cha đến con và update tài liệu từ component con lên cha .

Giả sử chúng ta có 3 component A, B, C và lần lượt là con của nhau:

tim-hieu-khai-niem-context-phan-1Cách quản lý state thông thường qua các tầng componentNếu số lượng component lên đến hàng chục, tất cả chúng ta sẽ thấy việc truyền props như thế này sẽ trở nên dài dòng, dư code và khó quản trị. Ngay cả khi những component con trung gian không sử dụng đến props, nó cũng phải nhận props từ component cha để chuyển xuống component con của nó khi cần .Đó là nguyên do mà React Context sinh ra để xử lý yếu tố nhập nhằng này !Ý tưởng của Context là : tập trung chuyên sâu lưu tài liệu ( props ) ở một nơi. Sau đó React sẽ cung ứng những API để những component hoàn toàn có thể lấy props đó trực tiếp mà không cần qua những component trung gian .tim-hieu-khai-niem-context-phan-1Quản lý state với React ContextContext được phong cách thiết kế để san sẻ tài liệu như một biến global cho một cây component. Ví dụ những giá trị như authenticated user ( thông tin người dùng lúc đăng nhập ), theme, languages … được sử dụng tiếp tục ở những tầng React component .Khi mở màn với một dự án Bất Động Sản dù lớn hay nhỏ, tất cả chúng ta nên sử dụng Context từ bắt đầu. Sau này có lẽ rằng dự án Bất Động Sản sẽ tăng trưởng lớn hơn, nhiều component hơn, lúc đó việc truyền props qua từng component sẽ rất phiền phức .

Ưu – nhược điểm của Context

So với luồng quản trị thường thì, Context có những ưu – điểm yếu kém nhất định .

Ưu điểm

  • Giảm thiểu code dư thừa khi một component nhận props nhưng không sử dụng đến.
  • Giảm thiểu việc lặp code khi gọi một props cho nhiều component.
  • Quản lý dữ liệu ở một nơi giúp việc truy xuất và cập nhật dễ dàng.

Nhược điểm

  • Khó tái sử dụng lại component vì dữ liệu tập trung một chỗ.

Cách sử dụng Context (Context API)

React cung ứng những Context API để tạo Context, lấy giá trị của Context cho những loại component :
ReactJS: Tìm hiểu khái niệm Context (Phần 1) 4
QUẢNG CÁO

  • React.createContext
  • Context.Provider
  • Class.contextType
  • Context.Consumer
  • Context.displayName

React.createContext

API này được cho phép khởi tạo một đối tượng người tiêu dùng Context .

// defaultValue là giá trị được khởi tạo mặc định lúc đầu của MyContext
const MyContext = React.createContext('defaultValue');

Dưới đây là đối tượng người dùng Context được khởi tạo, với những thuộc tính Provider, Consumer đi kèm như một component :tim-hieu-khai-niem-context-phan-1Giá trị của đối tượng Context được khởi tạoGiá trị defaultValue này được sử dụng khi một component không được bọc bởi component Context. Provider. Nó hữu dụng cho việc kiểm thử component độc lập mà không cần phải bọc chúng lại .

Context.Provider

Mỗi đối tượng người tiêu dùng Context đều đi cùng với một Provider như một React component .

<MyContext.Provider value={/* some value */}>{children}MyContext.Provider

>

Component nhận một props là “value” để truyền đến component con (có thể được bọc bởi hoặc không). Giá trị của props này không phụ thuộc vào phương thức shouldComponentUpdate của lifecycle updating.

tim-hieu-khai-niem-context-phan-1Đối tượng Provider của Context

Một component có thể chứa nhiều component lồng nhau.

Class.contextType

Thuộc tính contextType được sử dụng cho những class component. Thuộc tính này được gán vào đối tượng người tiêu dùng Context khai báo bằng React. createContext ( ) .

Ta lấy giá trị props “value” của component thông qua cú pháp this.context, ta có thể sử dụng nó trong mọi phương thức của lifecycle:

class MyClass extends React.Component {
  componentDidMount() {
    let value = this.context;
    /* ... */
  }
  componentDidUpdate() {
    let value = this.context;
    /* ... */
  }
  componentWillUnmount() {
    let value = this.context;
    /* ... */
  }
  render() {
    let value = this.context;
    /* ... */
  }
}
MyClass.contextType = MyContext;

Ngoài ra, tất cả chúng ta cũng hoàn toàn có thể sử dụng từ khóa static để sử dụng contextType bên trong class component :

const MyContext = React.createContext('defaultValue');

class MyClass extends React.Component {
  static contextType = MyContext;
  render() {
    let value = this.context;
    

Wiki Tino

} }

this.context chỉ trỏ tới một context duy nhất. Giá trị mặc định của nó là đối số “ defaultValue ” khi khởi tạo Context .

Nếu muốn sử dụng nhiều context khác, chúng ta phải sử dụng “Consuming Multiple Context”.

Context.Consumer

Để lấy giá trị props “value” của component trong một function component, ta dùng component Consumer.

Function component nhận giá trị “value” của gần nhất trong các tầng component và trả về React element.

const FunctionComponent = (props) => (
  
    {(val) => val

}>Function Component}

);tim-hieu-khai-niem-context-phan-1Đối tượng Consumer của ContextNếu MyContext này không có Provider thì tham số val sẽ là đối số defaultValue truyền vào createContext ( ) .

Context.displayName

Sau khi một Context được khởi tạo bởi createContext ( ), nó nhận một thuộc tính displayName kiểu string ( chuỗi ) .React DevTools sẽ sử dụng chuỗi này để hiển thị lại tên Context. Điều này hữu dụng cho việc debug .

const MyContext = React.createContext(/* vài giá trị */);
MyContext.displayName = 'MyDisplayName';

 // "MyDisplayName.Provider" in DevTools
 // "MyDisplayName.Consumer" in DevTools

tim-hieu-khai-niem-context-phan-1Tên context đươcj hiển thị bằng giá trị displayName

Tổng kết

Chúng ta đã đi tìm hiểu và khám phá xong khái niệm và những API tương quan đến React Context. Bài viết sau tất cả chúng ta sẽ đi vào ví dụ trong thực tiễn sử dụng React Context như thế nào nhé !Cám ơn những bạn đã ghé thăm bài viết này !

Xem bài viết sau tại : ReactJS : Tìm hiểu khái niệm Context ( Phần 2 )

CÔNG TY CỔ PHẦN TẬP ĐOÀN TINO

  • Trụ sở chính: L17-11, Tầng 17, Tòa nhà Vincom Center, Số 72 Lê Thánh Tôn, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh
    Văn phòng đại diện: 42 Trần Phú, Phường 4, Quận 5, Thành phố Hồ Chí Minh
  • Điện thoại: 0364 333 333
    Tổng đài miễn phí: 1800 6734
  • Email: [email protected]
  • Website: www.tino.org