restate / v1.0.0

Bắt đầu

Cài restate, chia sẻ giá trị đầu tiên giữa các component và dùng cùng store đó bên ngoài React.

Trên trang nàyCài đặtState dùng chung đầu tiên của bạnCập nhật giá trịDùng bên ngoài ReactTypeScriptReact NativeMột khai báo trên mọi nền tảng

Cài đặt

restate hoạt động với React 16.8 trở lên. Có sẵn khai báo TypeScript và không có phụ thuộc runtime nào khác.

Terminal
npm install @kkwaenggwari/restate

State dùng chung đầu tiên của bạn

Tạo store một lần, bên ngoài component. Giá trị restate trả về vừa là hook vừa là đối tượng có các phương thức như set và get.

Giữa Editor và CharacterCount không có props cũng không có Provider. Gõ vào một bên sẽ cập nhật bên kia.

JavaScript / JSX
import { restate } from '@kkwaenggwari/restate';

export const useDraft = restate('');

export function Editor() {
  const text = useDraft();
  return <textarea value={text} onChange={(event) => useDraft.set(event.target.value)} />;
}

export function CharacterCount() {
  const count = useDraft((text) => text.length);
  return <span>{count} characters</span>;
}

Cập nhật giá trị

set nhận giá trị mới hoặc một hàm của giá trị trước. reset quay về giá trị bạn đã khai báo.

Hãy coi giá trị là bất biến: trả về đối tượng hoặc mảng mới thay vì sửa cái cũ, để selector nhận ra thay đổi.

Bạn dùng push thêm một mục vào cart.items rồi gọi useCart.set(cart). Vì sao không có gì render?

Store nhận cùng một đối tượng và Object.is không thấy thay đổi. Hãy trả về đối tượng mới, chẳng hạn useCart.set(cart => ({ ...cart, items: [...cart.items, item] })).

JavaScript / JSX
useCount.set(10); // replace the value
useCount.set((count) => count + 1); // compute from the previous value
useCount.reset(); // back to the declared initial value

Dùng bên ngoài React

Cùng store đó hoạt động trong trình xử lý sự kiện, service và test. get đọc giá trị hiện tại, còn subscribe gọi bạn sau mỗi thay đổi và trả về một hàm để ngừng lắng nghe.

JavaScript / JSX
import { useCart } from './stores/cart';

// Any module, event handler or test can use the same store.
const current = useCart.get();
useCart.set((cart) => ({ ...cart, items: [...cart.items, 'Pen'] }));

const stop = useCart.subscribe((cart, previous) => {
  console.log(previous.items.length, '→', cart.items.length);
});
stop();

TypeScript

Khai báo kiểu state một lần. Selector, set và mọi phương thức đều lấy kiểu từ đó.

JavaScript / JSX
import { restate } from '@kkwaenggwari/restate';

type Cart = { items: string[]; coupon: string };

export const useCart = restate<Cart>({ items: [], coupon: '' });

const count = useCart((cart) => cart.items.length); // number
useCart.set((cart) => ({ ...cart, coupon: 'SPRING' }));

React Native

Store trong bộ nhớ không cần gì thêm trên React Native. Để lưu state, hãy cài react-native-mmkv; điểm vào React Native sẽ tự tải nó.

Trong dự án bare, chạy pod install cho iOS sau khi cài. Với Expo, dùng development build vì MMKV là module native.

Terminal
npm install @kkwaenggwari/restate react-native-mmkv@4 react-native-nitro-modules

Một khai báo trên mọi nền tảng

Store được lưu dùng IndexedDB trong trình duyệt và MMKV trên React Native. Khai báo và các component của bạn vẫn giữ nguyên.

JavaScript / JSX
import { persistedRestate } from '@kkwaenggwari/restate';

// IndexedDB on the web, MMKV on React Native. Same declaration.
export const useDraft = persistedRestate('', { key: 'draft' });

Tìm trong tài liệu

Tìm trong tiêu đề, mô tả và nội dung của mọi hướng dẫn.