restate / v1.0.0
เริ่มต้นใช้งาน
ติดตั้ง restate แชร์ค่าแรกระหว่างคอมโพเนนต์ และใช้ store เดียวกันนอก React
ในหน้านี้
ติดตั้งstate ที่ใช้ร่วมกันตัวแรกของคุณการอัปเดตค่าการใช้นอก ReactTypeScriptReact Nativeการประกาศเดียวทุกแพลตฟอร์มติดตั้ง
restate ทำงานกับ React 16.8 ขึ้นไป มีการประกาศชนิด TypeScript มาให้ และไม่มี dependency อื่นตอนรันไทม์
npm install @kkwaenggwari/restatestate ที่ใช้ร่วมกันตัวแรกของคุณ
สร้าง store ครั้งเดียวนอกคอมโพเนนต์ ค่าที่ restate คืนมาเป็นทั้ง hook และออบเจกต์ที่มีเมธอดอย่าง set และ get
ระหว่าง Editor กับ CharacterCount ไม่มีทั้ง props และ Provider การพิมพ์ในตัวหนึ่งจะอัปเดตอีกตัว
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] }))
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 จะเรียกคุณหลังทุกการเปลี่ยนแปลงและคืนฟังก์ชันสำหรับเลิกฟัง
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 และทุกเมธอดจะได้ชนิดจากตรงนั้น
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 เป็นโมดูลเนทีฟ
npm install @kkwaenggwari/restate react-native-mmkv@4 react-native-nitro-modulesการประกาศเดียวทุกแพลตฟอร์ม
store แบบบันทึกใช้ IndexedDB ในเบราว์เซอร์และ MMKV บน React Native การประกาศและคอมโพเนนต์ของคุณยังเหมือนเดิม
import { persistedRestate } from '@kkwaenggwari/restate';
// IndexedDB on the web, MMKV on React Native. Same declaration.
export const useDraft = persistedRestate('', { key: 'draft' });