Reflex
Reflex
Reflex is a simple state container inspired by Rodux and Silo, designed to be an all-in-one solution for managing and reacting to state in Roblox games.
You can use Reflex with Roact on the client with @rbxts/roact-reflex, or use it to manage your game's state on the server.
This package is available for Roblox TypeScript and Wally.
npm install @rbxts/reflex yarn add @rbxts/reflex pnpm add @rbxts/reflex
Take me to the documentation →
Where Rodux uses stores, reducers, and actions, Reflex revolves around actions and producers. Create a producer with an initial state and a set of actions, and you're ready to go.
import { createProducer } from "@rbxts/reflex"; interface State { count: number; } const initialState: State = { count: 0, }; const producer = createProducer(initialState, { increment: (state) => ({ ...state, count: state.count + 1 }), reset: (state) => ({ ...state, count: 0 }), });
Reflex was designed to make managing your state simple and straightforward. Dispatch actions by calling the action directly, and read & subscribe to state with selectors.
const selectCount = (state: State) => state.count; producer.subscribe(selectCount, (count) => { print(`The count is now ${count}`); }); producer.increment(); // The count is now 1
The official bindings for Reflex and Roact Hooked are available under @rbxts/roact-reflex. Currently, there is no support for Luau projects.
See the source code on GitHub →
Roact Reflex allows you to use your root producer from Roact function components. It exposes a component that you can use to specify the producer for Hooks to use:
<ReflexProvider>enables Reflex Hooks for a producer.
Roact.mount( <ReflexProvider producer={producer}> <App /> </ReflexProvider>, playerGui, );
You can use Hooks to read and subscribe to state, or to dispatch actions. Use these Hooks in function components that are wrapped in a <ReflexProvider>.
Use these Hooks to access the root producer and dispatch actions:
useProducerlets components read and dispatch actions to the root producer.
function Button() { const { increment } = useProducer(); // ...
Use these Hooks to read and subscribe to state:
useSelectorlets a component subscribe to a Reflex producer.useSelectorCreatorlets you calluseSelectorwith a selector factory.
function Counter() { const count = useSelector((state) => state.count); // ...
Reflex is licensed under the MIT License.