Regras do Modo Tuple

O modo de tupla anônima é para exportação em nível de módulo e usa o helper de tupla nomeada para a chave de runtime.


O modo de tupla anônima é apenas para o nível superior do módulo.

createRxState(defaultValue)cria uma nova store a cada chamada. Portanto, deve ser criado uma vez no nível superior do módulo e exportado para uso. Este modo não aceita opções de armazenamento e não usa a stack trace como chave oculta.

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

// Good: module top-level에서 한 번 생성합니다.
export const [setCount, getCount, useCount] = createRxState(0);

export function Counter() {
  const count = useCount();

  //Don't Do That: 컴포넌트나 함수 내부에서 anonymous tuple store를 만들지 마세요.
  //매 렌더마다 새 store가 만들어질 수 있습니다.
  //const [setCount, getCount, useCount] = createRxState(0);

  return (
    <button onClick={() => setCount((prev) => prev + 1)}>
      {count}
    </button>
  );
}

Use o helper de tupla nomeada para a chave de runtime.

criarTuplaEstadoRxé adequado para casos em que o nome não é previamente definido, como o id do workspace recebido do servidor, o nome da aba selecionada pelo usuário ou parâmetros de rota. A mesma chave de runtime reutiliza a mesma store, enquanto chaves diferentes usam stores diferentes.

tsx
function RuntimeKeySample() {
	const [setActiveTab, , useActiveTab] = createRxStateTuple(
		"profile",
		"docsRuntimeActiveTab",
		{ storage: "sessionstorage" },
	);
	const activeTab = useActiveTab();
	const [setDraft, , useDraft] = createRxStateTuple(
		{ title: "", content: "" },
		`docs-tab-draft:${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((tab) => (
						<Button
							key={tab}
							variant={
								activeTab === tab ? "contained" : "outlined"
							}
							onClick={() => setActiveTab(tab)}
						>
							{tab}
						</Button>
					))}
				</Stack>
				<TextField
					label={`Draft for ${activeTab}`}
					value={draft.content}
					onChange={(event) =>
						setDraft((prev) => ({
							...prev,
							content: event.target.value,
						}))
					}
					fullWidth
				/>
			</Stack>
		</Paper>
	);
}
© 2026 Byeolnaerim. Todos os direitos reservados.IntroduçãoPolítica de Privacidade