Using Roact-Rodux
Create a Store with Rodux¶
Create your store as normal with Rodux:
local function reducer(state, action)
state = state or {
value = 0,
}
if action.type == "increment" then
return {
value = state.value + 1,
}
end
return state
end
local store = Rodux.Store.new(reducer)
Add a StoreProvider
¶
When you render your Roact application, wrap the top-level component in a RoactRodux.StoreProvider
:
local app = Roact.createElement(RoactRodux.StoreProvider, {
store = store,
}, {
Main = Roact.createElement(MyComponent),
})
This makes your Rodux store available for any components in your app. They'll access that store using the connect
function.
Connect with connect
¶
Use RoactRodux.connect
to retrieve values from the store and use them in your Roact component:
-- Write your component as if Rodux is not involved first.
-- This helps guide you to create a more focused interface.
local function MyComponent(props)
-- Values from Rodux can be accessed just like regular props
local value = props.value
local onClick = props.onClick
return Roact.createElement("ScreenGui", nil, {
Label = Roact.createElement("TextButton", {
-- ...and used in your components!
Text = "Current value: " .. value,
Size = UDim2.new(1, 0, 1, 0),
[Roact.Event.Activated] = onClick,
})
})
end
-- `connect` accepts two optional functions:
-- `mapStateToProps` accepts your store's state and returns props
-- `mapDispatchToProps` accepts a dispatch function and returns props
-- Both functions should return a table containing props that will be passed to
-- your component!
-- `connect` returns a function, so we call that function, passing in our
-- component, getting back a new component!
MyComponent = RoactRodux.connect(
function(state, props)
-- mapStateToProps is run every time the store's state updates.
-- It's also run whenever the component receives new props.
return {
value = state.value,
}
end,
function(dispatch)
-- mapDispatchToProps only runs once, so create functions here!
return {
onClick = function()
dispatch({
type = "increment",
})
end,
}
end
)(MyComponent)
Now, whenever the store updates, your connected components will receive updated data and re-render!
In many ways, Roact-Rodux works just like react-redux. The public API is almost identical and most of the best practices from that ecosystem work here as well.