|
5 лет назад | |
---|---|---|
.github | 5 лет назад | |
dist | 5 лет назад | |
docs | 5 лет назад | |
examples | 5 лет назад | |
src | 5 лет назад | |
.gitignore | 5 лет назад | |
README.md | 5 лет назад | |
babel.config.js | 5 лет назад | |
package.json | 5 лет назад | |
yarn.lock | 5 лет назад |
A lightweight state management layer for Alpine.js
Many large frameworks have their own state management solutions. One thing these libraries have in common is a higher level of complexity and a wide range of API interactions. Since Alpine.js is designed to be a simpler and lighter alternative to larger frameworks such as Vue and React, shouldn't the state management solution be as simple, if not simpler, too?
Include the following <script>
tag in the <head>
of your document:
<script src="/path/to/spruce.js">
Important: This must be added before loading Alpine.js when using CDN links.
If you wish to include Spruce with your own bundle:
yarn add @ryangjchandler/spruce
Then add the following to your script:
import Spruce from '@ryangjchandler/spruce'
if (! window.Spruce) {
window.Spruce = Spruce
}
Spruce.start()
Since Alpine will try to use Spruce from the window
context, you must assign it to a window.Spruce
variable still.
Spruce exposes less than a handful of possible interaction points. There is an extremely simple "subscriptions" interaction which connects the roots from your Alpine component to the global store, then there is the "stores" interaction which allows you to define scopes of global state for use throughout your components.
If you are using the CDN build, you can interact with Spruce using the window.Spruce
variable:
<script>
Spruce.store('modals', {
open: 'login',
})
</script>
If you are importing Spruce into your own bundle, you can interact with it like any other variable:
import Spruce from '@ryangjchandler/spruce'
Spruce.store('modals', {
open: 'login'
})
window.Spruce = Spruce
To access the global state from your Alpine components, you can simply add the x-subscribe
directive to your root component.
<div x-data="{}" x-subscribe>
<span x-text="$store.application.name"></span>
</div>
This directive adds a new $store
magic variable to your component. This can be used to "get" and "set" data in your global store.
To define a scope of state, you can use the Spruce.store()
method:
Spruce.store('application', {
name: 'Amazing Alpine Application'
})
The first argument defines the top level property of the scope. The second argument defines the state for the scope, it could be an string, integer or object with nested properties.
To access the name
property, you can do the following inside of your component:
<div x-data="{}" x-subscribe>
<span x-text="$store.application.name"></span>
</div>
The <span>
will now have "Amazing Alpine Application" set as its innerText
.