CI GitHub release (latest by date) Wally release (latest)
BasicState is a really simple key-value based state management solution. It makes use of BindableEvents to allow your project to watch for changes in state, and provides a simple but comprehensive API for communication with your state objects. Think Rodux, but easier!
You can use git submodules to clone this repo into your project's packages directory:
$ git submodule add https://github.com/csqrl/BasicState packages/BasicState
Once added, simply sync into Studio using the Rojo plugin.
Download/clone this repo on to your device, and copy the /src directory into your packages directory.
Add BasicState to your wally.toml and run wally install
[package] name = "user/repo" description = "My awesome Roblox project" version = "1.0.0" license = "MIT" authors = ["You (https://github.com/you)"] registry = "https://github.com/UpliftGames/wally-index" realm = "shared" [dependencies] BasicState = "csqrl/BasicState@^0.2.6"
$ wally install
Roblox-TS (unofficial)
While this package doesn't officially support TypeScript, bindings are available under the @rbxts/basicstate package, which can be installed using npm or yarn.
$ npm i @rbxts/basicstate $ yarn add @rbxts/basicstate $ pnpm add @rbxts/basicstate
TypeScript bindings are provided by @tech0tron. Please file any issues for the npm package over on their repo.
Grab a copy from the Roblox Library (Toolbox), or download the latest .rbxm/.rbxmx file from the releases page and drop it into Studio.
Here's a quick example of how BasicState can be used:
local BasicState = require(path.to.BasicState) local State = BasicState.new({ Hello = "World" }) State:GetChangedSignal("Hello"):Connect(function(NewValue, OldValue) print(string.format("Hello, %s; goodbye %s!", NewValue, OldValue)) end) State:SetState({ Hello = "Roblox" }) --[[ Triggers the RBXScriptConnection above and prints "Hello, Roblox; goodbye World!" --]]
Usage with Roact:
-- Store.lua local BasicState = require(path.to.BasicState) local Store = BasicState.new({ Hello = "World" }) return Store
-- MyComponent.lua local Roact = require(path.to.Roact) local MyComponent = Roact.Component:extend("MyComponent") local Store = require(script.Parent.Parent.Store) function MyComponent:render() return Roact.createElement("TextButton", { Text = string.format("Hello, %s!", self.state.Hello), --> Displays "Hello, World!" [Roact.Event.MouseButton1Click] = function() Store:SetState({ Hello = "Roblox" }) --> Will re-render and display "Hello, Roblox!" end }) end -- Wrap the component with the BasicState store return Store:Roact(MyComponent)
Please refer to the documentation site for a full overview of the exported API and further examples on how to use this module.