- vừa được xem lúc

Quản lý Global State trong React với React Signify

0 0 6

Người đăng: Cat Developer

Theo Viblo Asia

image

Lời mở

Xin chào mọi người 😀, nếu mọi người còn đang băn khoăn không biết nên chọn thư viện quản lý Global State nào trong ReactJS, đang hoang mang về các vấn đề re-render và cần tìm giải pháp cho vấn đề hiệu năng trong ứng dụng, thì đây sẽ bài viết phù hợp với bạn.

Và hôm nay, mình xin lên cho anh em con thư viện khá ngon, dùng để quản lý Global State trong React, bản thân đã và đang xài, nên cũng muốn chia sẽ cho anh em trong cộng đồng ReactJS cùng trải nghiệm.

Giới thiệu

React Signify là một thư viện đơn giản cung cấp các tính năng quản lý và cập nhật global state một cách hiệu quả. Nó đặc biệt hữu ích trong các ứng dụng React để quản lý state và tự đồng bộ khi giá trị của chúng thay đổi. Ưu điểm của thư viện:

  • Thư viện nhỏ gọn
  • Cú pháp đơn giản
  • Hỗ trợ kiểm soát re-render hiệu quả - phần mình thích nhất 🫡

Thông tin dự án

Cài đặt

React Signify có sẵn dưới dạng package trên NPM để sử dụng với ứng dụng React:

# NPM
npm install react-signify # Yarn
yarn add react-signify

Tổng quan

Khởi tạo

Bạn có thể khởi tạo Signify ở bất kỳ file nào, hãy tham khảo ví dụ sau

import { signify } from 'react-signify'; const sCount = signify(0);

Tại đây ta tạo 1 biến sCount với giá trị khởi tạo là 0.

Sử dụng tại nhiều nơi

Việc sử dụng đơn giản bằng công cụ export/import của module. Hãy tham khảo ví dụ sau :

Component A (export Signify)

import { signify } from 'react-signify'; export const sCount = signify(0); export default function ComponentA() { return ( <div> <h1>{sCount.html}</h1> <button onClick={() => sCount.set((pre) => pre.value += 1)}>UP</button> </div> );
}

Component B (import Signify)

import { sCount } from './ComponentA'; export default function ComponentB() { return ( <div> <h1>{sCount.html}</h1> <button onClick={() => sCount.set((pre) => pre.value += 1)}>UP</button> </div> );
}

Từ đây ta thấy được tính linh động của Signify, khai báo đơn giản, sử dụng ở mọi nơi.

Các tính năng cơ bản

Hiện thị trên giao diện

Ta sẽ sử dụng thuộc tính html để hiện thị giá trị lên giao diện.

import { signify } from 'react-signify'; const sCount = signify(0); export default function App() { return ( <div> <h1>{sCount.html}</h1> </div> );
}

Cập nhật giá trị

import { signify } from "react-signify"; const sCount = signify(0); export default function App() { return ( <div> <h1>{sCount.html}</h1> <button onClick={() => sCount.set(1)}>Set 1</button> <button onClick={() => sCount.set((pre) => pre.value += 1)}>UP 1</button> </div> );
}

Việc nhấn nút sẽ thay đổi giá trị của Signify và được cập nhật tự động lên giao diện.

Các tính năng nâng cao

Use

Tính năng cho phép lấy giá trị của Signify và sử dụng nó như một state của component.

import { useEffect } from "react";
import { signify } from "react-signify"; const sCount = signify(0); export default function App() { const countValue = sCount.use(); useEffect(() => { console.log(countValue); }, [countValue]); return ( <div> <h1>{countValue}</h1> <button onClick={() => sCount.set((pre) => pre.value += 1)}>UP</button> </div> );
} 

Thường thì mình sẽ sử dụng nếu có nhu cầu tích hợp chung với các hook khác của React như useCallback, useMemo, useEffect, v.v...

watch

Tính năng cho phép theo dõi sự thay đổi giá trị của Signify một cách an toàn.

import { signify } from 'react-signify'; const sCount = signify(0); export default function App() { sCount.watch((newValue) => { console.log(newValue); }, []); return ( <div> <button onClick={() => sCount.set((pre) => pre.value += 1)}>UP</button> </div> );
}

Đây là nhân tố chính trong việc quản lý hiệu năng ứng dụng, vì nó cho phép bạn theo dõi sự thay đổi của Signify mà không làm component re-render (thử đặt console.log để check nhé)

Wrap

Tính năng áp dụng giá trị của Signify trong một vùng giao diện cụ thể.

