restate / v1.0.0

สมัครรับเฉพาะสิ่งที่คุณต้องการ

เลือกว่าแต่ละคอมโพเนนต์พึ่งพาส่วนใดของ store เปรียบเทียบออบเจกต์ด้วย shallow รวมการเปลี่ยนแปลงด้วย batch และเชื่อมเหตุการณ์จากภายนอก

ในหน้านี้ส่ง selectorลองดูเลือกหลายฟิลด์ด้วย shallowการเปรียบเทียบแบบกำหนดเองรวมการเปลี่ยนแปลงด้วย batchการสมัครรับนอก Reactเชื่อมเหตุการณ์จากภายนอก

ส่ง selector

เรียก hook พร้อมฟังก์ชันที่เลือกสิ่งที่คอมโพเนนต์ต้องการ หลังทุกการเปลี่ยนแปลง restate จะรัน selector และเทียบผลลัพธ์กับครั้งก่อนด้วย Object.is หากเท่ากัน คอมโพเนนต์จะไม่เรนเดอร์

บัตรเปลี่ยน ItemCount เรนเดอร์ไหม

ไม่ selector ของมันยังคืนจำนวนสินค้าเท่าเดิม ส่วนที่เลือกจึงเท่าเดิมและ React ไม่ถูกขอให้เรนเดอร์

JavaScript / JSX
const useCart = restate({ items: ['Book'], coupon: '', note: '' });

function ItemCount() {
  // Re-renders only when the number of items changes.
  const count = useCart((cart) => cart.items.length);
  return <p>{count} items</p>;
}

ลองดู

เปลี่ยนฟิลด์แล้วดูตัวนับการเรนเดอร์ ปิด shallow เพื่อดู selector ที่คืนออบเจกต์ใหม่ทุกครั้ง

กำลังเตรียมตัวอย่าง…

เลือกหลายฟิลด์ด้วย shallow

เมื่อ selector สร้างออบเจกต์ มันจะคืนออบเจกต์ใหม่ทุกครั้ง Object.is จึงเห็นการเปลี่ยนแปลงเสมอ ให้ส่ง shallow เป็นอาร์กิวเมนต์ที่สอง มันจะเทียบฟิลด์ของออบเจกต์เองลึกหนึ่งระดับ

shallow ยังเทียบสมาชิกของอาร์เรย์ Map และ Set ลึกหนึ่งระดับด้วย

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

function CartSummary() {
  const { count, coupon } = useCart(
    (cart) => ({ count: cart.items.length, coupon: cart.coupon }),
    shallow,
  );
  return (
    <p>
      {count} items · {coupon || 'no coupon'}
    </p>
  );
}

การเปรียบเทียบแบบกำหนดเอง

ฟังก์ชัน (left, right) => boolean ใดก็ใช้เป็นอาร์กิวเมนต์ที่สองได้ ใช้เมื่อ shallow ไม่พอ เช่น การเทียบรายการตาม id

JavaScript / JSX
const ids = useCart(
  (cart) => cart.items.map((item) => item.id),
  (left, right) => left.length === right.length && left.every((id, index) => id === right[index]),
);

รวมการเปลี่ยนแปลงด้วย batch

set ทุกครั้งแจ้งผู้สมัครรับทันที เมื่อการกระทำหนึ่งเปลี่ยนหลาย store ให้ห่อด้วย batch หน่วยความจำอัปเดตทันที ส่วนผู้สมัครรับจะทำงานครั้งเดียวหลัง callback

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

function checkout() {
  batch(() => {
    useCart.set((cart) => ({ ...cart, items: [] }));
    useOrder.set((order) => ({ ...order, status: 'paid' }));
  });
  // Subscribers run once, after both stores changed.
}

การสมัครรับนอก React

subscribeSelector จะเรียกคุณเมื่อค่าที่เลือกเปลี่ยนเท่านั้น โดยใช้ฟังก์ชันเปรียบเทียบที่เป็นตัวเลือกแบบเดียวกัน

JavaScript / JSX
const stop = useCart.subscribeSelector(
  (cart) => cart.items.length,
  (count, previous) => analytics.track('cart-size', { count, previous }),
);

เชื่อมเหตุการณ์จากภายนอก

อาร์กิวเมนต์ที่สองของ restate เป็น updater ได้ มันทำงานเมื่อคอมโพเนนต์หรือผู้สมัครรับตัวแรกเริ่มฟัง และการเก็บกวาดจะทำงานเมื่อตัวสุดท้ายหยุด เหตุการณ์ของเบราว์เซอร์ ซ็อกเก็ต หรือเซนเซอร์จึงเชื่อมอยู่เฉพาะเท่าที่จำเป็น

ใช้ start() และ stop() เพื่อควบคุมเอง

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

// Listens while at least one component or subscriber uses the store.
export const useOnline = restate(true, ({ setState }) => {
  const update = () => setState(navigator.onLine);
  window.addEventListener('online', update);
  window.addEventListener('offline', update);
  update();
  return () => {
    window.removeEventListener('online', update);
    window.removeEventListener('offline', update);
  };
});

ค้นหาเอกสาร

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