質問
Recoil là 1 thư viện quản lý trạng thái cho React. Sử dụng recoil có nhiều lợi điểm như bên dưới
Cập nhật: 

Tổng quan

Recoil là 1 thư viện quản lý trạng thái cho React. Nó có nhiều điểm lợi như bên dưới :

  • Tối giản và linh động: Recoil làm việc tương tự như React. Thêm nó vào trong ứng dụng và bạn có thể giúp ứng dụng chạy nhanh hơn, có thể chia sẽ trạng thái của ứng dụng 1 cách linh động.
  • Phân cấp dữ liệu: Data và các câu truy vấn sẽ được chia nhỏ ra để sử dụng 1 cách chính xác trong những chức năng nhất định.
  • Phạm vi toàn cục: cài đặt cố định, routing, debugging thời gian thực, hoặc undo sẽ được thực hiện trên phạm vi toàn cục của ứng dụng mà không cần phải sửa lại code phía bên dưới.

Cấu trúc

Có 2 component chính của Recoil

Atoms

Atom là những đơn vị trạng thái. chúng có thể update và đăng ký: khi 1 atom được update, tất cả những component đăng ký vào chúng sẽ được tự động reder lại với giá trị mới. Atom cũng có thể được tạo trong lúc runtime. Chúng cũng có thể được ở trong React local component. Nếu nhiều component sử dụng cùng 1 atom, chúng sẽ chia sẽ dữ liệu lẫn nhau.

const fontSizeState = atom({
  key: 'fontSizeState',
  default: 14,
});

Selector

1 selector là 1 hàm thuần túy nhận 1 atom hoặc 1 selector khác làm đối số đầu vào. khi những atom hoặc selector nhận vào đó bị thay đổi, thì hàm của selector sẽ được thực thi lại. Component cũng có thể được đăng ký vào selector tương tự như atom, và sẽ được render lại khi selector thay đổi.

const fontSizeLabelState = selector({
  key: 'fontSizeLabelState',
  get: ({ get }) => {
    const fontSize = get(fontSizeState);
    const unit = 'px';
    return `${fontSize}${unit}`;
  },
});

Cài đặt Nextjs với Recoil

1. Cài đặt recoil

yarn add recoil

2. Thêm RecoilRoot

Component muốn sử dụng recoil state cần thiết phải có RecoilRoot là 1 view cha của nó, để có thể hiện thị. Nơi tốt nhất để đặt RecoilRoot là trong component gốc:

_app.js
import { RecoilRoot } from 'recoil';

export default function MyApp({ Component, pageProps }) {
  return (
    <RecoilRoot>
      <Component {...pageProps} />
    </RecoilRoot>
  );
}

3. Định nghĩa recoil atom và selector

lib/recoil-atoms.js
import { atom, selector } from 'recoil';

export const categoryState = atom({
  key: 'category',
  default: '',
});

export const setCategory = selector({
  key: 'setCategory',
  set: ({ set }, category) => {
    set(categoryState, category);
  },
});

4. Đặt chúng lại cùng với nhau

index.js
import React, { useState } from 'react';
import { categoryState, setCategory } from '../lib/recoil-atoms';
import { useRecoilValue, useSetRecoilState } from 'recoil';

const IndexPage = () => {
  const [inputValue, setInputValue] = useState('');
  const category = useRecoilValue(categoryState);
  const changeCategory = useSetRecoilState(setCategory);

  function handleChange(e) {
    setInputValue(e.target.value);
  }

  function handleSubmit(e) {
    e.preventDefault();
    const getValue = inputValue.trim();
    // check if value exists
    if (getValue) {
      changeCategory(getValue);
      // reset input value
      setInputValue('');
    }
  }

  return (
    <>
      <h1>Category: {category}</h1>
      <form onSubmit={handleSubmit}>
        <input value={inputValue} onChange={handleChange} />
        <input type="submit" value="Change Category" />
      </form>
    </>
  );
};

export default IndexPage;

Kết luận

Recoil thì gọn nhẹ và dễ sử dụng, ngoài ra cũng còn rất nhiều những tính năng khác ở recoil.
Hãy truy cập Recoiljs để xem thêm.

この記事が気に入ったら応援お願いします🙏
4
ツイート
LINE
Developer
Price Rank Dev
I use Next.js (React) and Firebase (Firestore / Auth) for development. We are also developing APIs for Ruby on Rails and GraphQL. Our team members are 6 Vietnamese and Japanese engineers.