React Examples
Global Counter
Section titled “Global Counter”import type * as React from 'react';import { createState } from 'synstate-react-hooks';
// Create global stateexport const [useCounterState, , { updateState, resetState }] = createState(0);
const increment = (): void => { updateState((n) => n + 1);};
// Component 1const Counter = (): React.JSX.Element => { const count = useCounterState();
return ( <div> <p>{`Count: ${count}`}</p> <button onClick={increment}>{'Increment'}</button> </div> );};
// Component 2const ResetButton = (): React.JSX.Element => ( <button onClick={resetState}>{'Reset'}</button>);Todo List with Reducer
Section titled “Todo List with Reducer”import * as React from 'react';import { createReducer } from 'synstate-react-hooks';
type Todo = Readonly<{ id: number; text: string; done: boolean;}>;
type Action = Readonly< | { type: 'add'; text: string } | { type: 'toggle'; id: number } | { type: 'remove'; id: number }>;
const initialTodos: readonly Todo[] = [] as const;
const reducer = (todos: readonly Todo[], action: Action): readonly Todo[] => { switch (action.type) { case 'add': return [ ...todos, { id: Date.now(), text: action.text, done: false, }, ];
case 'toggle': return todos.map((t) => t.id === action.id ? { ...t, done: !t.done } : t, );
case 'remove': return todos.filter((t) => t.id !== action.id); }};
const [useTodoState, dispatch] = createReducer<readonly Todo[], Action>( reducer, initialTodos,);
const addTodo = (): void => { dispatch({ type: 'add', text: 'New Todo', });};
const TodoList = (): React.JSX.Element => { const todos = useTodoState();
const todosWithHandler = React.useMemo( () => todos.map((todo) => ({ ...todo, onToggle: () => { dispatch({ type: 'toggle', id: todo.id, }); }, onRemove: () => { dispatch({ type: 'remove', id: todo.id, }); }, })), [todos], );
return ( <div> {todosWithHandler.map((todo) => ( <div key={todo.id}> <input checked={todo.done} type={'checkbox'} onChange={todo.onToggle} /> <span>{todo.text}</span> <button onClick={todo.onRemove}>{'Remove'}</button> </div> ))} <button onClick={addTodo}>{'Add Todo'}</button> </div> );};Boolean State (Dark Mode)
Section titled “Boolean State (Dark Mode)”import * as React from 'react';import { createBooleanState } from 'synstate-react-hooks';
export const [useDarkModeState, { toggle: toggleDarkMode }] = createBooleanState(false);
const ThemeToggle = (): React.JSX.Element => { const isDark = useDarkModeState();
React.useEffect(() => { document.body.className = isDark ? 'dark' : 'light'; }, [isDark]);
return <button onClick={toggleDarkMode}>{isDark ? '🌙' : '☀️'}</button>;};Cross-Component Communication
Section titled “Cross-Component Communication”import * as React from 'react';import { createState } from 'synstate-react-hooks';
// Stateconst [useItemsState, _, { updateState, resetState: resetItemsState }] = createState<readonly string[]>([]);
// Setup event handlersconst addItem = (item: string): void => { updateState((items: readonly string[]) => [...items, item]);};
// Component 1: Add itemsconst ItemInput = (): React.JSX.Element => { const [input, setInput] = React.useState<string>('');
return ( <div> <input value={input} onChange={(e) => { setInput(e.target.value); }} /> <button onClick={() => { addItem(input);
setInput(''); }} > {'Add'} </button> </div> );};
// Component 2: Display itemsconst ItemList = (): React.JSX.Element => { const items = useItemsState();
return ( <div> <ul> {items.map((item, i) => ( <li key={i}>{item}</li> ))} </ul> <button onClick={resetItemsState}>{'Clear All'}</button> </div> );};