Need help with godux?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

luisvinicius167
224 Stars 16 Forks MIT License 36 Commits 4 Opened issues

Description

State Management for Go Backend application inspired in Redux.

Services available

!
?

Need anything else?

Contributors list

# 87,747
HTML
React
Redux
custome...
18 commits
# 56,479
golang
curl
bandwid...
Babel
3 commits
# 246,744
React
aria
a11y
ESLint
1 commit
# 3,203
imagema...
sass-fr...
splash
pipelin...
1 commit
# 40,325
Go
Redis
moby
Git
1 commit
# 159,170
Go
html-pa...
jQuery
Redux
1 commit

godux

Join the chat at https://gitter.im/luisvinicius167/godux Go Report Card

State Management for Go Backend applications inspired by Redux.

Godux

╔═════════╗       ╔══════════╗       ╔═══════════╗       ╔═════════════════╗
║ Action  ║──────>║ Reducer  ║ ────> ║   Store   ║ ────> ║   Application   ║
╚═════════╝       ╚══════════╝       ╚═══════════╝       ╚═════════════════╝
     ^                                                            │
     └────────────────────────────────────────────────────────────┘

Install

  • Go:
    go get github.com/luisvinicius167/godux

Data Flow

godux gives go unidirectional data flow:

  • The Action returns a small map with specific directions that are dispatched to a Reducer.
  • The Reducer is a pure function (pure functions don't change original arguments) if relevant to it returns a new Value.
  • The Value becomes the new State of the Store.

Principles:

  • Global application state is held in the Store, as a single map.
  • State is ready-only (only change it only by replacing it with the Reducer).
  • Changes are made with pure functions - Actions/Reducers that do not change the actual object but make a changed copy.

Store:

A Store is basically a container that holds your application state.

    store := godux.NewStore()
    store.Setstate("count", 1)
    store.Setstate("Title", "I like godux!")

Action

Actions are just pure functions which pass on their inputs when they're dispatched. Actions are stored on the

godux
map as
godux.Action
.
    increment := func(number int) godux.Action {
        return godux.Action{
            Type:  "INCREMENT",
            Value: number,
        }
    }

Reducers

As in Redux:

"Actions describe the fact that something happened, but don’t specify how the application’s state changes in response. This is the job of a reducer".

Reducers are pure functions that take in actions and the state of the store as inputs and leave them all as they came in (aka. pure)-- especially the original state of the store must not be modified (it's accessed by

store.GetState
)).
    // reducer function
    reducer := func(action godux.Action) interface{} {
        switch action.Type {
        case "INCREMENT":
            return store.GetState("count").(int) + action.Value.(int)
        case "DECREMENT":
            return action.Value.(int) - store.GetState("count").(int)
        default:
            return store.GetAllState()
        }
    }
    // Add your reducer function to return new values basend on your state
    store.Reducer(reducer)

Dispatch

Dispatching an action is very easy.

go
    // Receive new value
    newCount := store.Dispatch(increment(1)) // return 2

API Reference

  • Store:

    • godux.newStore()
      : Create a single store with the state of your application (should only be used once).
    • godux.SetState(name string, value interface{})
      : Sets the state of the store.
    • godux.GetState(name string)
      : Return a state's value.
    • godux.GetAllState()
      : Return the whole state as a map.
  • Reducer:
    • store.Reducer(func(action godux.Action))
      : Adding a reducer function to your Store.
  • Dispatch:
    • store.Dispatch(action godux.Action)
      : Dispatching an action to your Reducer.
  • Action:

    • godux.Action( Type string, Value interface{})
      : Adding an easily available Action.

License

MIT License.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.