restate / v1.0.0

เริ่มต้นใช้งาน

ติดตั้ง restate แชร์ค่าแรกระหว่างคอมโพเนนต์ และใช้ store เดียวกันนอก React

ในหน้านี้ติดตั้งstate ที่ใช้ร่วมกันตัวแรกของคุณการอัปเดตค่าการใช้นอก ReactTypeScriptReact Nativeการประกาศเดียวทุกแพลตฟอร์ม

ติดตั้ง

restate ทำงานกับ React 16.8 ขึ้นไป มีการประกาศชนิด TypeScript มาให้ และไม่มี dependency อื่นตอนรันไทม์

Terminal
npm install @kkwaenggwari/restate

state ที่ใช้ร่วมกันตัวแรกของคุณ

สร้าง store ครั้งเดียวนอกคอมโพเนนต์ ค่าที่ restate คืนมาเป็นทั้ง hook และออบเจกต์ที่มีเมธอดอย่าง set และ get

ระหว่าง Editor กับ CharacterCount ไม่มีทั้ง props และ Provider การพิมพ์ในตัวหนึ่งจะอัปเดตอีกตัว

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>;
}

การอัปเดตค่า

set รับค่าใหม่หรือฟังก์ชันของค่าก่อนหน้า reset จะกลับไปที่ค่าที่คุณประกาศไว้

ถือว่าค่าเปลี่ยนแปลงไม่ได้: คืนออบเจกต์หรืออาร์เรย์ใหม่แทนการแก้ของเดิม เพื่อให้ selector เห็นการเปลี่ยนแปลง

คุณเพิ่มรายการลงใน cart.items ด้วย push แล้วเรียก useCart.set(cart) ทำไมไม่มีอะไรเรนเดอร์

store ได้ออบเจกต์เดิมและ Object.is ไม่เห็นการเปลี่ยนแปลง ให้คืนออบเจกต์ใหม่ เช่น 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

การใช้นอก React

store เดียวกันใช้ได้ในตัวจัดการเหตุการณ์ บริการ และการทดสอบ get อ่านค่าปัจจุบัน ส่วน subscribe จะเรียกคุณหลังทุกการเปลี่ยนแปลงและคืนฟังก์ชันสำหรับเลิกฟัง

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

ระบุชนิดของ state ครั้งเดียว selector, set และทุกเมธอดจะได้ชนิดจากตรงนั้น

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 ในหน่วยความจำไม่ต้องใช้อะไรเพิ่มบน React Native หากต้องการบันทึก state ให้ติดตั้ง react-native-mmkv จุดเริ่มต้นของ React Native จะโหลดให้อัตโนมัติ

ในโปรเจกต์ bare ให้รัน pod install สำหรับ iOS หลังติดตั้ง ใน Expo ให้ใช้ development build เพราะ MMKV เป็นโมดูลเนทีฟ

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

การประกาศเดียวทุกแพลตฟอร์ม

store แบบบันทึกใช้ IndexedDB ในเบราว์เซอร์และ MMKV บน React Native การประกาศและคอมโพเนนต์ของคุณยังเหมือนเดิม

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

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

ค้นหาเอกสาร

ค้นหาในชื่อเรื่อง คำอธิบาย และเนื้อหาของคู่มือทั้งหมด