import { signify } from 'react-signify'; const sCount = signify(0); export default function App() { return ( <div> <sCount.Wrap> {(value) => ( <div> <h1>{value}</h1> </div> )} </sCount.Wrap> <button onClick={() => sCount.set((pre) => pre.value += 1)}>UP</button> </div> );
}

Phần ưu thích nhất của mình, Wrap giúp mình cô lập phạm vi re-render khi Signify thay đổi, từ đó component App sẽ luôn được bảo toàn và không re-render

Hardwrap

Tính năng áp dụng giá trị của Signify trong một vùng giao diện và hạn chế được các re-render không cần thiết khi component cha re-render.

import { signify } from 'react-signify'; const sCount = signify(0); export default function App() { return ( <div> <sCount.HardWrap> {(value) => ( <div> <h1>{value}</h1> </div> )} </sCount.HardWrap> <button onClick={() => sCount.set((pre) => pre += 1)}>UP</button> </div> );
}

Mình thích Hardwrap nhất, lý do là phần giao diện đôi khi chỉ cần sử dụng biến của Signify, vẫn nên việc đóng HardWrap sẽ giúp cho phạm vi này không re-render khi Component App render.

Tất nhiên sẽ đi kèm với nhược điểm là không thể nhận được giá trị mới từ ngoài phạm vi Hardwrap truyền vào, vậy nên có thể sử dụng Wrap để thay thế trong trường hợp này

reset

Công cụ cho phép khôi phục lại giá trị mặc định.

import { signify } from 'react-signify'; const sCount = signify(0); sCount.reset()

Thường thì mình sẽ sử dụng để khôi phục nội dung mặc đinh khi không còn sử dụng, đảm bảo memory được giải phóng

Kết Luận

Theo quan điểm của mình sau khi đã sử dụng qua vài project lớn nhỏ, mình thấy React Signnify rất dễ sử dụng và bảo trì, đặc biết có hỗ trợ devtool nên rất dễ để kiểm soát các giá trị khi thay đổi. Đặc biệt Signify cho phép mình toàn quyền kiểm soát Re-render, nhờ vậy mà giúp cho ứng dụng của mình hoạt động đúng cách và hiệu quả hơn. Mình cũng sử dụng Signify để làm ra rất nhiều thư viện chung cho nhóm như thông báo lỗi, hiển thị cảnh báo, hiển thị đơn đặt hàng ở nhiều vị trí, v.v...

Các bạn thử sử dụng xem có cùng trải nghiệm giống mình không nhé.

Xem thêm

Còn rất nhiều nội dung khác trên trang chủ của Signify, hãy xem thêm ở nội dung dưới đây nhé :

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tìm hiểu về Redux Thunk

Chào mọi người, nếu bạn là người đã biết về React và đang làm quen với Redux chắc hẳn bạn đang rất mơ hồ về các khái niệm cơ bản của Redux như dispatch, store, action creator,... bạn còn đang vật lộn với đống document của Redux để hiểu những khái niệm đó và bạn nghe ai đó trong team nói về Redux Thu

0 0 399

- vừa được xem lúc

[React] Giới thiệu tổng quát về Redux Toolkit

1. Redux Toolkit (RTK) là gì và tại sao lại có nó. . .

0 0 6.6k

- vừa được xem lúc

Uống Pepsi code Vue đi - Uống Cocacola code React nha ;)

. (Nguồn ảnh: Internet). Chào các bạn, chào các bạn. Let's go . 1.

0 0 147

- vừa được xem lúc

Cài đặt taillwind css cho dự án React

Trong bài viết cùng mình tìm hiểu cách cài đặt tailwind css cho một dự án React sẵn có. .

0 0 146

- vừa được xem lúc

Formik vs React Hook Form (Phần 1)

Các lập trình viên Front End đều làm việc rất nhiều với form cùng sự phức tạp của ứng dụng. Do vậy chúng ta cần những thư viện form mạnh mẽ hỗ trợ quản lý các form state, form validation... Thành phần module. Formik bao gồm có 9 dependencies khác. . React Hook Form thì không có.

0 0 372

- vừa được xem lúc

Hướng dẫn React Redux cho người mới bắt đầu - Phần 1

Lời mởi đầu. Chào các bạn, ở thời điểm thực hiện bài viết này mình cũng là một người đang bắt đầu tìm hiểu và học với ReactJs và Redux, trong quá trình tìm hiểu đọc các tài liệu về thư viện này mình có tìm được một bài hướng dẫn khá hay nên đã quyết định chia sẻ với mọi người .

0 0 281