This guide will help you quickly set up and use eventsync for global state management in your React app.
First, initialize your global state at the root of your app (e.g., in index.tsx
or App.tsx
).
import { initGlobalState } from 'eventsync';
interface Store {
user: {
name: string;
email: string;
};
counter: number;
}
initGlobalState<Store>({
counter: 0,
user: {
email: '',
name: ''
}
});
import React from 'react';
import { useGlobalState } from 'eventsync';
const Counter = () => {
const [{ counter }, { setCounter }] = useGlobalState(["counter"]);
const handleIncrement = () => setCounter(counter + 1);
const handleDecrement = () => setCounter(counter - 1);
return (
<div style=>
<button onClick={handleDecrement}>-</button>
<span style=>{counter}</span>
<button onClick={handleIncrement}>+</button>
</div>
);
};
export default Counter;
import React from 'react';
import { useGlobalState } from 'eventsync';
const UserForm = () => {
const [user, setUser] = useGlobalState<{ name: string; email: string }>('user');
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
setUser({ ...user, [name]: value });
};
return (
<form style=>
<div>
<label>Name: </label>
<input name="name" value={user.name} onChange={handleChange} />
</div>
<div>
<label>Email: </label>
<input name="email" value={user.email} onChange={handleChange} />
</div>
<button type="submit">Update User</button>
</form>
);
};
export default UserForm;
import React from 'react';
import { useGlobalState } from 'eventsync';
const UserName = () => {
const [username] = useGlobalState<string>('user.name');
return (
<div style=>
User Name: {username}
</div>
);
};
export default UserName;
import './App.css';
import { initGlobalState } from 'eventsync';
import Counter from './Counter';
import UserForm from './UserForm';
import UserName from './UserName';
// ...initGlobalState as above...
function App() {
return (
<div className="App">
<header className="App-header">
<p>hello</p>
<Counter />
<UserForm />
<UserName />
</header>
</div>
);
}
export default App;
One of the core benefits of eventsync is precise control over React component rerenders:
useGlobalState(["counter"])
in a component, it will only rerender when counter
changes, not when unrelated state (like user.name
) changes.'user'
) or a nested field (e.g., 'user.name'
).'user.name'
, your component will only rerender when user.name
changes, not when user.email
or other state changes.const Counter = () => {
const [{ counter }, { setCounter }] = useGlobalState(["counter"]);
console.info("Counter rerendered");
// ...
}
const UserForm = () => {
const [user, setUser] = useGlobalState<{ name: string; email: string }>('user');
console.info("UserForm rerendered", { user });
// ...
}
const UserName = () => {
const [username] = useGlobalState<string>('user.name');
console.info("UserName rerendered", { username });
// ...
}
Try updating only the counter, or only the user name/email, and observe in your console which components rerender. This demonstrates the fine-grained update model of eventsync.
'user.name'
) or whole objects (e.g., 'user'
).For more details, see the main documentation or the project README.