เริ่มต้นอย่างรวดเร็ว

ตรวจสอบเนื้อหาหลักของหน้าการเริ่มต้นพร้อมตัวอย่างที่ทำงานจริงในครั้งเดียว


1. ติดตั้ง

hook สำหรับการแบ่ง/ลากใช้ React hook และ RxJS BehaviorSubjectดังนั้นแอปจึงต้องมี react, rxjsร่วมกันอยู่

bash
npm install @byeolnaerim/global-rx-state rxjs react

2. แบ่งปัน store ด้วยชื่อเดียวกัน

โหมดที่ตั้งชื่อได้รับการออกแบบมาเพื่อให้เรียกใช้งานได้ง่ายภายในคอมโพเนนต์ เมื่อเรียกใช้ด้วยชื่อเดียวกัน สร้างสถานะ Rxจะส่งคืน store ทั่วไปเดียวกัน หากค่าถัดไปขึ้นอยู่กับค่าก่อนหน้า setValue((prev) => next) ให้ใช้ setter แบบฟังก์ชัน

tsx
import { createRxState } from "@byeolnaerim/global-rx-state";

function CounterButtons() {
  const { setCountInner, useCountInner } = createRxState(
    0,
    "countInner",
    { storage: "localstorage" },
  );

  const countInner = useCountInner();

  return (
    <button onClick={() => setCountInner((prev) => prev + 1)}>
      {countInner}
    </button>
  );
}

function CounterDisplay() {
  const { useCountInner } = createRxState(0, "countInner", { storage: "localstorage" });
  const countInner = useCountInner();

  return <span>현재 count: {countInner}</span>;
}

3. หากต้องการคีย์รันไทม์ให้ใช้ createRxStateTuple

ในกรณีที่ชื่อถูกกำหนดในรันไทม์ เช่น workspace id ที่ได้รับจากเซิร์ฟเวอร์, พารามิเตอร์เส้นทาง, ชื่อแท็บที่ผู้ใช้คลิก สร้างคู่สถานะ Rxนี่เป็นเรื่องธรรมชาติ ตัวอย่างด้านล่างใช้ draft store ที่แตกต่างกันสำหรับแต่ละแท็บ

tsx
import { createRxStateTuple } from "@byeolnaerim/global-rx-state";

function RuntimeTabDraftSample() {
	const [setActiveTab, , useActiveTab] = createRxStateTuple(
		"profile",
		"docsQuickActiveTab",
		{ storage: "sessionstorage" },
	);
	const activeTab = useActiveTab();
	const [setDraft, , useDraft] = createRxStateTuple(
		{ content: "" },
		`docsQuickDraft:${activeTab}`,
		{ storage: "sessionstorage" },
	);
	const draft = useDraft();

	return (
		<Paper variant="outlined" sx={{ p: 2, borderRadius: 3 }}>
			<Stack spacing={1.5}>
				<Stack direction="row" spacing={1}>
					{["profile", "settings", "billing"].map((tabName) => (
						<Button
							key={tabName}
							variant={
								activeTab === tabName ? "contained" : "outlined"
							}
							onClick={() => setActiveTab(tabName)}
						>
							{tabName}
						</Button>
					))}
				</Stack>
				<TextField
					label={`${activeTab} draft`}
					value={draft.content}
					onChange={(event) =>
						setDraft({ content: event.target.value })
					}
					fullWidth
				/>
			</Stack>
		</Paper>
	);
}

4. รวบรวมกฎการเปลี่ยนแปลงด้วยตัวลดระดับ

ค่าธรรมดาเพียงพอด้วย setter แต่หากสถานะเปลี่ยนแปลงตามหลายการกระทำหรือค่าต่างๆ ขึ้นอยู่กัน สร้างตัวลดระดับ Rxการรวบรวมกฎการเปลี่ยนแปลงไว้ในที่เดียวจะปลอดภัยกว่า

tsx
type TodoAction =
  | { type: "add"; text: string }
  | { type: "reset" };

function todoReducer(state: TodoState, action: TodoAction): TodoState {
  switch (action.type) {
    case "add":
      return { items: [...state.items, action.text] };
    case "reset":
      return { items: [] };
    default:
      return state;
  }
}

const { dispatchTodo, useTodo } = createRxReducer(
  { items: [] },
  todoReducer,
  "todo",
);